AndFix 實戰以及遇到的坑

zyl409214686發表於2017-12-23

最近專案中有用到了熱載入技術阿里巴巴的AndFix框架,為此做了一下相關的調研。首先Fork了一份github上AndFix原始碼,發現github上AndFix 上並沒有直接可以跑起來的demo。那麼只能用自己動手來一步一步來整合嘍。具體的步驟就直接來參考github上AndFix文件的步驟了,還是比較詳細的。

####1、首先第一步我們來加入依賴

dependencies {
	compile 'com.alipay.euler:andfix:0.5.0@aar'
}
複製程式碼

####2、如何來使用呢? 注:這裡為了方便測試,我們就是直接初始化PatchManager、載入與新增Patch都放在了自定義Application onCreate方法當中了,主要是3個步驟見註釋。

        //1)初始化PatchManager
        mPatchManager = new PatchManager(this);
        mPatchManager.init(AppInfoUtils.getVersionCode(this));
        //2)load patch
        mPatchManager.loadPatch();
        try {
        // .apatch file path ,這裡一定要注意每臺手機sd卡路徑不同
        String patchFileString = "sdcard" + Environment.getExternalStorageDirectory()
                .getAbsolutePath() + APATCH_PATH;
        //3)新增patch
        mPatchManager.addPatch(patchFileString);
        Log.d(TAG, "apatch:" + patchFileString + " added.");
    } catch (IOException e) {
        Log.e(TAG, "", e);
    }
複製程式碼

####3、生成patch 1)下載生成工具 AndFix提供了一個生成patch的工具叫apkpatch,可以點選進行下載。 2)準備工作 準備兩個apk包,一個是帶有bug的包, 一個是bug被修復之後的包。具體的action 就是,我首先打一個apk包命名為“app-debug.apk”,注意要有簽名的。然後把它安裝到手機,此時手機上的包為帶有bug的安裝包。然後修改一個Log 內容,再進行打包為apk-release.apk,此時準備工作完成,開始第三步如下。 3)生成patch檔案 具體命令如下

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.sh -o ~/Desktop/ -k ~/develop/github/FamilyLibraryManager/sign.jks -p 123456 -a family_library_manager_key -e 123456  -t ~/Desktop/app-release-01.apk -f ~/Desktop/app-release-01-modifyed.apk
複製程式碼

這時在我的桌面生成了app-release-013cb261226d5a99621b9a464b98ab96ac.apatch 檔案和diff.dex兩個檔案。diff.dex 暫時不用管它。我們直接把app-release-01-3cb261226d5a99621b9a464b98ab96ac.apatch 檔案重新命名為我們Application中用到的APATCH_PATH常量名稱。並把它push 到sd卡中制定的目錄中。這裡我的push命令是

adb push ~/Desktop/out2.apatch  sdcard/storage/emulated/0/out2.apatchc
複製程式碼

####4、重新執行app檢視結果 此時app執行結果應該就是我們修改後的樣子了。

最後說一下我碰到的一些坑 1) sdcard 目錄, 這裡需要注意 sdcard 目錄一定要正確,這樣才能保證正確的push patch檔案以及load patch 檔案。 2)生成工具引數不要弄錯了 -t -f 的含義,t是舊檔案 f是新檔案。不然會報java.lang.IllegalAccessError 錯誤哦。

下班啦~~ 回家,後續會對AndFix原理進行研究~~~

相關文章