最近項(xiàng)目中有用到了熱加載技術(shù)阿里巴巴的AndFix框架怀愧,為此做了一下相關(guān)的調(diào)研骚露。首先Fork了一份github上AndFix源碼,發(fā)現(xiàn)github上AndFix 上并沒(méi)有直接可以跑起來(lái)的demo轨功。那么只能用自己動(dòng)手來(lái)一步一步來(lái)集成嘍牢酵。具體的步驟就直接來(lái)參考github上AndFix文檔的步驟了,還是比較詳細(xì)的谊却。
1柔昼、首先第一步我們來(lái)加入依賴
dependencies {
compile 'com.alipay.euler:andfix:0.5.0@aar'
}
2、如何來(lái)使用呢因惭?
注:這里為了方便測(cè)試岳锁,我們就是直接初始化PatchManager、加載與添加Patch都放在了自定義Application onCreate方法當(dāng)中了蹦魔,主要是3個(gè)步驟見(jiàn)注釋激率。
//1)初始化PatchManager
mPatchManager = new PatchManager(this);
mPatchManager.init(AppInfoUtils.getVersionCode(this));
//2)load patch
mPatchManager.loadPatch();
try {
// .apatch file path ,這里一定要注意每臺(tái)手機(jī)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提供了一個(gè)生成patch的工具叫apkpatch乒躺,可以點(diǎn)擊進(jìn)行下載。
2)準(zhǔn)備工作
準(zhǔn)備兩個(gè)apk包低缩,一個(gè)是帶有bug的包嘉冒, 一個(gè)是bug被修復(fù)之后的包。具體的action 就是咆繁,我首先打一個(gè)apk包命名為“app-debug.apk”讳推,注意要有簽名的。然后把它安裝到手機(jī)玩般,此時(shí)手機(jī)上的包為帶有bug的安裝包银觅。然后修改一個(gè)Log 內(nèi)容,再進(jìn)行打包為apk-release.apk坏为,此時(shí)準(zhǔn)備工作完成究驴,開(kāi)始第三步如下。
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
這時(shí)在我的桌面生成了app-release-013cb261226d5a99621b9a464b98ab96ac.apatch 文件和diff.dex兩個(gè)文件匀伏。diff.dex 暫時(shí)不用管它洒忧。我們直接把a(bǔ)pp-release-01-3cb261226d5a99621b9a464b98ab96ac.apatch 文件重命名為我們Application中用到的APATCH_PATH常量名稱。并把它push 到sd卡中制定的目錄中够颠。這里我的push命令是
adb push ~/Desktop/out2.apatch sdcard/storage/emulated/0/out2.apatchc
4熙侍、重新運(yùn)行app查看結(jié)果
此時(shí)app運(yùn)行結(jié)果應(yīng)該就是我們修改后的樣子了。
最后說(shuō)一下我碰到的一些坑
1) sdcard 目錄, 這里需要注意 sdcard 目錄一定要正確蛉抓,這樣才能保證正確的push patch文件以及l(fā)oad patch 文件牢硅。
2)生成工具參數(shù)不要弄錯(cuò)了 -t -f 的含義,t是舊文件 f是新文件芝雪。不然會(huì)報(bào)java.lang.IllegalAccessError 錯(cuò)誤哦减余。
下班啦~~ 回家,后續(xù)會(huì)對(duì)AndFix原理進(jìn)行研究~~~