一阱佛、熱修復(fù)背景
修復(fù)bug走常規(guī)發(fā)版流程,缺點(diǎn)有三:發(fā)版代價(jià)高戴而、用戶升級覆蓋速度慢凑术、bug修復(fù)不及時(shí)。而熱修復(fù)則能很好解決此問題:及時(shí)推送修復(fù)補(bǔ)丁所意,修復(fù)成功率高淮逊,代價(jià)相對小。
二扶踊、熱修復(fù)方案比較
綜合考慮兼容性泄鹏、修復(fù)覆蓋面、性能等幾個(gè)方面秧耗,目前Tinker是個(gè)比較好的選擇备籽。
wiki:https://github.com/Tencent/tinker/wiki
但是Tinker也有一些局限性:
由于原理與系統(tǒng)限制,Tinker有以下已知問題:
- Tinker不支持修改AndroidManifest.xml分井,Tinker不支持新增四大組件(1.9.0支持新增非export的Activity)车猬;
- 由于Google Play的開發(fā)者條款限制,不建議在GP渠道動(dòng)態(tài)更新代碼尺锚;
- 在Android N上珠闰,補(bǔ)丁對應(yīng)用啟動(dòng)時(shí)間有輕微的影響;
- 不支持部分三星android-21機(jī)型瘫辩,加載補(bǔ)丁時(shí)會(huì)主動(dòng)拋出"TinkerRuntimeException:checkDexInstall failed"伏嗜;
- 對于資源替換,不支持修改remoteView杭朱。例如transition動(dòng)畫阅仔,notification icon以及桌面圖標(biāo)吹散。
Tinker盡量只用來做bug修復(fù)補(bǔ)丁弧械,而非功能發(fā)版。因?yàn)楹铣砂罂彰瘢瑫?huì)影響到動(dòng)態(tài)加載插件時(shí)的性能刃唐。
三、Tinker1.9.14.7 集成
Tinker項(xiàng)目地址
https://github.com/Tencent/tinker
最新版本更新說明:
2020年5月17日
- Tinkerpatch 1.2.14.7發(fā)布
- 基于Tinker 1.9.14.7
- 徹底消除對 Android Support Library / AndroidX Library 的依賴
- 修復(fù)熱修后 SharedLibrary R 類中的資源 ID 與 AssetManager 中 Package ID 不一致導(dǎo)致的資源找不到問題
- 修復(fù)因魅族機(jī)器首次加載 dex 時(shí)不生成 oat 導(dǎo)致 patch 加載失敗的問題
- 嘗試修復(fù) APPLICATION_INFO_CHANGED 事件引起的 ClassLoader 檢查異常
- 修復(fù) OTA 之后主副進(jìn)程狀態(tài)不一致的問題界轩。
1.9.14.7 是當(dāng)前最新版本画饥,能覆蓋到Android Q版本。
Tinker集成:
demo地址:TinkerSdkDemo
項(xiàng)目描述:想run起來tinker源碼工程有點(diǎn)難度浊猾,我弄了個(gè)demo可以幫助debug1.9.14.7核心源碼抖甘,并且寫了個(gè)簡單的熱修復(fù)功能,方便debug整個(gè)修復(fù)過程葫慎,持續(xù)維護(hù)中衔彻。
demo熱修復(fù)使用說明:
- 執(zhí)行assembleRelease打出release包薇宠,同時(shí)bakApk會(huì)生成副本文件
- 做app修復(fù),同時(shí)調(diào)整tinker.gradle配置:
將bakApk會(huì)生成副本文件配置到如下path變量中
ext {
tinkerEnable = true //tinker功能開關(guān)
tinkerID = "1.0"
tinkerOldApkPath = "${bakPath}/app-release-0806-14-18-36.apk"
tinkerApplyMappingPath = "${bakPath}/"
tinkerApplyResourcePath = "${bakPath}/app-release-0806-14-18-36-R.txt"
tinkerBuildFlavorDirectory = "${bakPath}/"
}
- 執(zhí)行tinkerPatchRelease生成patch差分包艰额。
- 安裝首次assembleRelease在bakApk中生成的apk澄港,同時(shí)啟動(dòng)app,這樣會(huì)創(chuàng)建 /sdcard/Android/data/com.stan.tinkersdkdemo/cache/tpatch目錄柄沮。
- 將生成的patch_singed.apk push到上面的目錄中回梧。
- 點(diǎn)擊加載patch。
- 重新啟動(dòng)app修復(fù)生效祖搓。
中途遇到的坑大部分在issue中能找到解決辦法狱意,其余的低級錯(cuò)誤度娘之即可:
https://github.com/Tencent/tinker/issues
這里有一點(diǎn)需要注意一下:
錯(cuò)誤: 無法訪問Keep
找不到com.tencent.tinker.anno.Keep的類文件
用:compileOnly("com.tencent.tinker:tinker-android-anno-support:${TINKER_VERSION}”)
替換:compileOnly("com.tencent.tinker:tinker-android-anno:${TINKER_VERSION}")
tinker官方文檔太老了,這里并沒有更新拯欧。
四髓涯、app熱修復(fù)正式商業(yè)化項(xiàng)目流程
流程:
- 首先通過腳本或者gradle插件方式生成diff patch。
- diff patch上傳服務(wù)端哈扮。
- diff patch由服務(wù)端下發(fā)纬纪,然后與當(dāng)前基準(zhǔn)包進(jìn)行合成操作。
- 下次重啟修復(fù)生效滑肉。
各公司下發(fā)patch邏輯略有差異包各,但是也大同小異,參考我做的這版方案: