Android熱更新開源專案Tinker原始碼解析系列之三:so熱更新
本系列將從以下三個方面對Tinker進行原始碼解析:
- Android熱更新開源專案Tinker原始碼解析系列之一:Dex熱更新
- Android熱更新開源專案Tinker原始碼解析系列之二:資原始檔熱更新
- 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過程中所需要考慮的問題做一個闡述。
相關文章
- Android 熱更新 Tinker 整合配置【詳細】Android
- 【Android】使用Bugly快速接入Tinker熱更新功能Android
- 【Android進階】1小時學會熱更新--TinkerAndroid
- Android熱更新方案之阿里AndFix 原理以及原始碼解析Android阿里原始碼
- Android tinker熱修復——實戰接入專案Android
- Unity3D熱更新之LuaFramework篇[09]--資源熱更新與程式碼熱更新的具體實現Unity3DFramework
- Android 熱修復 Tinker 接入及原始碼淺析Android原始碼
- Android 熱修復 Tinker 原始碼分析之DexDiff / DexPatchAndroid原始碼
- Android 熱修復 Tinker接入及原始碼淺析Android原始碼
- Android 開源專案原始碼解析 -->PhotoView 原始碼解析(七)Android原始碼View
- Unity3D熱更新全書-何謂熱更新,為何熱更新,如何熱更新Unity3D
- Android 熱修復 Tinker Gradle Plugin 解析AndroidGradlePlugin
- Android 開源專案原始碼解析 -->Volley 原始碼解析(十五)Android原始碼
- Android 開源專案原始碼解析 -->Dagger 原始碼解析(十三)Android原始碼
- 熱更新配置檔案
- Android 開源專案原始碼解析 -->CircularFloatingActionMenu 原始碼解析(八)Android原始碼
- Android熱更新實現方式Android
- Android熱更新實現原理Android
- Flutter Android 端熱修復(熱更新)實踐FlutterAndroid
- Android 增量更新完全解析 是增量不是熱修復Android
- Android 熱更新實現原理及程式碼分析Android
- Android端Flutter熱更新,相容FlutterBoostAndroidFlutter
- Vuex之熱更新Vue
- Unity XLua熱更新Unity
- Web前端熱更新Web前端
- Android 開源專案原始碼解析 -->Android Universal Image Loader 原始碼分析(十四)Android原始碼
- Android開源專案以及開源庫集合(持續更新中)Android
- Android tinker熱修復——從執行demo開始Android
- 少年,想線上熱更新程式碼不?
- APP中RN頁面熱更新流程-ReactNative原始碼分析APPReact原始碼
- uni-app熱更新APP
- Flutter 應用熱更新Flutter
- xLua熱更新外掛
- React Native 熱更新React Native
- Webpack 熱更新機制Web
- 遊戲熱更新雜談遊戲
- Hyperf - 熱更新Watcher
- 【詳細】Android熱更新Bugly整合配置Android