日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch

發(fā)布時間:2024/8/23 Android 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

簡介: 關(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 具有以下特征:

  • 支持范圍上:是基于類級別的替換,所以只支持 Java 模塊的 patch,不支持非 Java 模塊的 patch,比如 so 模塊;
  • 兼容性上:由于是代理了系統(tǒng)的 ClassLoader,使用的黑科技較少,所以整體方案兼容性較好;
  • 生效時效性上:只能在下載 patch 后重啟后才能生效,不支持實時生效;
  • 成功率上:由于下載是使用的獨立進程,減少了啟動階段主進程閃退對 patch 下載的影響,提升了下載的成功比例。
  • ?

    ?

    操作說明

    以下是關(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。