【原】Android熱更新開源項目Tinker源碼解析系列之三:so熱更新

来源:http://www.cnblogs.com/yyangblog/archive/2017/01/07/6252855.html
-Advertisement-
Play Games

本系列將從以下三個方面對Tinker進行源碼解析: 轉載請標明本文來源:http://www.cnblogs.com/yyangblog/p/6252855.html更多內容歡迎star作者的github:https://github.com/LaurenceYang/article如果發現本文有什 ...


本系列將從以下三個方面對Tinker進行源碼解析:

  1. Android熱更新開源項目Tinker源碼解析系列之一:Dex熱更新
  2. Android熱更新開源項目Tinker源碼解析系列之二:資源文件熱更新
  3. Android熱更新開源項目Tinker源碼解析系類之三:so文件熱更新

 

轉載請標明本文來源:http://www.cnblogs.com/yyangblog/p/6252855.html
更多內容歡迎star作者的github:https://github.com/LaurenceYang/article
如果發現本文有什麼問題和任何建議,也隨時歡迎交流~

首先講下Android裡面關於so的載入的兩種方式:

方式一:System.loadLibrary, 這種方式傳入的是so的名字,會直接從系統的目錄去載入so文件,系統的路徑包括/data/data/${package_name}/lib、/system/lib、/vender/lib等這類路徑。

方式二:System.load, 這種方式傳入的是so的絕對路徑,直接從這個路徑載入so文件。

 

Tinker的so文件熱更新的原理就是通過方式二,直接載入新的so實現的。

相對於Dex和資源的更新,是不是簡單很多。

 

so文件的熱更新流程同dex、資源文件一樣,包含補丁生成,補丁合成,補丁載入三個部分。

 

生成補丁時比較新舊so文件使用BSdiff演算法生成補丁包,

然後在下發補丁成功後根據BSpatch演算法將補丁包和舊的library合成新的library,

並將更新後的Library庫文件保存在tinker下麵的目錄下,

這個目錄就是/data/data/${package_name}/tinker/lib。

然後在載入的時候直接通過System.load載入該目錄下麵的so文件。

具體的源碼不再做闡述。

 

需要註意的是,Tinker中so的熱更新對用戶並不是無感的,需要用戶自發的去載入自己需要的庫文件,下麵是tinker的wiki里關於這方面的描述:

但是Tinker並沒有直接將補丁的lib路徑添加到DexPathList中,理論上這樣可以做到程式完全沒有感知的對Library文件作補丁。這裡主要是因為在多abi的情況下,某些機器獲取的並不准確。

所以想要載入最新的庫,需要自己使用TinkerInstaller.load*Library去載入庫文件,它會自動嘗試先去Tinker中的庫文件載入,載入不成功會調用System.loadLibrary調用系統的庫文件。

1 //load lib/armeabi library
2 TinkerInstaller.loadArmLibrary(getApplicationContext(), "stlport_shared");
3 //load lib/armeabi-v7a library
4 TinkerInstaller.loadArmV7Library(getApplicationContext(), "stlport_shared");

 

另外,對於第三方庫文件的載入,Tinker無法干預其載入時機,但是只要在我們的代碼提前載入第三方的庫文件即可。

若想對第三方代碼的庫文件更新,可先使用TinkerInstaller.load*Library對第三方庫做提前的載入!

當前使用方式似乎並不能做到開發者透明,這是因為Tinker想儘量少的去hook系統框架減少相容性的問題。

 

到此,tinker的源碼解析系列到此結束。

本系列從dex,資源文件和so的補丁生成,補丁合成和補丁載入角度出發,做了一個簡要的流程分析。

因為自己水平有限,很多地方也沒有太過深入。

對tinker感興趣的同學可以到tinker的官方github去看更多的文檔。

也歡迎大家多多拍磚。

 

轉載請標明本文來源:http://www.cnblogs.com/yyangblog/p/6252855.html
更多內容歡迎star作者的github:https://github.com/LaurenceYang/article
如果發現本文有什麼問題和任何建議,也隨時歡迎交流~

 

 下一篇文章將對在實際使用tinker過程中所需要考慮的問題做一個闡述。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文將介紹一款基於jquery的二維碼生成插件qrcode,在頁面中調用該插件就能生成對應的二維碼。 1、首先在頁面中加入jquery庫文件和qrcode插件。 2、在頁面佈局中添加一個div 3、調用qrcode插件。 4、我們試驗的時候發現不能識別中文內容的二維碼,通過查找多方資料瞭解到,jqu ...
  • html css 第一種方法:.box{clear:box} 第二種方法:.box{overflow:hidden} 第三種方法:.box{overflow:auto} 第四種方法:.box:after{ content:""; height:0; visibility:hidden; displa ...
  • 一、Node.js本質上是js的運行環境。 二、可以解析js代碼(沒有瀏覽器安全級的限制); 提供系統級的API:1、文件的讀寫 2、進程的管理 3、網路通信 三、可以關註的四個網站: 1、https://nodejs.org/en/(官網) 2、https://www.npmjs.com/ 3、h ...
  • 1、背景圖片中部放大、縮小 ...
  • border-image-source 屬性設置邊框的圖片的路徑[none | <image>] border-image-slice 屬性圖片邊框向內偏移[ <number> | <percentage> ](1,4) ?fill border-image-width 屬性設置圖片邊框的寬度[ < ...
  • border-radius 屬性設置邊框的園角 可能的值:像素,百分比 擴展延伸 html代碼 css代碼 結果 css代碼 結果 css代碼 結果 css代碼 結果 css代碼 結果 css代碼 結果 css代碼 結果 ...
  • 函數本身就是一段JavaScript代碼,定義一次但可能被調用任意次。如果函數掛載在一個對象上,作為對象的一個屬性,通常這種函數被稱作對象的方法。用於初始化一個新創建的對象的函數被稱作構造函數。 相對於其他面向對象語言,在JavaScript中的函數是特殊的,函數即是對象。JavaScript可以把 ...
  • 該文為閱讀高級程式設計(第三本)p144-p164的理解與總結! 接受指導與批評。 對於我,我一直是使用字面量的方式創建對象,然而體繫上的創建對象的方法卻並不局限於此。 創建對象的方法 1 工廠模式: 定義工廠函數創建並返回包含特定屬性的對象, 2 構造函數模式: 先貼出代碼 2.1 new Per ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...