官方对于集成重要的几步已经有说明,详情请查看官方文档。这里只列出一些容易出错的几点。
1. 调用assembleDebug编译命令
将cmd 目录定位到项目根目录下(如c:testcode\tinker\tinker-sample-android)
gradlew assembleDebug
2. 编译报错:can’t get git rev, you should add git to system path or just input test value, such as ‘testTinkerId’
分析:出错代码在:build.gradle
|
|
此方法的调用:
|
|
可以看出getSha() 是用于获取一个字符串,作为TINKER_ID。
报错原因是:第一次clone下来代码,没有提交过,所以git HEAD里 获取不到 最后一次提交的hash值。导致tinkerId 写入manifest.xml失败。
如果需要使用这个值,操作方法为:
3. 打Patch包:
直接使用task:tinkerPatchVariantName(例如tinkerPatchDebug、tinkerPatchRelease)即可自动根据Variant选择相应的编译类型,补丁包与相关日志会保存在/build/outputs/tinkerPatch/
|
|
4. 自定义Application类
程序启动时会加载默认的Application类,这导致我们补丁包是无法对它做修改了。如何规避?在这里我们并没有使用类似InstantRun hook Application的方式,而是通过代码框架的方式来避免,这也是为了尽量少的去反射,提升框架的兼容性。
这里我们要实现的是完全将原来的Application类隔离起来,即其他任何类都不能再引用我们自己的Application。我们需要做的其实是以下几个工作:
5.Application代理类
为了使真正的Application实现可以在补丁包中修改,我们把Appliction类的所有逻辑移动到ApplicationLike代理类中。
|
|
|
|
为了隐藏你的Application类,我们更加推荐你使用tinker-android-anno在运行时生成你的Application类。这样保证你无法修改你的Application类,不会因为错误操作导致引入更多无法修改的类。
若采用Annotation生成Application,需要将原来的Application类删掉。到此为止,Tinker初步的接入已真正的完成,你已经可以愉快的使用Tinker来实现补丁功能了。
|
|
最终APP中不需要Application,只用一个ApplicationLike即可。Demo中完整代码如下:
|
|
6. Release的使用方法
Tinker的使用方式如下,以gradle接入的release包为例:
注意:
如果multiDexEnabled为true,将自动生成Tinker需要放在主dex的keep规则,你需要拷贝它到自己的multiDexKeepProguard文件中。这是因为它是一个单独的文件,而proguardFiles是一个list。输出路径为:build/intermediates/tinker_intermediates/tinker_multidexkeep.pro。 后你可以在build/outputs/tinkerPatch中找到输出的文件。
参考文档