Bugly Android热更新详解

138 篇文章 0 订阅

Bugly Android热更新详解

https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix-demo/

完整接入流程

  • 打基准包安装并上报联网(注:填写唯一的tinkerId)
  • 对基准包的bug修复(可以是Java代码变更,资源的变更)
  • 修改基准包路径、修改补丁包tinkerId、mapping文件路径(如果开启了混淆需要配置)、resId文件路径
  • 执行tinkerPatchRelease打Release版本补丁包
  • 选择app/build/outputs/patch目录下的补丁包并上传(注:不要选择tinkerPatch目录下的补丁包,不然上传会有问题)
  • 编辑下发补丁规则,点击立即下发
  • 杀死进程并重启基准包,请求补丁策略(SDK会自动下载补丁并合成)
  • 再次重启基准包,检验补丁应用结果
  • 查看页面,查看激活数据的变化

Github Demo

https://github.com/BuglyDevTeam/Bugly-Android-Demo

普通打包

1、编译基准包

配置基准包的tinkerId

配置基准包的tinkerId

tinkerId最好是一个唯一标识,例如git版本号、versionName等等。 如果你要测试热更新,你需要对基线版本进行联网上报。

这里强调一下,基线版本配置一个唯一的tinkerId,而这个基线版本能够应用补丁的前提是集成过热更新SDK,并启动上报过联网,这样我们后台会将这个tinkerId对应到一个目标版本,例如tinkerId = "bugly_1.0.0" 对应了一个目标版本是1.0.0,基于这个版本打的补丁包就能匹配到目标版本。

执行assembleRelease编译生成基准包:

编译基准包

这个会在build/outputs/bakApk路径下生成每次编译的基准包、混淆配置文件、资源Id文件,如下图所示:

生成的基线版本

实际应用中,请注意保存线上发布版本的基准apk包、mapping文件、R.txt文件,如果线上版本有bug,就可以借助我们tinker-support插件进行补丁包的生成

启动apk,上报联网数据

我们每次冷启动都会请求补丁策略,会上报当前版本号和tinkerId,这样我们后台就能将这个唯一的tinkerId对应到一个版本,大家测试的时候可以打开logcat查看我们的日志,如下图所示:

上报联网数据

如果看不到log,您需要将bugly初始化的第三个参数设置为true才能看到

2、对基线版本的bug修复

未修复前

未修复前

这个类有一个会造成空指针的方法。

修复后

修复后

对产生bug的类进行修复,作为补丁下次覆盖基线版本的类。

3、根据基线版本生成补丁包

修改待修复apk路径、mapping文件路径、resId文件路径

配置apk路径、mapping文件路径、resId文件路径

执行构建补丁包的task

执行构建补丁包的task

如果你要生成不同编译环境的补丁包,只需要执行TinkerSupport插件生成的task,比如buildTinkerPatchRelease就能生成release编译环境的补丁包。 注:TinkerSupport插件版本低于1.0.4的,需要使用tinkerPatchRelease来生成补丁包 

生成的补丁包在build/outputs/patch目录下:

build/outputs/patch

大家这里可能会有一个疑问,补丁版本是怎么匹配到目标版本的,可以双击patch包,我们提供的插件会在tinker生成的patch包基础上插入一个MF文件:

tinker-support插件日志

Yapatch.MF文件

4、上传补丁包到平台

上传补丁包到平台并下发编辑规则

点击发布新补丁

选择文件

编辑规则

点击发布新补丁,上传前面生成的patch包,我们平台会自动为你匹配到目标版本,你可以选择下发范围(开发设备、全量设备、自定义),填写完备注之后,点击立即下发让补丁生效,这样你就可以在客户端当中收到我们的策略,SDK会自动帮你把补丁包下到本地。

5、测试补丁应用效果

启动app应用patch

启动app应用patch

如果匹配到目标版本,后台就会下发补丁策略,可以在logcat看到如下日志:

补丁策略下发

下载成功之后,我们会立即去合成补丁,可以看到patch合成的日志:

patch合成日志

重启app查看效果

重启app查看效果

注:我们方案是基于Tinker方案的实现,需要下次启动才能让补丁生效。

多渠道打包

tinker是支持我们打多渠道的,建议大家按照以下步骤进行最佳实践:

1. 配置productFlavors

android {
    ...

    // 多渠道打包(示例配置)
    productFlavors {
        xiaomi {
            applicationId 'com.tencent.bugly.hotfix.xiaomi'
        }

        yyb {
            applicationId 'com.tencent.bugly.hotfix.yyb'
        }
    }

  ...

}

2. 执行assembleRelease生成基线apk

按照普通打包方式正常配置基线版本的tinkerId,然后执行assembleRelease生成不同渠道的apk,会在工程中build/bakApk/生成如下图所示文件:

生成渠道基线apk

3. 打渠道补丁包配置

打渠道补丁包配置

4.执行buildAllFlavorsTinkerPatchRelease生成所有渠道补丁包

如下图所示:

生成渠道补丁包

5.测试应用补丁包

与普通打包一致。

加固打包(仅支持tinker 1.7.5及以下)

tinker的一般模式需要Dex的合成,它并不支持加固,一定要使用加固的app可以使用usePreGeneratedPatchDex模式。由于加固会改变apk的dex结构,所以生成补丁包时我们务必要使用加固前的apk。 但是需要注意的是,某些加固工具会将非exported的四大组件的类名替换,对于这部分类即使使用usePreGeneratedPatchDex也无法修改。对于360加固,MainActivity由于被提前加载,也无法修复。大家对于加固的情况,请仔细测试,能否支持与加固的方式有关联

1.提前生成dex配置

tinker是支持加固模式的,但需要你回退到Qzone方案 ,将usePreGeneratedPatchDex设置为true。

提前生成dex配置

是否提前生成dex,而非合成的方式。这套方案即回退成Qzone的方案,对于需要使用加固或者多flavor打包(建议使用其他方式生成渠道包)的用户可使用。但是这套方案需要插桩会造成Dalvik下性能损耗以及Art补丁包可能过大的问题,务必谨慎使用。另外一方面,这种方案在Android N之后可能会产生问题,建议过滤N之后的用户

2.将基准包进行加固

如果你的app需要进行加固,你需要将你打出的基准包上传到具体的加固平台进行加固,例如乐固,加固完成之后需要对apk进行重签名

jarsigner -verbose -keystore <YOUR_KEYSTORE> -signedjar <SIGNED_APK> <UNSIGNED_APK> <KEY_ALIAS>

以上命令说明:
-verbose:指定生成详细输出
-keystore:指定证书存储路径
-signedjar:改选项的三个参数分别为签名后的apk包、未签名的apk包、数字证书别名

3.根据加固的基准包生成补丁包

打patch包的操作跟普通打包方式一致。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值