tinker demo实现,注意点。

本文详细介绍了tinker热修复的实现过程,包括从github下载demo、设置tinkerId、签名打包、修改对比编译及合并差异。重点强调了tinkerId的唯一性和签名一致性对补丁加载成功的重要性。在遇到加载失败时,通过查看log信息进行问题排查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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时暂时遇到这几点问题。如有其它问题,请指出。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值