转载请标明出处:http://blog.csdn.net/qq_33408235/article/details/78357259
本人github:https://github.com/niezhiyang
1. 热修复概述
热修复说白了就是”打补丁”,比如你们公司上线一个app,用户反应有重大bug,需要紧急修复。如果按照通
常做法,那就是程序猿加班搞定bug,然后测试,重新打包并发布。这样带来的问题就是成本高,效率低。于是,热
修复就应运而生.一般通过事先设定的接口从网上下载无Bug的代码来替换有Bug的代码。这样就省事多了,用
户体验也好。
2.Tinker的概述(本介绍是从官网上截取的)
Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。当然,你也可以使用Tinker来更新你的插件。
它主要包括以下几个部分:
- gradle编译插件:
tinker-patch-gradle-plugin
- 核心sdk库:
tinker-android-lib
- 非gradle编译用户的命令行版本:
tinker-patch-cli.jar
2.1 Tinker和阿里的AndFix、美团的Robust以及QZone的比较
Tinker | QZone | AndFix | Robust |
---|---|---|---|
类替换 | yes | yes | no |
So替换 | yes | no | no |
资源替换 | yes | yes | no |
全平台支持 | yes | yes | yes |
即时生效 | no | no | yes |
性能损耗 | 较小 | 较大 | 较小 |
补丁包大小 | 较小 | 较大 | 一般 |
开发透明 | yes | yes | no |
复杂度 | 较低 | 较低 | 复杂 |
gradle支持 | yes | no | no |
Rom体积 | 较大 | 较小 | 较小 |
成功率 | 较高 | 较高 | 一般 |
总的来说:
- AndFix作为native解决方案,首先面临的是稳定性与兼容性问题,更重要的是它无法实现类替换,它是需要大量额外的开发成本的;
- Robust兼容性与成功率较高,但是它与AndFix一样,无法新增变量与类只能用做的bugFix方案;
- Qzone方案可以做到发布产品功能,但是它主要问题是插桩带来Dalvik的性能问题,以及为了解决Art下内存地址问题而导致补丁包急速增大的。
特别是在Android N之后,由于混合编译的inline策略修改,对于市面上的各种方案都不太容易解决。而Tinker热补丁方案不仅支持类、So以及资源的替换,它还是2.X-7.X的全平台支持。利用Tinker我们不仅可以用做bugfix,甚至可以替代功能的发布。Tinker已运行在微信的数亿Android设备上,那么为什么你不使用Tinker呢?
2.2 Tinker的已知问题
由于原理与系统限制,Tinker有以下已知问题:
- Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;//如果要想
- 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
- 在Android N上,补丁对应用启动时间有轻微的影响;
- 不支持部分三星android-21机型,加载补丁时会主动抛出
"TinkerRuntimeException:checkDexInstall failed"
; - 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标
3. Tinker 接入指南
其实官网说的已经差不多了,只是想实践一下,并且把坑给大伙填平,接入的方式有两种接入办法
- gradle接入(官网推荐的,也是本篇介绍的方法)
- 命令行接入(本篇不介绍)
3.1 添加依赖
- 在根目录下的build.gradle中,添加
tinker-patch-gradle-plugin
的依赖
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.8.0')// tinker的pluggin