Tinker热修复集成

Tinker与Tinker Patch平台介绍


什么是 Tinker?


Tinker 是一个开源项目(Github链接),它是微信官方的 Android 热补丁解决方案,它支持动态下发代码、So 库以及资源,让应用能够在不需要重新安装的情况下实现更新。

Tinker 的优势


当前市面的热补丁方案有很多,其中比较出名的有阿里的 AndFix、美团的 Robust 以及 QZone 的超级补丁方案。但它们都存在无法解决的问题,具体支持程度如下:

image

Tinker方案优势

  1. 不用在构造函数插入代码,防止verify(全量合成Dex以避免verify标志的异常)。
  2. 支持新增类和资源、so等。
  3. dexDiff算法使得补丁文件较小。
  4. gradle支持,再自己定义下可以一键打补丁包。
  5. 扩展性良好,代码中处处为开发者留出开放接口,简直业界良心。
  6. 支持多次补丁及补丁清除。
  7. Application 和其提前加载的类都是可以进行修复的。

Tinker 详细使用文档见 [Tinker Github Wiki]

Tinker的不足


由于原理与系统限制,Tinker有以下已知问题:

  1. Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件(1.9.0支持新增非export的Activity);
  2. 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
  3. 在Android N上,补丁对应用启动时间有轻微的影响;
  4. 补丁合成产物比较占手机Rom内存空间。
  5. 包含多Dex的补丁,需要开启多个进程分别对每个Dex进行合并,比较占用开销。
  6. 不支持部分三星android-21机型,加载补丁时会主动抛出”TinkerRuntimeException:checkDexInstall failed”;
  7. 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。

Tinker的原理及工作流程简述


与其他热更新方案不同的是,tinker使用自研的DexDiff算法生成补丁包(关于DexDiff的亮点见 https://www.zybuluo.com/dodola/note/554061),
然后将补丁包与基线包合并成新的dex文件,从而全量替换原有的dex,而不是像某些热修复方案那样将补丁放到另一个dex中。即全量合成Dex以避免verify标志的异常。

image.png

image.png

TinkerPatch 平台


使用tinker之后,需要管理自己的补丁包以及对应的基础版本,并且需要开发一套补丁下发的后端服务,并且需要支持开发调试、灰度测试、正式发布等功能,而且需要保证传输安全(毕竟补丁包是直接作用于我们的APP的,被人拦截将是灾难性的打击)。
干这些事情的平台其实有很多,而TinkerPatch平台就是其中之一,而且它是官方推荐的一个平台。它的开发者本身也是来自tinker团队,所以这里面的官方支持程度可想而知。

TinkerPatch 平台帮你做了这些工作,提供了补丁后台托管,版本管理,保证传输安全等功能,让你无需搭建一个后台,无需关心部署操作,只需引入一个 SDK 即可立即使用 Tinker。
此外,通过深入研究 Tinker 源码,TinkerTinkerPatch 平台在 Tinker的基础上加入了以下特性:

  1. 一键傻瓜式接入;无需理解复杂的热修复原理,一行代码即可接入热修复。实现了自动反射 Appliction 与 Library,使用者无需对自己的项目做任何的改动;
  2. 补丁管理;实现了热补丁的版本管理,补丁的自动重试与异常时自动回退等功能。同时我们可以简单实现条件下发补丁,在出现异常情况时,我们也可以快速回滚补丁;
  3. 编译优化;简化了 Tinker 的编译复杂度,实现了备份路径选择,功能开关等功能。

TinkerPatch 平台在 Github 为大家提供了各种各样的 Sample,大家可点击前往 [TinkerPatch Github].

官方对它的优势总结如下:

image

其他


  1. 它支持开发预览
  2. 它支持补丁回滚
  3. 支持灰度下发、条件下发
  4. 支持配置具体的补丁拉取策略
  5. 支持新增Activity,但是不支持新增Service

集成步骤


  1. 引入tinker patch gradle插件
  2. 引入tinker patch SDK
  3. 配置tinker patch
  4. 在代码中添加支持,设置补丁下发策略、回滚策略、补丁生效机制等等
  5. 生成基线包,正常打包,由于引入了tinker patch gradle插件,所以打包时会自动生成当前基线包以及附属的文件
  6. 业务需要、紧急修复,修改代码
  7. 使用tinkerPatchRelease任务,生成补丁包,该补丁包是相对于指定的基线包而言的
  8. 在tinker patch后台上传补丁包,选择‘开发调试’模式下发
  9. 开发调试,测试是否生效,以及是否有其他bug
  10. 灰度测试
  11. 正式全量下发

具体实施过程


1. 引入tinker patch gradle插件

在工程根目录

// TinkerPatch 插件
classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.8"
image

2. 引入tinker patch SDK

在moudle的build.gradle文件中加入如下依赖包:

compile "com.android.support:multidex:1.0.3"
//无需引入tinker的任何库,使用tinkerpatch sdk即可
compile("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.8")
image

3. 配置tinker patch

首先,将官方提供的tinkerpatch.gradle脚本文件放到moudle根目录下(根build.gradle在相同目录),然后在build.gradle中加入:

apply from: 'tinkerpatch.gradle'
configurations.all { resolutionStrategy.cacheChangingModulesFor 0, 'seconds'}

其次,修改tinkerpatch.gralde中的配置:

image

详细说明见tinkerpatch.gralde文件中的注释。注意,这里面会配置一个appVersion字段,这个字段的值一定要跟在tinker patch平台创建的版本一致

4. 在代码中添加支持,设置补丁下发策略、回滚策略、补丁生效机制等等

首先有两种方式,第一种是修改Application类,将我们的Application类继承DefaultApplicationLike类,然后在其中做配置;第二种是直接在我们现有的Application类中添加代码。
1.获取TinkerPatchApplicationLike对象
tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();

2.配置:详见官方文档:http://www.tinkerpatch.com/Docs/api

image

5. 正常打包以生成基线包

注意在打包后,需要将tinker生成的bakApk目录相关文件归档保存。

6. 打补丁包

执行TinkerPatchRelease任务即可。

image

生成的文件如下:

image

其中patch_signed_7zip.apk是经过7zip压缩的,不过当补丁文件本身较小的时候,压缩后的包会大于原大小,我们只需要选择最小的那个即可。

7. 上传到tinker patch平台,选择开发调试

其实,集成起来,我们按照上述步骤来就行了。比较简单。关键就是在不同场景需求下能想出对应的解决办法。比如,遇到紧急问题时,我们可以采用上述方式发布补丁,再比如当补丁本身出现问题时,我们可以使用它的回滚功能来回滚补丁。

8. 开发调试

1.首先要将tinkerPatch平台的appkey在代码里设置好
在文件tinkerpatch.gradle中,tinkerpatchSupport后面的闭包里,设置:

image

2.然后将打好的补丁包上传到tinker patch平台:
http://www.tinkerpatch.com/Apps
上传补丁时选择“开发预览”

是不是简单到你都不想看~~ 那就对了,这就是tinker patch的优势

image

3.将开发调试工具安装到你要调试的设备上:

以下为官方给的工具及说明:
“由于 Tinker 与代码相关,我们不能通过在代码设置是否为 debug 模式。这里我们提供了 debug 调试工具,它的 Github 地址为 tinkerpatch-debug-tool。 我们也可以通过点击此链接下载。”

4.在debug tool中打开开关,然后重启你的APP,然后你的热更新补丁就会下载、合并到本地。此时可以观察logcat日志,有相关的日志打印出来:

image

9. 条件下发

1.在代码中添加条件

image

在发布补丁时,选择条件下发:

image

注意,在代码中设置条件时,我们设置的是String->String这样的键值对,这里条件下发时,条件写的是test>9,能生效吗?能,因为在比较的时候,tinkerpatch会将之前代码中设置的值转为数值再比较。这里注意两点:
1.代码中设置的条件是可以设置多个的。
2.在选择条件下发时,条件表达式也是可以组合的,具体规则如下:
官方文档中对于条件下发的说明

image

下发后,在重启APP之后就会有如下的日志打印出来。

image

然后新的代码就生效了。

另外有个问题

假如,我们在基线包中设置的条件是("test","1"),然后在补丁包中修改了这个值为("test","10"),那么,在下次条件下发补丁的时候,下发条件设置为test>9,这个时候能不能成功下发呢?

答案是,能,因为在前一个补丁中,已经修改了这个值。

10. 补丁回滚

如果我们在下发一个补丁之后,发现修改bug的补丁,自己又产生了bug,也就是改了一个bug之后,同时又写了一个更牛逼的bug😂😂😂,那么这个时候怎么办呢?
有两个办法:
1.如果新的bug只是小问题,而且错误代码的范围是比较小的。那么就简单了。直接再来个补丁就行。
2.但是如果你写的这个bug确实比较牛逼,而且影响范围巨大,比如,合并代码时,合错分支了,而且又比较紧急(比如做了个发红包的活动,。然后如果要修改的话又需要比较久的时间。这个时候如果线上用户再等你修改好再发一个补丁,估计都凉凉了。

虽然tinker很牛逼,但是这种情况还是比较麻烦的。
首先,得在tinker patch后台删除整个基线版本。
然后,在客户端下次重启APP的时候就会执行清理补丁动作,并会将版本回退到基线版本。
然后,等你慢慢整理好代码确保没问题之后,可以使用最新的代码基于最开始的基线版本,重新打个补丁,然后再重新发布。

tinker清除补丁对应日志如下:

image
image

参考:https://blog.csdn.net/u010386612/article/details/51077291等等

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,082评论 5 464
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,231评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,047评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,977评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,893评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,976评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,605评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,888评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,906评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,732评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,513评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,980评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,132评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,447评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,027评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,232评论 2 339

推荐阅读更多精彩内容