tinker使用
1.从github上下载tinker的demo
tinker-sample-android github地址 https://github.com/Tencent/tinker.git
2.同步gradle
如果报错 Error:(28, 0) Cause: can't get git rev, you should add git to system path or just input test value, such as 'testTinkerId'
是提示你没有设置tinker的id。
解决方法:
1.给项目加一个git。
2.设置一个thinkerId,在下面代码上给一个thinkerID ,String gitRev = “testTinkerId”(id取值需谨慎,后面会介绍id的作用)
def gitSha() {
try {
String gitRev = 'git rev-parse --short HEAD'.execute(null, project.rootDir).text.trim()
if (gitRev == null) {
throw new GradleException("can't get git rev, you should add git to system path or just input test value, such as 'testTinkerId'")
}
return gitRev
} catch (Exception e) {
throw new GradleException("can't get git rev, you should add git to system path or just input test value, such as 'testTinkerId'")
}
}
然后再同步一下,应该没问题了。
TinkerId的官方定义:
tinkerId是用了区分基准安装包的,我们需要严格保证一个基准包的唯一性。在设计的初期,我们使用的是基准包的CentralDirectory的CRC,但某些APP为了生成渠道包会对安装包重新打包,导致不同的渠道包的CentralDirectory并不一致。
编译补丁包时,我们会自动读取基准包AndroidManifest的tinkerId作为package_meta.txt中的TINKER_ID。将本次编译传入的tinkerId, 作为package_meta.txt中的NEW_TINKER_ID。当前NEW_TINKER_ID并没有被使用到,只是保留作为配置项。如果我们使用git rev作为tinkerid, 这时只要使用git diff TINKER_ID NEW_TINKER_ID即可获得所有的代码差异。
我们需要保证tinkerId一定是要唯一性的,这里推荐使用git rev或者svn rev. 如果我们升级了客户端版本,但tinkerId与旧版本相同,会导致可能会加载旧版本的补丁。这里我们一定要注意,升级可客户端版本,需要更新tinkerId!
3.签名打包
studio –> Build –> Generate signed APK
注意,签名文件选择gradle里面配置签名文件!在tinker-sample-android\app\keystore文件夹下
signingConfigs {
release {
try {
storeFile file("./keystore/release.keystore")
storePassword "testres"
keyAlias "testres"
keyPassword "testres"
} catch (ex) {
throw new InvalidUserDataException(ex.toString())
}
}
debug {
storeFile file("./keystore/debug.keystore")
}
}
按照指示签名打包完毕。这时你的项目中会有刚刚打包生成的apk文件和一个xxx-R.txt文件(打包release版本的还会多一个xxxx-mapping.txt文件) 路径 app//build//bakApk
将apk文件安装到手机。
至此,apk已经安装到手机。这便是基准apk
4.修改对比编译
这时我们需要修改基准apk文件的内容,比如修改某个按钮的字段,或是添加一些view(暂不支持新增四大组件)。
然后将路径app//build//bakApk下的apk文件名复制到tinkerOldApkPath,R.txt复制到tinkerApplyResourcePath,如果是release版本还需将mapping.txt复制到tinkerApplyMappingPath
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}/xxxx.apk"
//proguard mapping file to build patch apk
tinkerApplyMappingPath = "${bakPath}/"
//resource R.txt to build patch apk, must input if there is resource changed
tinkerApplyResourcePath = "${bakPath}/xxxx-R.txt"
//only use for build all flavor, if not, just ignore this field
tinkerBuildFlavorDirectory = "${bakPath}/app-1018-17-32-47"
}
然后在studio右上角的gradle里面找到tinker下面的 tinkerPatchDebug (如果之前签名是release的,那么这里选择tinkerPatchRelease)
等待编译完成,会在 app//build//outputs 下生成tinkerPatch文件夹,里面能找到 patch_signed_7zip.apk文件。这便是 基准apk包和新apk包的差异文件补丁。
将patch_signed_7zip.apk拷到手机的根目录(在demo的MainActivity里面定义了文件名和位置,自己看看代码)。
5.合并差异
demo应用里面点击第一个按钮 load patch,如果 toast显示 patch success, please restart process。点击KILL SELF,在打开应用,就会发现新修改的字段添加的view就已经修复好了。
如果toast提示 patch fail, please check reason。这时就需要找问题了。
打开Android Monitor,查看LOAD PATCH时的log信息。 Regex 左边的筛选输入 tinker,右边的选项选择 No Filters。
自己查看log信息,如果log报错说签名有问题,那是因为两次签名不一致导致的。确认步骤3里面是否使用了demo给的签名文件。如果还是不行,自己配置新的签名文件吧。
其他的问题我再没有遇到了。如果有遇到问题,不要急躁,再多找找原因,log信息很重要,找到错误原因,自己动手解决要比伸手问人爽多了。不鼓励伸手党。
至此tinker的demo使用完成。
使用demo时暂时遇到这几点问题。如有其它问题,请指出。