现在市面上热更新方案很多,本篇尝试使用bugly方案,bugly对tinker进行封装并添加后台管理,使用更新方便,目前免费。
bugly热更新官方使用指南地址:https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20170912151050
如果有时间的话最好看下介绍视频,你会避免接入过程中的很多问题。
上述步骤可以参考文档完成,很简单,第三步我们采用enableProxyApplication = false 的情况,这也是bugly推荐的方式。
这时我们可以打开热更新API接口,把设置bugly的一些参数加入到自己的SampleApplicationLike类中,https://bugly.qq.com/docs/user-guide/api-hotfix/?v=20170912151050
例如我加入的
@Override
public void onCreate() {
super.onCreate();
initBuglyHotFix();
}
private void initBuglyHotFix() {
// 设置是否开启热更新能力,默认为true
Beta.enableHotfix = true;
// 设置是否自动下载补丁,默认为true
Beta.canAutoDownloadPatch = true;
// 设置是否自动合成补丁,默认为true
Beta.canAutoPatch = true;
// 设置是否提示用户重启,默认为false
Beta.canNotifyUserRestart = true;
// 补丁回调接口
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() {
}
};
// 设置开发设备,默认为false,上传补丁如果下发范围指定为“开发设备”,需要调用此接口来标识开发设备
Bugly.setIsDevelopmentDevice(getApplication(), true);
// 多渠道需求塞入
// String channel = WalleChannelReader.getChannel(getApplication());
// Bugly.setAppChannel(getApplication(), channel);
// 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId
//第三个参数就是是否开启debug的参数
Bugly.init(getApplication(), "900029763", true);
}
请注意这里面的参数设置,例如这行Beta.canNotifyUserRestart = true;
是否提示用户重启,为了方便我们看到自己的效果,这时我们这时了true,还有这行 Bugly.init(getApplication(), "900029763", true);
第三个参数就是开启debug的参数
然后我们需要在bugly平台注册一个账号,创建自己的应用,获取自己的App ID
我们需要在SampleApplicationLike中修改这个参数
Bugly.init(getApplication(), "900029763", false);第二个参数就是我们的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文件里面配置自己的签名信息,这时我们可以生成自己的基准包了,注意关闭自己的instant run模式,我们打开右侧的gradle,双击assembleRelease,就会生成自己的基准包
我们把app-release.apk安装到自己的手机上面
这时点击TEST按钮程序就会崩溃,错误信息如下
好了,这时我们可以修复我们的bug
然后修改tinker-support.gradle文件中的baseApkDir,一定要和左侧基准包一致,不然无法修复,修改第二个参数就是tinkerId,把1.0.1-base改成1.0.1-patch即可
这时我们可以生成对应的补丁包了,双击下图中的buildTinkerPatchRelease即可
然后在左侧可以看到生成的补丁包
patch_signed_7zip.apk就是补丁包,这时我们打开bugly热更新管理平台
点击发布新补丁,上传patch_signed_7zip.apk文件即可,注意我们上传补丁包前一定要运行我们的基准包,上传我们的基准包的信息给bugly平台,这样我们上传补丁包才可以修复我们的bug,上传过后我们重新运行我们的基准包
可以看到bug修复成功,上面的提示信息和弹框都可以在SampleApplicationLike设置关闭,注意一定要重启应用或者屏幕关闭后开启,bug才能修复成功。
实际的开发中都会有很多的渠道包,而且会加固,多个渠道包如何进行热修复呢?下篇会将自己集成美团walle多渠道打包和360加固的过程分享出来。
demo地址https://github.com/yanchenling/MyHotFixDemo
网友评论