作者 | 秦川小将
地址 | http://www.jianshu.com/p/d50817b6d622
声明 | 本文是 秦川小将 原创,已获授权发布,未经原作者允许请勿转载
Tinker 简介
Tinker 是微信官方的 Android 热补丁解决方案,它支持动态下发代码。.so 库以及资源库,让应用能够在不需要重复安装的情况下实现更新,当然也可以使用 Tinker 来更新你的插件。
Tinker 地址:https://github.com/Tencent/tinker
在接入 Tinker 之前我们先对 Tinker 的结构了解一下
Tinker主要包括一下几个部分:
1.gradle 编译插件:tinker-patch-gradle-plugin。
2.核心 SDK库:tinker-android-lib。
3.非 gradle 编译用户的命令行版本:tinker-patch-cil.jar。
Tinker 的已知问题:
1.Tinker 不支持修改 AndroidMainfest.xml,Tinker 不支持新增四大组件。
2.由于 Google Pay 的开发者条款限制,不建议在 GP 渠道动态更新代码。
3.在 Android N上,补丁对应用启动时有轻微的影响。
4.不支持部分三星 android-21 机型,加载补丁时会主动抛出“TinkerRuntimeException:checkDexInstall failed”异常。
5.由于各个厂商加固实现并不一致,在1.7.6以后的版本,Tinker 不在支持加固的动态更新。
6.对于资源替换,不支持修改 remoteView,例如 transition 动画,notification icon 以及桌面图标。
Tinker 的修复方案跟 Hotfix 的修复方案大同小异,都是在两个 apk 包上作比较然后生成 patch。下面对 Tinker 进行接入。
接入流程
在工程目录下的 build.gradle 中添加依赖库
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
// 编译插件tinker-patch-gradle-plugin
classpath 'com.tencent.tinker:tinker-patch-gradle-plugin:1.7.7'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
在工程 app 目录下的 build.gradle 中添加依赖库
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
......
//可选,用于生成application类
provided('com.tencent.tinker:tinker-android-anno:1.7.7')
//tinker的核心库
compile('com.tencent.tinker:tinker-android-lib:1.7.7')
}
API引入
一般我们都是在 Application中onCreate() 中做初始化和加载 patch,不过 Tinker 推荐如下写法。因为程序启动时会加载默认的Application 类,这导致我们补丁包是无法对它做修改了。为了规避这个问题 Tinker 通过代码框架的方式来避免,这也是为了尽量少的去反射,提升框架的兼容性。
@DefaultLifeCycle(
application = ".AppContext", flags = ShareConstants.TINKER_ENABLE_ALL
)
public class AppContextLike extends ApplicationLike {
public AppContextLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
}
@Override
public void onCreate() {
super.onCreate();
TinkerInstaller.install(this);
}
}
代码中 AppContextLike 继承了 ApplicationLike,而ApplicationLike 并非集成 Application,而是类似于 Application 的一个类。Tinker 建议编写一个 ApplicationLike 的子类,可以当做Application 使用,注意顶部的注解:
<application
android:name=".AppContext"
......
</application>
写完后会报红,此时只需要 Build 下即可解决报红。Application 配置就到此结束。接下来生成 patch 文件。因为 patch 文件是写入到SDCrad 的,所以我们需要在 AndroidManifest 中添加如下权限(注: 6.0及已上系统请动态设置权限或者手动在设置中为项目设置):
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Tinker 需要在 AndroidManifest.xml 中指定 TINKER_ID
<meta-data
android:name="TINKER_ID"
android:value="tinker_id_100" />
Patch生成
patch生成官方提供了两种接入方式:
1.基于命令行的方式。
2.gradle编译的方式。
-
gradle 编译生成 patch
微信 Tinker 的 gradle 配置也很简单,先来浏览一下 Tinker 接入指南,点击进入查看,对使用 gradle 配置的参数了解一下,接下来附上一个相对比较完整的 gradle 配置。
gradle 配置就到此结束了,要注意的地方有以下几点:
1.ext 相关配置,示例中有完整描述。
2.Tinker 插件 apply plugin: 'com.tencent.tinker.patch'
3.全局信息相关配置 tinkerPatch
配置完这些东西以后就可以调用 tinkerPatch 命令生成 patch 补丁文件。tinkerPatch 有 Debug 和 Release 两种模式,因为是案例,所以就使用 tinkerPatchDebug 命令。
注意:调用 tinkerPatchDebug 命令之前需要修改 ext 相关配置,ext 相关配置已基准 apk 包为准。
结束
到此微信 Tinker 热修复 gradle 配置结束。
案例地址:https://github.com/mengjingbo/TinkerApp
送书活动