技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch
?
簡介: 關(guān)于 Android 熱修復方案——DexPatch 的介紹與使用說明
?
方案介紹
為了解決 Native 模塊上線后的問題,mPaaS 提供了熱修復功能,實現(xiàn)不發(fā)布客戶端 apk 場景下的熱修復。目前 Android 端熱修復主要包括 andfix 和 dexpatch,考慮到 andfix 的版本兼容性,目前主要推薦使用 DexPatch。
?
DexPatch 修復原理比較簡單,就是在啟動后通過 RPC 拉取當前需要下發(fā)的 jar 包地址,然后通過獨立進程去下載 jar 包文件,下載完成后保存。在二次啟動的時候 hook 系統(tǒng)的 classLoader,修改 DexPathList,在其數(shù)組的最前面加入一個有修改過的 class 的 dex 文件,使其攔截住數(shù)組后面的 dex 文件中同名的 class 的加載。
?
如下圖所示,classloader 就會優(yōu)先加載 Patch.dex 中的 Ding.class,而忽略 Classes.dex 中的 Ding.class,達到了替換的效果。 ?
?
基于這樣的原理,DexPatch 具有以下特征:
?
?
操作說明
以下是關(guān)于在 mPaaS 下使用 DexPatch 模塊的主要步驟以及問題排查思路,方便開發(fā)者日常開發(fā)。
1. 觸發(fā) patch 拉取
啟動階段調(diào)用 MPHotpatch.init(),主要觸發(fā) Patch 信息的 RPC 請求,如果命中發(fā)布 Patch 發(fā)布規(guī)則,RPC 會返回 Patch 的 jar 包下載地址,客戶端去觸發(fā)下載,下載后保存在客戶端私有目錄/data/user/0/包名/dexpatch/patch/下。
?
2. 代碼操作演示
以組件化模式接入為例,介紹下 Patch 發(fā)布的主要流程。
(1)代碼改動前
?
需要保存改動前的構(gòu)建產(chǎn)物,方便后續(xù)做 Patch 生成,地址在:build/intermediates/bundle/xxxx-raw.jar
?
(2)代碼改動后
?
重新編譯,保存構(gòu)建產(chǎn)物,產(chǎn)物地址:build/intermediates/bundle/xxxx-raw.jar
?
(3)生成白名單配置
主要用于熱修復包時用于指定修復的類,配置文件為 .txt 格式,該配置文件應(yīng)包含并按順序包含以下信息:
需要 Patch 的類。以 L 開頭,后跟以混淆后真實類名。如果多個類,每行只可寫一個。示例:Lxxx.xxx.clazzX設(shè)置 Patch 類型為 dexpatch。示例:PatchType: dexpatch
?
設(shè)置是否是靜態(tài) Bundle。默認為 false,如果是靜態(tài)鏈接的 Bundle,需要顯式設(shè)置為 true。示例:HostDex: true(*目前 mPaaS 客戶端的模塊一般都在靜態(tài)鏈接里,一般寫 true)
?
(4)查看簽名
生成 patch 需要用到項目的打包秘鑰,需要提前準備好,可以在打包腳步下找到對應(yīng)的配置
?
(5)生成 patch
① 通過 mPaaS 自帶的 IDE 工具,點擊熱修復,進入修復頁面。
?
② 按照頁面提示,填入之前準備的修復前和修復后的 jar 包地址,還有白名單配置文件,勾選 dexPatch,進入到下一步
?
③ 下一步主要選擇打包的配置文件,最近點擊完成生成 patch 文件
?
(6)生成 patch 產(chǎn)物
生成 patch 產(chǎn)物如下:
?
查看產(chǎn)物,可以使用 dex2jar 工具反解 diff.dex 文件,用 jd-gui 文件查看反解產(chǎn)物是否符合預期
?
反解后可以看到修改的模塊:
?
(7)上傳發(fā)布
① 選擇上一步的產(chǎn)物 jar 包進行上傳
?
② 上傳后可以通過白名單進行發(fā)布,驗證 patch 的穩(wěn)定性
?
(8)驗證下載
白名單發(fā)布后,啟動客戶端,搜索關(guān)鍵字:DynamicRelease,可以看到在 tool 進程有觸發(fā)下載的日志打出。
這里需要說明的是,這里觸發(fā) patch 的下載是在 tool 進程,不在主進程的主要原因是怕由于主進程由于啟動導致重復閃退,導致 patch 不能下載成功,單獨在 tool 進程實現(xiàn)下載,盡量提高 patch 的下載成功比例。
?
然后去下載目錄查看,是否下載保存成功,下載目錄在:/data/user/0/包名/dexpatch/patch/20201023110012@20201023110012.jar
?
(9)殺進程啟動
確認下載保存成功后,殺掉 App,重啟查看是否生效,重啟可以搜索關(guān)鍵字:DexPatchManager,查看 patch 生效的日志,日志會打印當前是否存在 patch 以及 patch 是否加載的日志。
?
同時我們也可以就實際業(yè)務(wù)場景進行驗證,查看是否生效。
?
?
常見問題
1. aar 模式集成后 patch 沒生效
aar 模式集成的時候,需要繼承框架的 QuinoxlessApplication,指定 Application 為框架的實現(xiàn)類才能實現(xiàn) dexpatch 的加載。QuinoxlessApplication 內(nèi)主要封裝了 dexpatch 模塊的初始化和加載。
?
2. 使用加固后不生效
需要使用加固前的 apk 生成 patch,不能用加固后的包生成 patch。然后還需要驗證在不同加固廠商下的兼容表現(xiàn)。
?
3. 使用熱修復后,和 RPC 有關(guān)的調(diào)用發(fā)生 apache http 相關(guān)的 crash。
請使用 Android 官網(wǎng)上的方式引入 apache http client,禁止使用導入 jar 包或者 gradle implementation/compile 的方式導入 http client。否則會引起 classloader 加載類混亂。
?
建議方式:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>* 如有更多疑問,歡迎釘釘搜索“32930171”加入「mPaaS 技術(shù)交流群」
?
E · N · D
?
?
作者:榮陽
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載
?
總結(jié)
以上是生活随笔為你收集整理的技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dubbo 3.0 前瞻系列 | 202
- 下一篇: 从Android到Java:如何从不同视