笔者用的是Bugly集成tinker,优点是自带补丁管理后台,支持补丁下发/撤回/灰度推送等,接入也是非常简单了,根据官方指南来就行。Bugly Android热更新接入文档
总结完整的接入流程如下:
打基准包安装并上报联网(注:填写唯一的tinkerId)
对基准包的bug修复(可以是Java代码变更,资源的变更)
修改基准包路径、修改补丁包tinkerId、mapping文件路径(如果开启了混淆需要配置)、resId文件路径
执行buildTinkerPatchRelease打Release版本补丁包
选择app/build/outputs/patch目录下的补丁包并上传(注:不要选择tinkerPatch目录下的补丁包,不然上传会有问题)
编辑下发补丁规则,点击立即下发
杀死进程并重启基准包,请求补丁策略(SDK会自动下载补丁并合成)
再次重启基准包,检验补丁应用结果
查看页面,查看激活数据的变化
Bugly支持多渠道热更新,官方推荐用美团的walle进行多渠道打包
为什么不推荐配置productFlavors进行多渠道打包呢
因为1.非常低效,打一个渠道包就要走一下编译流程,100个渠道包那得多慢。
2.要针对多渠道进行打补丁,如果有100个渠道,就要生成100个补丁,简直是噩梦
那么,有没有版本通过一个补丁就能够修复所有渠道呢?答案是:有的,但前提是你要保证所有渠道包代码是一致的。
通过walle或者类似的打包工具,不会改变dex的结构,只是修改APK Signature Block来添加自定义的渠道信息来生成渠道包。
所以walle是一个比较理想的方案。
那么,要如何获取渠道信息?
引入walle
dependencies {
compile 'com.meituan.android.walle:library:1.1.3'
}
代码中使用
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
由于笔者使用了Umeng统计,用Walle注入的渠道信息,Umeng是获取不到的,要在代码中把他们建立关联
//把walle打包注入的渠道信息传给umeng
MobclickAgent.UMAnalyticsConfig umAnalyticsConfig = new MobclickAgent.UMAnalyticsConfig(context,
UmengConfig.UMENG_APPKEY,
WalleChannelReader.getChannel(getApplication()),
MobclickAgent.EScenarioType.E_UM_NORMAL,
true);
MobclickAgent.startWithConfigure(umAnalyticsConfig);
并且由于项目中需要用到渠道号对应的配置生成推广链接,所以要做一些额外的配置
config.json中
//*****省略的配置*****
"channelInfoList": [
{
"channel": "tuiguang",
"extraInfo": {
"info": "BRbEry"
}
},
]
//*****省略的配置*****
代码中取出info信息
String info = WalleChannelReader.get(context, "info");//渠道号对应的推广链接后缀
然鹅,用walle注入的签名信息如果用360加固会失效,参考这里
本人是用Jay-Goo写的这个工具。专门修复类似360加固重签名和批量注入渠道,2秒搞定。支持全平台
用360加固后的包,经过工具处理,自动生成所有渠道包并注入渠道信息,接下来,用未加固未签名的基准包,生成补丁,就可以适配360加固后的全渠道啦
注意:
1.需要将应用上传360加固 网页-上传和加固(不签名),而不是使用360加固助手(因为PC版会 加固并签名应用,而且使用的是V1(传统)签名))
2.tinker-support.gradle里面记得打开这个
// 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持)
isProtectedApp = true
3.经过测试,最新版1.9.13还是不兼容360加固,修复后会闪退,详见这个issue,笔者改回1.9.9测试正常
"tinker":"com.tencent.tinker:tinker-android-lib:1.9.9",//最新版1.9.13有bug,1.9.9使用加固包测试正常
总结下来tinker一个修复流程如下: