作為一個(gè)日活躍幾萬(wàn)甚至幾十萬(wàn)的app,一旦線上出現(xiàn)了個(gè)問(wèn)題,比如ANR,算法公式錯(cuò)了等等,經(jīng)常被用戶吐槽的無(wú)地自容,然后我們沒(méi)日夜的拼命加班,修bug,發(fā)版等上線,最后用戶手動(dòng)更新版本,好不容易解決了,還被吐槽這個(gè)體驗(yàn)好差等等,最后損失了不少用戶。
一直以來(lái)想找一種方法能和IOS一樣能在用戶無(wú)感的情況下自動(dòng)實(shí)現(xiàn)版本更新,使得不知不覺(jué)中問(wèn)題就解決了,這幾天抽空去研究了下,發(fā)現(xiàn)有很多家公司已經(jīng)開(kāi)源出來(lái)了,如阿里的Andfix,騰訊QQ空間團(tuán)隊(duì)的nuwa,攜程的DynamicAPK 等等,這里我對(duì)Andfix的使用做個(gè)簡(jiǎn)單的記錄。
AndFix,全稱是Android hot-fix。是阿里開(kāi)源的一個(gè)Android熱補(bǔ)丁框架,允許APP 在不重新發(fā)布版本的情況下修復(fù)線上的bug,注意,只是修復(fù)bug,并不能對(duì)資源文件 做出修改,不能添加新類。
使用:
1、 添加依賴
compile 'com.alipay.euler:andfix:0.4.0@aar'
2、在Application中對(duì)PatchManager進(jìn)行初始化(PS:別忘了在清單文件中注冊(cè))
patchManager = new PatchManager(context);
patchManager.init(appversion);//current version
patchManager.loadPatch();
其中appversion可以這樣獲得
String appversion = getPackageManager().getPackageInfo(getPackageName(),0).versionName;
3、 初始化完成后 ,就要寫自己的加載補(bǔ)丁的邏輯代碼了 ; 比如啟動(dòng)app后,去自己服務(wù)器獲取(mac端搭建web服務(wù)器),看是否需要更新補(bǔ)丁,如果有并且下載到本地完畢后,執(zhí)行下邊代碼,就會(huì)將補(bǔ)丁生效了 .
patchManager.addPatch(filePath);
到這步其實(shí)已經(jīng)都完成了,那么該怎么生成補(bǔ)丁文件呢?
4、生成.apatch補(bǔ)丁文件
下載補(bǔ)丁生成工具 : apkpatch , 然后執(zhí)行命令:
./apkpatch.sh
-f diff_new.apk //修復(fù)完畢的apk文件
-t diff_old.apk //有bug的apk文件
-o ./ //補(bǔ)丁文件輸出路徑 : 當(dāng)前目錄
-k key.keystore // 簽名文件
-p 123456 //簽名文件密碼
-a diffpatch //簽名文件alias
-e 123456 //簽名文件alias的密碼
執(zhí)行后,會(huì)生成幾個(gè)文件,其中補(bǔ)丁文件就是以.apatch結(jié)尾的,放到服務(wù)器讓app去下載更新;
使用過(guò)程中,對(duì)布局文件、類的增減等情況多做了補(bǔ)丁化處理,結(jié)果這幾個(gè)更新都沒(méi)成功,換句話說(shuō)Andfix并不能進(jìn)行增量更新,但是有點(diǎn)值得慶幸的是,app補(bǔ)丁更新后無(wú)需重啟就可實(shí)現(xiàn)app的修改。
接下去可能會(huì)對(duì)Andfix的原理進(jìn)行研究。Andfix源碼