1.tinker的demo在什么位置:
如图所示,clone下来之后把这个圈出来的工程拷贝出来,单独打开。
2.开始测试之前的准备工作:
先推荐一些这个过程之中对我有帮助的资料,然后再总结下我学习所得:
http://www.trojx.me/2016/09/28/tinker-sample-introduction/
http://www.jianshu.com/p/19906d3012e9
由于tinker的差分包和基准包都是通过gradle task来实现的,那么就会牵扯到一个问题,gradle task该如何运行?这里我录了一个gif(作为菜鸟的我当初找了老半天才找到这个区域 -.-!)。
2.生成基准包:
ok,知道了gradle task在哪个地方之后,生成基准包的task在如下位置(debug/release):
Task/tinker/tinkerPatchDebug
Task/tinker/tinkerPatchRelease
运行了这俩个task之后呢,我们去build文件夹下边能看到生成的基准包:
app/build/bakApk/xxx.apk
这个apk的路径比较重要,因为它决定以谁为基准来生成补丁。
2.生成差分包(补丁):
生成差分包则是需要配置好基准包的路径之后,再基于这个基准包进行代码修改,然后再对其进行编译(同上面步骤),生成补丁。
配置基准包的路径:
ext {
//for some reason, you may want to ignore tinkerBuild, such as instant run debug build?
tinkerEnabled = true
//for normal build
//old apk file to build patch apk > 老基准包 生成查分包时用是以它为基准
tinkerOldApkPath = "${bakPath}/app-debug-1101-19-35-29.apk"
//proguard mapping file to build patch apk >
tinkerApplyMappingPath = "${bakPath}/app-debug-1018-17-32-47-mapping.txt"
//resource R.txt to build patch apk, must input if there is resource changed
tinkerApplyResourcePath = "${bakPath}/app-debug-1018-17-32-47-R.txt"
//only use for build all flavor, if not, just ignore this field
tinkerBuildFlavorDirectory = "${bakPath}/app-1018-17-32-47"
}
我们去把这个改了,tinkerOldApkPath = “${bakPath}/app-debug-1101-19-35-29.apk”
然后去修改补丁包的代码:
比如原来textview的字样是 “刺激刺激刺激刺激刺激刺激”,现在我把MainActivity的textView字样设置为了 “天干物燥天干物燥天干物燥”
然后再去找到生成的补丁包,路径如下:
app/build/outputs/tinkerPatch/debug/patch_signed_7zip.apk
3.热修复:
生成了补丁包之后,我们需要去加载这个补丁包,核心代码:
TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), Environment.getExternalStorageDirectory().getAbsolutePath() + “/patch_signed_7zip.apk”);
这个本地地址可以我们自定义,这行代码的含义就是tinker内的源码对2个apk的一个合并操作了,具体内部怎么实现,还需要研究下它的源码,注意tinker加载了差分包之后,得重新启动app才行。
4.加载补丁是否成功验证:
就目前的操作,我得到了基准包 app-debug-1102-13-14-57.apk,也得到了补丁 patch_signed_7zip.apk。
现在我去把补丁文件拷贝到(程序内指定的)路径位置,下边的日志是我从我的小米5测试机上打印出来的:
E/补丁路径: /storage/emulated/0/patch_signed_7zip.apk
确定目标文件存在正确的位置:
然后打开基准包demo,点击load tinker:
回想一下,基准包的textView是”刺激刺激刺激刺激刺激刺激”,补丁包的textView是”天干物燥天干物燥天干物燥”
当出现了这个吐司时候表示合成成功:
然后再点击killSelf重启app,呈现了补丁打完之后的效果:
本文测试用的demo apk:
http://download.csdn.net/download/user11223344abc/10111457
下载下来之后,先将基准包装上,再将补丁包放在指定目录位置,点击demo内的加载补丁后重启APP就行了。