隨著項(xiàng)目的不斷迭代開發(fā)截珍,有時(shí)候app發(fā)布出去炸渡,出現(xiàn)一些相對(duì)致命的問題梦皮,頻繁的提示更新固然不好,這種時(shí)候我們可以選擇一種方法來去解決上線后的bug修復(fù)——熱更新(hot patch)蒋院。
實(shí)現(xiàn)熱更新我的解決方案是擁抱Dexposed沉颂。Dexposed是一個(gè)阿里巴巴無線事業(yè)部推出的Android平臺(tái)的無侵入運(yùn)行期AOP開源框架,基于 Xposed 開源項(xiàng)目悦污,旨在解決像性能監(jiān)控铸屉、在線熱補(bǔ)丁等移動(dòng)開發(fā)常見難題。
Dexposed的使用場景有不少切端,今天我們要用他來做熱更新~
1.主項(xiàng)目
配置
Gradle 依賴
dependencies {
compile 'com.taobao.android:dexposed:0.1.1@aar'
}
Note:這里aar文件只包含了armeabi架構(gòu)的so文件彻坛,如果你的項(xiàng)目存在其他架構(gòu)的so文件,需要自行編譯其他架構(gòu)的so文件踏枣。
然后在Application中初始化
public class MyApplication extends Application {
@Override public void onCreate() {
// Check whether current device is supported (also initialize Dexposed framework if not yet)
if (DexposedBridge.canDexposed(this)) {
// Use Dexposed to kick off AOP stuffs.
...
}
}
...
}
Note:
DexposedBridge.canDexposed(this)
這里判斷設(shè)備是否支持Dexposed的同時(shí)也進(jìn)行了初始化昌屉。
最后,我們還需要將 patchloader.jar 導(dǎo)入工程茵瀑。
主項(xiàng)目基本上配置完成间驮。
使用
if (Build.VERSION.SDK_INT >= 21 || !canDexposed) {
LogUtils.d("This device doesn't support dexposed.");
return;
}
PatchResult result = PatchMain.load(context, "your patch path", null);
if (result.isSuccess()) {
LogUtils.d("hotPath load apk success.");
} else {
LogUtils.e("hotPath load apk error.", result.getErrorInfo());
result.getThrowbale().printStackTrace();
}
大概過程就是先判斷設(shè)備是否支持,然后在通過PatchMain.load來加載補(bǔ)丁apk马昨,劫持原來的函數(shù)進(jìn)而實(shí)現(xiàn)在線bug修復(fù)竞帽。
2.補(bǔ)丁
配置
將 patchsample 的libs拷貝到補(bǔ)丁項(xiàng)目,用provided
而不是compile
(兩者的區(qū)別是provided只在編譯和測試階段起作用鸿捧,具體可以參考或查閱 Maven 的 Scope)
dependencies {
provided files('libs/dexposedbridge.jar')
provided files('libs/patchloader.jar')
}
使用
具體參考 patchsample 的代碼屹篓。
3.一些注意事項(xiàng)(踩的坑)
- 目前支持的設(shè)備是5.0以下,5.0官方寫的是Testing匙奴,但我在5.0設(shè)備測試的結(jié)果是無法加載dex的
- 主項(xiàng)目和補(bǔ)丁項(xiàng)目的sdk信息要一致堆巧,不然會(huì)出現(xiàn)mismatch的提示。
- 補(bǔ)丁apk要放在私有目錄,也就是這樣context.openFileOutput(fileName, context.MODE_PRIVATE)
- 補(bǔ)丁apk最好做個(gè)驗(yàn)證
最后
實(shí)現(xiàn)熱更新還是有一定的限制谍肤,比如5.0以上都不支持啦租。同時(shí),補(bǔ)丁這個(gè)東西還不容易寫荒揣。
所以刷钢,平時(shí)代碼盡量嚴(yán)謹(jǐn),測試盡量深入乳附,盡量避免發(fā)布后才發(fā)現(xiàn)致命BUG内地。