最近專案中有用到了熱載入技術阿里巴巴的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原理進行研究~~~