前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >章鱼抓娃娃添加Bugly-Tinker热更新支持

章鱼抓娃娃添加Bugly-Tinker热更新支持

作者头像
冰之角
发布2019-03-06 15:12:44
8250
发布2019-03-06 15:12:44
举报
文章被收录于专栏:Winter漫聊技术

Bugly热更新采用Tinker开源方案,官方文档如下: Bugly Android热更新使用指南 Bugly Android热更新详解

接入热更新

我们的章鱼App之前就已经接入了Bugly,所以添加热更新支持,只需在gradle文件中进行如下更改即可。

代码语言:javascript
复制
/// 注释掉之前的bugly
//"bugly": 'com.tencent.bugly:crashreport:latest.release', //日志统计
// 添加支持热更新的 bugly
"bugly": 'com.tencent.bugly:crashreport_upgrade:latest.release', //日志统计(1.3.4之前含Tinker热更新,现已剥离)
"tinker": 'com.tencent.tinker:tinker-android-lib:1.9.8', //Tinker热修复      

此外,我们还需要在project层级的build.gradle中添加classpath; 接下来添加tinker-support.gradle文件并在app.gradle里添加配置; ...... 不一一描述,这些Bugly官方文档里都有。下面主要讲接入热更新后,章鱼App项目引起的改动。

改造Application

在 tinker-support.gradle 文件中配置

enableProxyApplication = true

可以避免Application的改动,但为了更好的兼容性,Tinker官方推荐改造Application。

我们的Application改造前如下图左半,改造后如下图右半。

Application改造

配置tinker-support

一般来说,在改造好Application后,tinker-support.gradle 无需更改即可使用。但为了在章鱼项目下使用起来便捷,进行了如下修改。

修改文件路径

tinker-support默认指定的文件路径均位于build目录下,而build目录下的文件既不稳定也不会同步到git服务器。这很容易让我们发布线上包后丢失关键文件(用于生成对应补丁包的文件),即打包后在 app/build/bakApk/日期 目录下生成的如下文件:

app-release.apk (必有,预发布为app-prerelease.apk ) app-release-mapping.txt (开启混淆后会有) app-release-R.txt (必有,预发布为app-prerelease-R.apk )

这些文件大多数时候是无用的,每次运行项目或打包都会生成。我们真正需要的是线上包对应的这些文件。 所以,让tinker-support生成文件的路径不变,将待修复apk的目录修改为 app/bakApk/app-last-release 。 这样,每次我们发布线上包后,将上述生成文件复制一份并替换到 app/bakApk/app-last-release 目录下即可。

自动修改tinkerId

每次打补丁或发布线上包,都需要修改tinkerId,并保证其唯一性。 我们采用如下格式:

"r" + generateDate()

例如 r-05301455 。

提供便利的测试(配置 tinker-support-prerelease.gradle 文件)

以上两项配置保证了线上补丁发布的便利性,但在发布线上补丁前,我们希望对事情有所掌控。这时,我们可以先测试预发布环境补丁效果。

为了方便,将 tinker-support.gradle 复制一份命名为 tinker-support-prerelease.gradle ,将其基准包目录修改为 app/bakApk/app-last-release ,并修改相应文件名。

为了使tinkerId唯一且与线上补丁保持差异,采用如下格式:

"pr" + generateDate()

例如 pr-05301455 。

最后,在 app/build.gradle 文件中做如下修改(定义isReleaseTask()方法用于判断是否为正式环境),根据任务类型自动引入相对应的tinker-support配置。

if (isReleaseTask(gradle.startParameter.taskNames)) apply from: 'tinker-support.gradle'//tinker线上配置 else apply from: 'tinker-support-prerelease.gradle' //tinker测试预发布包补丁配置。

发包清单
  1. 修改gradle配置,如versionName, versionCode等(tinker-support文件切换及tinkerId修改已自动化);
  2. walle打包(Tinker支持walle多渠道包热修复);
  3. 将刚才 app/build/bakApk/日期 目录下生成的文件备份到 app/bakApk/app-last-release 目录(切记,只有确认发布的线上包才这么做);
  4. 打tag,并将代码提交至服务器。
发补丁清单

Tinker wiki

Tinker补丁不具有即时性,需要app收到补丁后下次启动才会生效。 Tinker补丁支持修改gradle文件与资源文件。建议补丁与基准包(待修复包)保持一致的versionName, versionCode。 此外,Tinker对Manifest的修改支持性不好,建议补丁包别动Manifest,若需要改动,请先在预发布环境下测试补丁的效果。

补丁发布步骤:

  1. 待发布代码测试通过;
  2. 生成预发布环境补丁包;
  3. 发布预发布环境补丁包并观察效果; ——若3顺利通过,则继续向下执行,否则break。
  4. 生成线上补丁包;
  5. 灰度发布线上补丁包并观察效果; ——若5顺利通过,则继续向下执行,否则break。
  6. 全量发布线上补丁包。

第2、3步是对补丁是否能生效的测试,约耗时15~30分钟。理论上这两步是可以省去的,在你确保改动代码被Tinker支持的情况下。不过,不建议如此,热修复依然存在许多问题,在预发布环境先行测试补丁效果具有必要性。

如何生成补丁

线上补丁与测试补丁生成的差异主要体现在配置上。

生成测试补丁
  1. 将代码切回至有问题的线上节点。
  2. 在此配置下使用walle打 prerelease 包,并备份刚刚在 app/build/bakApk/日期 目录下生成的基准文件。
  3. 安装刚刚生成的基准apk(即代码等同于线上包的debug包);
  4. 代码切回到待发布节点(前面几步造成的代码改动不需要保存),将第2步备份好的基准文件替换到 app/bakApk/app-last-prerelease 目录。——如果早已备份好线上对应的测试包,且已安装,则之前步骤都可以省去。
  5. 如下图,执行 buildTinkerPatchPreRelease/buildTinkerPatchDebug 指令生成prerelease/debug补丁。

生成预发布补丁

生成线上补丁

因为在打包时已对线上补丁进行备份,所以生成线上补丁比测试补丁更为简单,步骤如下。

  1. 将代码切换至待发布补丁的节点。
  2. 保证versionName、versionCode与线上版本一致(以免后续升级有问题)。
  3. 执行 buildTinkerPatchRelease 指令生成release补丁。
如何发布补丁

生成后的补丁位于项目 app/build/outputs/patch/环境 目录下,其中, patch_signed_7zip.apk 文件即为要发布的补丁。

将 patch_signed_7zip.apk 文件上传至Bugly指定项目即可。 图文请参照bugly官方文档:上传补丁包到平台

观察补丁情况

每个补丁都对应着特定的一个apk,比如前面提到的线上apk或调试apk,在装有该apk的手机上观察补丁的下发与生效。补丁生效需app重启。

如何验证?

为了便于验证,在 build.gradle 里添加一个字段 APK_DATE

buildConfigField "String", "APK_DATE", ""${generateDate()}""

这样,APK_DATE 即为apk的构建时间(即我们用指令生成该apk或其最新补丁的时间); 在设置页面连击版本号7次,即可观察到相关信息 "生成时:" + BuildConfig.APK_DATE。我们根据该时间信息可以很轻松地判定出当前包是否为补丁包。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.02.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 接入热更新
  • 改造Application
  • 配置tinker-support
    • 修改文件路径
      • 自动修改tinkerId
        • 提供便利的测试(配置 tinker-support-prerelease.gradle 文件)
        • 发包清单
        • 发补丁清单
        • 如何生成补丁
          • 生成测试补丁
            • 生成线上补丁
            • 如何发布补丁
            • 观察补丁情况
              • 如何验证?
              相关产品与服务
              云服务器
              云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档