听说”双11”是这么解决线上bug的
聽說”雙11”是這么解決線上bug的
??????????????????????????? --Android線上熱修復的使用與原理
預備知識和開發環境
Android NDK編程
AndFix淺析
Android線上熱修復的原理大同小異。這里僅僅針對眼下最火的框架AndFix進行解說。主要從AndFix的使用、原理以及優缺點三個方面進行闡述。
使用方式
介紹
AndFix是一個AndroidApp的在線熱補丁框架。
使用此框架。我們可以在不反復發版的情況下,在線改動App中的Bug。AndFix就是 “AndroidHot-Fix”的縮寫。
就眼下來說,AndFix支持Android2.3到6.0版本號,而且支持arm與X86系統架構的設備。完美支持Dalvik與ART的Runtime。眼下已經應用到支付寶上。是比較成熟的hot-fix框架。
AndFix 的補丁文件是以.apatch 結尾的文件。(來源:網絡)
接入流程圖:
接入步驟
1) Maven或Gradle下載aar或直接引入源代碼
? ?
Maven: <dependency><groupId>com.alipay.euler</groupId><artifactId>andfix</artifactId><version>0.3.1</version><type>aar</type> </dependency> Gradle: dependencies {compile 'com.alipay.euler:andfix:0.3.1@aar' }2) 初始化PatchManager
patchManager = new PatchManager(context); patchManager.init(appversion);//current version3) 載入補丁包
patchManager.loadPatch();4)存在新補丁包 patchManager.addPatch(path);//path of the patch file that was downloaded
5)刪除全部補丁包 patchManager.removeAllPatch();
制作apatch文件
?1)? 工具 :apkpatch(Github下載)
?2)? 使用方式
? 打補丁命令:
??
usage: apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>-a,--alias <alias> keystore entry alias.-e,--epassword <***> keystore entry password.-f,--from <loc> new Apk file path.-k,--keystore <loc> keystore path.-n,--name <name> patch name.-o,--out <dir> output dir.-p,--kpassword <***> keystore password.-t,--to <loc> old Apk file path. ? 合并補丁命令: usage: apkpatch -m <apatch_path...> -o <output> -k <keystore> -p <***> -a <alias> -e <***>-a,--alias <alias> keystore entry alias.-e,--epassword <***> keystore entry password.-k,--keystore <loc> keystore path.-m,--merge <loc...> path of .apatch files.-n,--name <name> patch name.-o,--out <dir> output dir.-p,--kpassword <***> keystore password.? 舉例:
?
? ?兩個apk文件,一個有問題,一個把問題攻克了,如圖:
??
? ? 打開cmd,cd到apktool所在路徑。運行例如以下命令:
? 回車,在C:\Users\xiayong\Desktop\HotFixTest\result文件夾下生成例如以下文件
??
? ?當中。out.apatch便是我們須要的補丁文件。
代碼混淆
PS:官方建議使用-applymapping 來打混淆包。保證兩次混淆一致。 -keep class * extends java.lang.annotation.Annotation -keepclasseswithmembernames class * {native <methods>; }疑問
1、.apatch 文件下載下來以后的存儲位置應該在哪里?
2、.apatch文件刪除了還有效果嗎?
3、hot-fix的安全性怎么保證?
帶著疑問,請看原理分析~
原理剖析
原理圖:
一句話說明:找到問題安裝包中出錯的Method。用.apatch文件里修復過的Method進行替換。
舉個栗子:
演示代碼來源:https://github.com/THEONE10211024/HotFixDemo
.apatch文件:
.apatch文件是hot-fix的關鍵,那么.apatch文件又是一個什么東西呢?以下,我們來重點分析一下.apatch文件。
1.? apatch文件實際上是一個壓縮文件
解壓apatch文件,一探到底:包括了一個dex文件和一個目錄。先看看目錄里都有什么文件
重點是PATCH.MF文件。用記事本打開。
AndFix首先會讀取這個文件中面的東西。
保存在Patch類的一個對象里,備用。
再看看classes.dex文件。
用反編譯工具反編譯后,我們會看到類似例如以下的文件:
分析好了apatch文件,接下來我們一步步看AndFix是怎么修復的。
把AndFix接入自己的APP僅僅須要四行代碼:
mPatchManager = new PatchManager(this); mPatchManager.init("1.0"); mPatchManager.loadPatch(); mPatchManager.addPatch(patchFileString);1、mPatchManager = new PatchManager(this);
初始化一些以后會使用的對象。
(詳見代碼)
2、mPatchManager.init("1.0");
首先推斷傳入的版本號號“1.0”是否是已有補丁相應的版本號號。
不是,說明APP版本號已經升級。須要把老版本號的clean掉。然后初始化補丁包:遍歷APP的私有文件夾(/data/data/xxx.xxx.xxx/file/apatch)下全部文件,找到以“apatch”為后綴的文件。解析文件->讀取文件必要信息(主要是PATCH.MF中)->存放在mPatchs(類型:SortedSet<Patch>)中。
3. mPatchManager.loadPatch();
遍歷mPatchs,針對每一個補丁文件:安全校驗->解析dex->載入類->找到含有MethodReplace注解的方法->hook替換。
核心的hook替換是調用C++實現的:
Dalvik虛擬機:
Art虛擬機:
Art虛擬的原理與Dalvik不一樣,Art主要是改動“ArtMethod”的屬性,讓虛擬機“誤覺得”改動后的方法即是原來的方法。以5.0為例:
優勢與亮點
1.??????提煉精華,簡潔。輕便。適配廣。完美的支持了Android 2.3到6.0系統,以及x86框架,機型覆蓋率廣。提供依據兩個apk生成patch的工具。因而使用者僅僅需正向編程。通過工具生成patch文件。下發給client就可以,編程效率高。是完好的、高可用的熱修復方案。
2.??????與業界其它方案對照:QQ空間、大眾點評等採用的是動態載入dex方式。
“后者純java實現。但須要hack類的優化流程。將打CLASS_ISPREVERIFIED標簽的類,去除此標簽。以解決類與類引用不在一個dex中的異常問題。這會放棄dex optimize對啟動執行速度的優化。原則上,這對于方法數沒有大到須要multidex的應用,損失更明顯。而前者不觸犯原有的優化流程,僅僅點殺須要hook的方法,更為純粹、有效。
”
不足與缺陷
1.??????只支持android 方法的替換,不支持資源文件、xml的修復
2.??????慎用android:onClick="showToast"形式的事件注冊。
3.??????有人反應和“EventBus”不兼容。
(自己測試良好)
4.??????有人反應fix之后部分手機出現ANR。(自己遇見過)
集成注意事項
1.??????兩手準備:一旦發現問題。1)server下發補丁包。2)server上把有問題的包替換成最新包
2.??????注意避免本地多次拉取補丁包。假設x版本號存在y補丁。則不再下載該補丁。
資料鏈接
1)? google的NDK樣例
https://github.com/googlesamples/android-ndk
2)? 幾個開源熱修復或插件化解決方式(排名不分先后)
https://github.com/lzyzsd/AndroidHotFixExamples
https://github.com/simpleton/dalvik_patch
https://github.com/dodola/HotFix
https://github.com/jasonross/Nuwa
https://github.com/alibaba/AndFix
https://github.com/rovo89/Xposed
https://github.com/alibaba/dexposed
https://github.com/bunnyblue/DroidFix
https://github.com/CtripMobile/DynamicAPK
3)? 技術原理博客(排名不分先后)
http://bugly.qq.com/blog/?
p=781(QQ空間的解決方式)
https://m.oschina.net/blog/308583(Android Dex分包方案)
http://lirenlong.github.io/hotfix/(淺析xposed、dexposed和AndFix的原理)
http://blog.csdn.net/lmj623565791/article/details/49883661(鴻洋)
http://blog.csdn.net/vipzjyno1/article/details/21039349/(android反編譯) 最后,該篇文章所講的內容我已經以demo的形式放在了github上,須要的朋友請看這里轉載于:https://www.cnblogs.com/claireyuancy/p/7054999.html
總結
以上是生活随笔為你收集整理的听说”双11”是这么解决线上bug的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纸杯蛋糕为什么会回缩?
- 下一篇: 螃蟹哪里买 推荐几个购买螃蟹的好去处?