为什么使用Tinker
-
大家都知到线上的项目,最怕的事情是出了bug,这就意味这得重新发版本,这一直以来就是很头疼的事情,所以增量更新是一个必然的趋势,在用户没有感知的情况修复bug,也不用加班赶着上新版本,剩余的时间好处很多,老司机都懂!
Tinker的介绍
- 废话不说先上地址
Tinker - Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新
- 建议大家使用gradle的接入方式,一来可以很方便的集成,二来版本更新的时候只需要修改gradle配置文件,但是还是不建议项目初期就导入这个东西,可以在项目上线后在接入,目前Tinker不支持Instant Run,需要在Setting中取消Enable Instant Runx选项,下面是接入的方法
- 在项目的[build.gradle]中,添加tinker-patch-gradle-plugin的依赖
buildscript {
dependencies {
classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.11')
}
}
- 然后在app的gradle文件[app/build.gradle]我们需要添加tinker的库依赖以apply tinker的gradle插件
dependencies {
//可选,用于生成application类
provided('com.tencent.tinker:tinker-android-anno:1.7.11')
//tinker的核心库
compile('com.tencent.tinker:tinker-android-lib:1.7.11')
}
...
...
//apply tinker插件
apply plugin: 'com.tencent.tinker.patch'
- 配置好这些之后我们可以下载官方的demo找到 build.gradle文件,从build.gradle 的第127行开始复制粘贴到自己的app/build.gradle文件中
def bakPath = file("${buildDir}/bakApk/")......
4.注意配置apk路径
ext {
//for some reason, you may want to ignore tinkerBuild, such as instant run debug build?
tinkerEnabled = true
//for normal build
//旧版本apk路径配置
tinkerOldApkPath = "${bakPath}/app-debug-xxxx-14-05-21.apk"
//用于混淆,没有混淆可以不管
tinkerApplyMappingPath = "${bakPath}/app-debug-xxxx-14-05-21-mapping.txt"
//旧版本apk R文件
tinkerApplyResourcePath = "${bakPath}/app-debug-xxxx-14-05-21-R.txt"
//only use for build all flavor, if not, just ignore this field
tinkerBuildFlavorDirectory = "${bakPath}/app-debug-xxxx-14-05-21"
}
5.新建自己的Application
继承DefaultApplicationLike 并重写onBaseContextAttached ,框架会自动生成所需要的application
打开自己的AndroidManifest.xml 在application 节点下配置android:name=”xxx.xxx.xxx.xxxApplication”
由于我们的项目已有自己的Application,为了避免改动可以将项目中的Application 继承TinkerApplication(此时onCreate方法会报错),去掉onCreate方法,将onCreate方法中的初始化操作单独抽一个init方法出来,再合适的时机进行调用,例如MainActivity,这样我们其他引用Application的地方都不需要改动。
接下来就很简单了,在as右边找到Gradle projects下的Tinkerr然后build
这时我们打开 app/build/output发现多了一个tinkerPatch 文件夹,其中patch_signed_7zip.apk 就是我们的补丁文件
接下在合适的时候加载补丁,就可以实现热更新!
重要重要重要,如果要打补丁包,不要直接提交修复BUG后的代码 一定要先保存一个基准包(这里的基准包其实就是指你的线上发版的包,可以建立一个包来专门保存这些apk文件)
Tinker目前存在的问题
1.Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;
2.由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
3.在Android N上,补丁对应用启动时间有轻微的影响;
4.不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed";
5.对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。