IBigerBiger的成长之路

热修复Tinker(一)介绍与接入

2016对于整个Android的开发来说是一个各种技术爆发的一年,特别是有一阵子的热修复,插件化相关,各家都开源了自己相关的库,而这些相关的东西虽然并不受谷歌与国外开发者的推崇,但是随着各种产品的业务需求增长,用户对于体验的提升,这样技术的出现也是必然的阶段,至于后面移动开发的方向我们不得而知,但是对于热修复,插件化这一系统的关于HOOK相关的知识,了解与学习是提升自生能力的比较好的途径,所以对于现在市场上的主流相关库的使用与相关源码的解析是很有必要的!

关于热修复

热修复如其名一样,动态及时的去修复线上的bug,不需要用户重新下载APP,重新安装,也避免了应用重新发包各大应用市场的麻烦。

目前热修复主要方案如下

  • 从NATIVE层入手,主要是阿里系的AndFix,Dexposed等
  • 从Classloader入手,主要是QQ空间补丁方案,NUWA,以及Tinker等

这一篇主要是介绍以Classloader方案的Tinker

首先我们要了解下整个Tinker的整个运行的流程

Tinker运行流程

Tinker的github地址如下https://github.com/Tencent/tinker/tree/dev

下载后会发现包含tinker-sample-android,这个就是官方提供的演示DEMO,导入后我们需要修改一些东西,找到build.gradle文件中tinkerId = getTinkerIdValue() 并将其替换成tinkerId = “tinkerId”(这里的值可以随意设置).再替换ignoreWarning = false 为ignoreWarning = true

1
2
tinkerId = getTinkerIdValue() ->tinkerId = "tinkerId"
ignoreWarning = false ->ignoreWarning = true

接下来运行编译代码打包debug apk并安装,我们会发现build路径下多出了一个bakApk文件夹如下


图1 bakApk文件夹

接下来需要修改build.gradle文件中相关东西,如下


图2 build.gradle文件中相关东西

这里的版本对应我们bakApk的apk版本就好了

接下来就是对代码进行修改

这里的修改其实代码本身就提供了,主要如下

R.string.test_resource对应的字符串资源的值

1
2
<!--<string name="test_resource">I am in the base apk</string>-->
<string name="test_resource">I am in the patch apk</string>

并且多增加一条log

1
Log.e(TAG, "i am on patch onCreate");

如下图


图3 增加log

代码已经修改好了,接下来就是打补丁包的过程了
在Gradle脚本中找到’app:/Tasks/tinker/tinkerPatchDebug’这条命令,执行即可以打补丁包了


图4 Gradle脚本

执行tinkerPatchDebug,如下


图5 执行tinkerPatchDebug

这里告诉了我们补丁包的位置,在build/outputs/tinkerPatch/debug中的patch_signed_7zip.apk文件,如下


图6 补丁包位置

接下来把这个补丁包放到手机指定的位置就可以了


图7 demoAPP

这时候点击LOAD PATCH的button将插件加载,提示成功后,点击KILL SELF结束当前进程

重新启动后,即可发现变化

首先看一下未加载补丁的LOG


图8 未加载补丁的LOG

接下来看加载补丁后的LOG


图9 加载补丁的LOG

到这里Tinker的使用流程就已经结束了,我们可看到了热修复的结果

至于接入呢,有了提供的demo,我相信这都不是事

写在后面的话

Tinker热修复成功了,那么接下来就是要去了解整个Tinker的运行原理,所以后面就是对Tinker相关的源码进行解析!peace~~~