Andfix是阿里推出的一個熱更新的庫工程。相比其他熱更新框架,它的特點是使用簡單,功能強大,有專門團隊進行維護。這篇文章來整理討論下如何導入使用阿里的Andfix框架來完成我們一個bug的修復。
導入Andfix
新建一個android studio 工程,引入Andfix很簡單,在build.gradle下面添置語句。
compile ‘com.alipay.euler:andfix:0.5.0@aar’ //引入andfix模塊
同步一下gradle即可。
官網github
我們進入到官網的giithub查看學習。地址是:
https://github.com/alibaba/AndFix
我們看到Andfix主要是使用apatch文件對apk進行修補,原理是根據註釋和hook技術 來修補錯誤方法體本事。
初始化準備
Andfix對象的初始化工作可以放到application對象中去執行。主要是提供上下文對象和版本號。
//初始化andfix方法
public void init(Context context){
this.patchmanager = new PatchManager(context);
patchmanager.init(Utils.getVersionCode(context));
patchmanager.loadPatch();
}
結束,其中的Utils方法的主要作用是獲版本號。PatchManager是andfix提供的一個核心類,它有兩種方法,一個是loadPatch(),轉載我們的patch文件,另外一個是addPatch()方法,當一個新的補丁下載下來後,只能通過addPatch方法才能加載進來,所以這個方法很重要。
在這裏,我們這裏利用java指針異常來產生一個有bug的方法,然後在後續用andfix的apatch文件對該方法進行修復。
我們在主界面上放置了兩個按鈕,一個是產生bug按鈕,另外一個是修復bug按鈕。產生bug按鈕拋一個空指針異常出來,使得程序崩潰。另外一個按鈕修復bug按鈕,是利用andfix來修復這個bug異常。
//模擬產生bug
public static void printLog() {
String error = null;
Log.d("preqel",error);
}
修復bug的關鍵代碼主要如下:
public void fixBug(View view ){
AndFixPatchManager.getinstance().addPatch(getPathName());
}
簽名打包的方法:
1.利用keytool工具生成一個簽名證書。(這裏不展開了,主要是android簽名打包)
2在build.gradle裏面配置signingConfigs。
3.利用gradlew assembelRelease命令打簽名包。
將含有錯誤方法的android工程生成一個old.apk,保存在本地。
4.將錯誤方法修復後再生成new.apk,保存在本地。
String error="error message";
Log.d("preqel",error);
好了,一切準備就緒。
下載apatch補丁工具
官網地址:https://github.com/alibaba/AndFix/tree/master/tools
下載完以後是以下文件:
在windows或者linux的命令行裏面進入下載目錄下面執行相應操作。
apkpatch命令是andfix給我們提供的命令行工具。主要來生成patch補丁文件。這裏我們可以看到它爲我們提供了兩個命令,-f命令,用來生產apatch文件,-m命令,用來合併多個patch文件爲一個所用的。
我們這裏用下-f命令來生產aptch文件,主要用到的準備東西有簽名證書和之前生成的兩個apk。
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.
在命令行裏面執行的時候進入到apkpatch所在目錄執行,爲了防止別人惡意獲取到補丁文件進行篡改,所以這裏要指定簽名,
結果如下:
我們看到它有提示哪些方法進行了修復,在Utils.printLog()方法已經生成了。切換到apkpatch所在目錄output(-o參數後面的文件目錄),在裏面找到apatch文件,重命名改文件,我這裏命名preqel.apatch.
push補丁文件並安裝
將fix1.apatch通過adb push命令push到手機裏面。如下圖所示:
紅線的push地址是怎麼來的?我們通過外部儲存路徑的地址來保存apatch文件,即 mPathDir =getExternalCacheDir().getAbsolutePath()+ “/apatch/”;這個可以斷點調試下你自己的android手機的地址,就可以得到了。
最後我們在手機裏面利用adb install命令安裝old.apk(有問題的apk),然後點擊產生錯誤的按鈕 ,接着看到apk崩潰了。說明空指針異常。然後點擊修復bug按鈕,這時候andfix加載apatch文件進行bug的修復,然後點擊產生bug按鈕,程序並沒有崩潰。
總結
剛開始我們對andfix進行初始化,關鍵是執行 AndFixPatchManager.getinstance().init() 。然後我們準備了兩個apk,一個是模擬產生崩潰的apk,另外一個是修復bug的apk。然後我們根據andfix提供的補丁生成工具,生成apatch,然後最後push到了我們的手機。在我們的apk點擊修復按鈕進行加載,然後最後修復了這個bug。後續adb push這個過程可以用從服務端下載這個方式取代,正式用於bug修復。
最後附上項目工程的github地址:
https://github.com/preqel/andfixo