Andfix實例講解

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章