tinker+walle+360加固 多渠道热修复踩坑指南

由于不可描述(省钱)的原因,公司决定把热修复方案从付费的sophix迁移到开源(免费)的tinker上来,特此记录一下多渠道热修复的踩坑指南

笔者用的是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一个修复流程如下:

  • ./gradlew assembleRelease 生成基线包base.apk
  • 修复问题后,修改baseApkDir和tinkerId
  • 运行buildAllFlavorsTinkerPatchRelease任务,生成patch包
  • 把base包上传到https://jiagu.360.cn/加固,注意不要签名
  • 把加固包命名为app-release.encrypted.apk,copy到ProtectedApkResignerForWalle根目录,运行ApkResigner.py
  • 最后在channels文件夹下得到已注入渠道信息并签名后的加固包

你可能感兴趣的:(踩坑总结)