Android 热修复之DexPatch 介绍
1. 方案介紹
為了解決Native模塊上線后的問題,mPaas[1] 提供了熱修復功能,實現不發布客戶端apk場景下的熱修復。目前Android端熱修復主要包括andfix和dexpatch,考慮到andfix的版本兼容性,目前主要推薦使用DexPatch。
DexPatch修復原理比較簡單,就是在啟動后通過RPC拉取當前需要下發的jar包地址,然后通過獨立進程去下載jar包文件,下載完成后保存。在二次啟動的時候hook系統的classLoader,修改DexPathList, 在其數組的最前面加入一個有修改過的class的dex文件,使其攔截住數組后面的dex文件中同名的class的加載。如下圖所示,classloader就會優先加載Patch.dex中的Ding.class,而忽略Classes.dex中的Ding.class, 達到了替換的效果。
基于這樣的原理,DexPatch具有以下特征:
1.支持范圍:是基于類級別的替換,所以只支持Java模塊的patch,不支持非Java模塊的patch,比如so模塊。
2.兼容性:由于代理了系統的ClassLoader,使用的黑科技較少,所以整體方案兼容性較好。
3.生效時效性:只能在下載patch重啟后才能生效,不支持實時生效。
4.成功率:由于使用獨立進程下載,減少了啟動階段主進程閃退對patch下載的影響,提升了下載的成功比例。
2. 使用介紹
簡單介紹在mPaas使用DexPatch模塊的主要步驟以及問題排查思路,方便開發者日常使用。
1. 觸發patch拉取
啟動階段調用MPHotpatch.init(), 主要觸發Patch信息的RPC請求,如果命中發布Patch發布規則,RPC會返回Patch的jar包下載地址,客戶端去觸發下載,下載后保存在客戶端私有目錄/data/user/0/包名/dexpatch/patch/ 下。
2. 代碼操作演示
以組件化模式接入為例,簡單介紹Patch發布的主要流程。
1. 代碼改動前
2. 代碼改動后
重新編譯,保存構建產物,產物地址:build/intermediates/bundle/xxxx-raw.jar
3. 生成白名單配置
主要用于熱修復包時用于指定修復的類,配置文件為 .txt 格式,該配置文件應按順序包含以下信息:
需要 Patch 的類。以 L 開頭,后綴混淆后真實類名。如果多個類,每行只可寫一個。 示例:Lxxx.xxx.clazzX
設置 Patch 類型為 dexpatch, 示例:PatchType: dexpatch
設置是否為靜態Bundle。默認為 false,如果是靜態鏈接的Bundle,需要設置為true。 示例:HostDex: true。目前mPaas客戶端的模塊一般都在靜態鏈接里,一般寫true。
4. 查看簽名
生成patch需要用到項目的打包秘鑰,需要提前準備好,可以在打包腳步下找到對應的配置。
5. 生成patch
① 通過mPaas自帶的ide工具,點擊熱修復,進入修復頁面。
② 按照頁面提示,填入修復前和修復后的jar包地址,及白名單配置文件,勾選dexPatch,單擊next。
③ 選擇打包的配置文件,點擊完成生成patch文件。
6. 生成patch產物
生成patch產物如下:
7. 上傳發布
① 選擇上一步的產物jar包進行上傳
② 上傳后可以通過白名單進行發布,驗證patch的穩定性。
8. 驗證下載
白名單發布后,啟動客戶端,搜索關鍵字:DynamicRelease,可以看到在tool進程有觸發下載的日志打出。需要說明的是,觸發patch的下載是在tool進程,不在主進程的主要原因是怕主進程因啟動重復閃退,導致patch下載失敗,單獨在tool進程下載,提高patch的下載成功比例。
查看下載目錄,確認是否下載保存成功,下載目錄在:
/data/user/0/包名/dexpatch/patch/20201023110012@20201023110012.jar
9. 關掉進程重啟
確認下載保存成功后,關掉App,重啟查看是否生效,重啟可以搜索關鍵字:DexPatchManager,查看patch生效的日志,日志會打印當前是否存在patch以及patch是否加載的日志。
同時我們也可以就實際業務場景進行驗證,查看是否生效。
3. 常見問題
aar模式集成時,需要繼承框架的QuinoxlessApplication,指定Application為框架的實現類才能實現dexpatch的加載。QuinoxlessApplication內主要封裝了dexpatch模塊的初始化和加載。
需要使用加固前的apk生成patch,不能使用加固后的包生成patch。 然后仍需驗證在不同加固廠商下的兼容表現。
請使用 Android 官網上的方式引入 apache http client,禁止使用導入 jar 包或者 gradle implementation/compile 的方式導入 http client。否則會引起 classloader 加載類混亂。
建議方式:
參考文檔
[1] mPaaS平臺:https://www.aliyun.com/product/mobilepaas/mpaas
我們是阿里云智能全球技術服務-SRE團隊,我們致力成為一個以技術為基礎、面向服務、保障業務系統高可用的工程師團隊;提供專業、體系化的SRE服務,幫助廣大客戶更好地使用云、基于云構建更加穩定可靠的業務系統,提升業務穩定性。我們期望能夠分享更多幫助企業客戶上云、用好云,讓客戶云上業務運行更加穩定可靠的技術,您可用釘釘掃描下方二維碼,加入阿里云SRE技術學院釘釘圈子,和更多云上人交流關于云平臺的那些事。
原文鏈接:https://developer.aliyun.com/article/781272?
版權聲明:本文內容由阿里云實名注冊用戶自發貢獻,版權歸原作者所有,阿里云開發者社區不擁有其著作權,亦不承擔相應法律責任。具體規則請查看《阿里云開發者社區用戶服務協議》和《阿里云開發者社區知識產權保護指引》。如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將立刻刪除涉嫌侵權內容。總結
以上是生活随笔為你收集整理的Android 热修复之DexPatch 介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用 AutoPilot 对作业自动
- 下一篇: Android Native crash