現(xiàn)在市面上熱更新方案很多,本篇嘗試使用bugly方案疫衩,bugly對tinker進行封裝并添加后臺管理鲤拿,使用更新方便,目前免費冤寿。
bugly熱更新官方使用指南地址:https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20170912151050
如果有時間的話最好看下介紹視頻号杠,你會避免接入過程中的很多問題堂飞。
上述步驟可以參考文檔完成,很簡單谋右,第三步我們采用enableProxyApplication = false 的情況,這也是bugly推薦的方式蜂林。
這時我們可以打開熱更新API接口子眶,把設(shè)置bugly的一些參數(shù)加入到自己的SampleApplicationLike類中芝加,https://bugly.qq.com/docs/user-guide/api-hotfix/?v=20170912151050
例如我加入的
@Override
public void onCreate() {
super.onCreate();
initBuglyHotFix();
}
private void initBuglyHotFix() {
// 設(shè)置是否開啟熱更新能力脉顿,默認為true
Beta.enableHotfix = true;
// 設(shè)置是否自動下載補丁蔽莱,默認為true
Beta.canAutoDownloadPatch = true;
// 設(shè)置是否自動合成補丁仪糖,默認為true
Beta.canAutoPatch = true;
// 設(shè)置是否提示用戶重啟饥瓷,默認為false
Beta.canNotifyUserRestart = true;
// 補丁回調(diào)接口
Beta.betaPatchListener = new BetaPatchListener() {
@Override
public void onPatchReceived(String patchFile) {
Toast.makeText(getApplication(), "補丁下載地址" + patchFile, Toast.LENGTH_SHORT).show();
}
@Override
public void onDownloadReceived(long savedLength, long totalLength) {
Toast.makeText(getApplication(),
String.format(Locale.getDefault(), "%s %d%%",
Beta.strNotificationDownloading,
(int) (totalLength == 0 ? 0 : savedLength * 100 / totalLength)),
Toast.LENGTH_SHORT).show();
}
@Override
public void onDownloadSuccess(String msg) {
Toast.makeText(getApplication(), "補丁下載成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onDownloadFailure(String msg) {
Toast.makeText(getApplication(), "補丁下載失敗", Toast.LENGTH_SHORT).show();
}
@Override
public void onApplySuccess(String msg) {
Toast.makeText(getApplication(), "補丁應用成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onApplyFailure(String msg) {
Toast.makeText(getApplication(), "補丁應用失敗", Toast.LENGTH_SHORT).show();
}
@Override
public void onPatchRollback() {
}
};
// 設(shè)置開發(fā)設(shè)備娜谊,默認為false确买,上傳補丁如果下發(fā)范圍指定為“開發(fā)設(shè)備”,需要調(diào)用此接口來標識開發(fā)設(shè)備
Bugly.setIsDevelopmentDevice(getApplication(), true);
// 多渠道需求塞入
// String channel = WalleChannelReader.getChannel(getApplication());
// Bugly.setAppChannel(getApplication(), channel);
// 這里實現(xiàn)SDK初始化纱皆,appId替換成你的在Bugly平臺申請的appId
//第三個參數(shù)就是是否開啟debug的參數(shù)
Bugly.init(getApplication(), "900029763", true);
}
請注意這里面的參數(shù)設(shè)置湾趾,例如這行Beta.canNotifyUserRestart = true;
是否提示用戶重啟芭商,為了方便我們看到自己的效果,這時我們這時了true搀缠,還有這行 Bugly.init(getApplication(), "900029763", true);
第三個參數(shù)就是開啟debug的參數(shù)
然后我們需要在bugly平臺注冊一個賬號铛楣,創(chuàng)建自己的應用,獲取自己的App ID
我們需要在SampleApplicationLike中修改這個參數(shù)
Bugly.init(getApplication(), "900029763", false);第二個參數(shù)就是我們的App ID艺普。
我在自己的demo里面寫了一個bug
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.bt_test).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, Bug.getBugString(), Toast.LENGTH_SHORT).show();
}
});
}
class Bug{
static String getBugString(){
String str=null;
Log.e("BugClass","get string length:"+str.length());
return "This is a bug class";
}
}
這時一個空指針異常
這時我們打開tinker-support.gradle文件簸州,修改tinkerId
記得要在build.grade文件里面配置自己的簽名信息,這時我們可以生成自己的基準包了歧譬,注意關(guān)閉自己的instant run模式岸浑,我們打開右側(cè)的gradle,雙擊assembleRelease,就會生成自己的基準包
我們把app-release.apk安裝到自己的手機上面
這時點擊TEST按鈕程序就會崩潰瑰步,錯誤信息如下
好了矢洲,這時我們可以修復我們的bug
然后修改tinker-support.gradle文件中的baseApkDir,一定要和左側(cè)基準包一致,不然無法修復面氓,修改第二個參數(shù)就是tinkerId,把1.0.1-base改成1.0.1-patch即可
這時我們可以生成對應的補丁包了兵钮,雙擊下圖中的buildTinkerPatchRelease即可
然后在左側(cè)可以看到生成的補丁包
patch_signed_7zip.apk就是補丁包蛆橡,這時我們打開bugly熱更新管理平臺
點擊發(fā)布新補丁舌界,上傳patch_signed_7zip.apk文件即可,注意我們上傳補丁包前一定要運行我們的基準包泰演,上傳我們的基準包的信息給bugly平臺呻拌,這樣我們上傳補丁包才可以修復我們的bug,上傳過后我們重新運行我們的基準包
可以看到bug修復成功睦焕,上面的提示信息和彈框都可以在SampleApplicationLike設(shè)置關(guān)閉藐握,注意一定要重啟應用或者屏幕關(guān)閉后開啟,bug才能修復成功垃喊。
實際的開發(fā)中都會有很多的渠道包猾普,而且會加固,多個渠道包如何進行熱修復呢本谜?下篇會將自己集成美團walle多渠道打包和360加固的過程分享出來初家。
demo地址https://github.com/yanchenling/MyHotFixDemo