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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

听说”双11”是这么解决线上bug的

發布時間:2024/10/12 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 听说”双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 version

3) 載入補丁包

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的的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。