本文是通过借鉴网上一些前辈的经验加上本人遇到一些问题的总结编写,如有错误还望不吝指正。
Tinker开源框架 https://github.com/Tencent/tinker
首先找到我们需要下载的demo工程——tinker-sample-android
接下来使用Android studio 导入工程
如果报以上错误,请按如下方法进行解决:
1、打开工程根目录下的build.gradle,看到如下的情况
将
classpath "com.tencent.tinker:tinker-patch-gradle-plugin:${TINKER_VERSION}"
改成
classpath "com.tencent.tinker:tinker-patch-gradle-plugin:1.7.1"
接下来是:
2、打开app/build.gradle,如下:
将
compile("com.tencent.tinker:tinker-android-lib:${TINKER_VERSION}") { changing = true } compile("com.tencent.tinker:tinker-android-anno:${TINKER_VERSION}") { changing = true }
改成如下:
//可选,用于生成application类 compile('com.tencent.tinker:tinker-android-anno:1.7.1') //tinker的核心库 compile('com.tencent.tinker:tinker-android-lib:1.7.1')
接下里我们同步一下gradle
还是报错了是吧,是不是下面这个错误呢?
我们大致可以看出好像是tinkerId 没有设置的问题,那么我们现在就给他设置一下吧!
下面方法时参考点击打开链接
在app的build.gradle文件中找到tinkerId = getTinkerIdValue()
并将其替换成tinkerId = "tinkerId"
,其中后面的值可以随意设置.
再替换ignoreWarning = false
为ignoreWarning = true
接下来我们在同步一下gradle
ok,终于不报错了
好的,接下来我们开始正式的使用Tinker,看看它到底有哪些修复功能。
首先,我们运行工程,运行的成功,在工程文件的app/build/bakApk/下将会生成一个debug签名的apk文件,这个apk就算是我们热修复之前的带bug的“old apk”,我们复制他的全名例如:
app-debug-1027-14-50-44.apk 然后继续回到我们app/build.gradle 搜索找到tinkerOldApkPath位置,更改后面的path为之前apk全称。
接下来,我们需要对有bug的应用进行修改:
我们修改java代码、资源文件等等,至于能不能修复请自行测试,这里只做方法介绍。
比如我们作如下修改:
打开MainActivity.class 我们加一句Log
更改String资源文件:
我们在试试更改布局文件看看效果如何:
接下里就是生成补丁咯
调用tinkerPatchDebug生成补丁文件
,其实就是在Android Studio中的Teriminnal中执行,需要注意的是调用该命令前需要加上 ./gradlew
前缀,完整的命令是:
./gradlew tinkerPatchDebug
如果你和我一样用上面这段是出现:不是内部命令的提示,那么请只输入gradlew tinkerPatchDebug
回车执行(不着急需要执行一小会儿时间)
直到我们看到如下:
没错 生成成功了,那么你可能就要问了文件呢?
不着急这就告诉你在哪里,我们在命令行往上翻看看最后生成的文件到底在哪里
原来在这里,赶紧去看看有没有
这个就是我们的差异文件,接下来就是如何打补丁了。
我们将生成的文件patch_signed_7.zip 拷贝到手机内存中
肯定有人就要说,应该可以改位置吧,没错,我们可以在MainActivity.class中,指定读取补丁文件的路径和名字
放好补丁到指定位置后,我们运行上次跑的“old apk”
好吧,我已经迫不及待要打补丁了 LOAD PATCH单击它加载补丁然后看到成功字样。
据官方介绍由于
There are some issues which Tinker can't dynamic update.
- Can't update AndroidManifest.xml, such as add Android Component.
- Do not support some Samsung models with os version android-21.
- Due to Google Play Developer Distribution Agreement, we can't dynamic update our apk.
所以我们不是即使生效,所以我们需要单击KILL SELE 杀掉程序
接下来,重新打开程序
测试结果如下:
对于补丁文件,可以加载(Load)也可以清除(Clean)
对于修复范围,包括java代码,资源文件(字符串文件、xml文件、drawable文件等)还有一些没有测
给张网上传的图吧