前言:当前市面上为了实现不发新版本的前提下实现修改线上严重bug的目标而诞生的热补丁方案有很多,其中比较出名的有阿里的AndFix、美团的Robust以及腾讯的Tinker等等,但是其中用的比较广的还是腾讯的Tinker,所以在这里我也是选取了Tinker作为学习研究对象。
在文章开始之前先copy一个不同方案的对比图,就可以知道Tinker的强大之处:
虽然Tinker和其他方比较显得是很强大的,但是它也有自己的一些问题。由于原理与系统限制,Tinker有以下已知问题:
-
Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;
-
由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
-
在Android N上,补丁对应用启动时间有轻微的影响;
-
不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed";
-
对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标;
在对Tinker有个简单了解后,下面我们就开始在项目中一步步集成Tinker了。
1.先去Tinker平台注册一个AppKey,后面会使用到。
2.项目添加 gradle 远程仓库插件依赖。
buildscript {
repositories {
//mavenLocal()
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
//无需再单独引用tinker的其他库
classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:${TINKERPATCH_VERSION}"
}
}
3.集成 TinkerPatch SDK 添加 denpendencies 依赖。
//若使用annotation需要单独引用,对于tinker的其他库都无需再引用
annotationProcessor("com.tinkerpatch.tinker:tinker-android-anno:${TINKER_VERSION}") { changing = true }
compileOnly("com.tinkerpatch.tinker:tinker-android-anno:${TINKER_VERSION}") { changing = true }
implementation("com.tinkerpatch.sdk:tinkerpatch-android-sdk:${TINKERPATCH_VERSION}") { changing = true }
4.新建tinkerpatch.gradle文件。
先贴出示例文件:
apply plugin: 'tinkerpatch-support'
/**
* TODO: 请按自己的需求修改为适应自己工程的参数
*/
def bakPath = file("${bu