ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
八、细节 1、打包步骤 1)debug 打包 1.调用assembleDebug 编译得到一个debug 签名的apk(old apk),这是基础apk。 2.修改代码、更新res 文件、so 等。 3.将old apk 按gradle 中的参数规则,重命名为指定名字,还是放在bakApk目录下(该目录可更改)。 4.调用tinkerPatchDebug 生成补丁包于/build/outputs/tinkerPatch/目录(默认是patch_signed_7zip.apk)。 5.将补丁包复制到SD 卡目录下(目录可更改),在程序中调用打补丁方法,重启app 即可实现热修复。 2)release 打包步骤 1.调用assembleRelease 编译得到一个release 签名的apk(old apk),这是基础apk,还有一个mapping 文件。 2.修改代码、更新res 文件、so 等。 3.将old apk 与mapping 文件按gradle 中的参数规则,分别重命名为指定名字,还是放在bakApk 目录下(该目录可更改)。 4.调用tinkerPatchRelease 生成补丁包于/build/outputs/tinkerPatch/目录(默认是patch_signed_7zip.apk)。 5.将补丁包复制到SD 卡目录下(目录可更改),在程序中调用打补丁方法,重启app 即可实现热修复。 因为调用tinker 的release 打包需要用到签名文件的信息,所以还必须在app的build.gradle 中配置好签名文件。 ``` android { ... 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") } } ... buildTypes { release { minifyEnabled true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), project.file('proguard-rules.pro') } debug { debuggable true minifyEnabled false signingConfig signingConfigs.debug } } } ``` ![](https://img.kancloud.cn/32/6e/326e50a53c624a83027b3495ce17463e_1013x486.jpg) 其实说白了,debug 与release 打包的差别,除了执行的命令不一样之外,release 打包比debug 打包多用到2 个文件(mapping.txt、R.txt)。 2、使用tinker 的注意事项与发现 1.tinker 编译时需要禁用instant run。 2.tinker 需要MultiDex。 3.上架前用assembleRelease 编译得到的apk、mapping.txt、R.txt 这3 个文 件要备份好,制作补丁时会用到。 4.多个补丁包的版本一样时,不影响打补丁(如:第一次补丁版本是1.0,第二 次补丁还是1.0 版本,是可以成功打上第二次补丁的)。 5.成功打上补丁后,补丁原文件会被删除,故项目中不必担心补丁原文件清理的 问题。 3、可能会遇到的错误 1)onLoadPatchListenerReceiveFail code 为-2 报错原文如下: ``` receive a patch file: /storage/emulated/0/patch_signed_7zip.apk, file size:3604 patch loadReporter onLoadPatchListenerReceiveFail: patch receive fail: /storage/emulated/0/patch_signed_7zip.apk, code: -2 ``` 出现这种情况,请按如下两步进行排查: 1.查看文件路径是否正常。 2.查看清单文件中是否有添加SD 卡访问权限。 2)onLoadPatchListenerReceiveFail code 为-24 报错原文如下: ``` receive a patch file: /storage/emulated/0/patch_signed_7zip.apk, file size:3665 get platform:null patch loadReporter onLoadPatchListenerReceiveFail: patch receive fail: /storage/emulated/0/patch_signed_7zip.apk, code: -24 ``` 提示很明显,Tinker 获取不到platform 的值,请检查在app 的build.gradle文件中是否有如下配置,这部分配置了Tinker 补丁包支持的平台与版本号: ``` packageConfig { configField("platform", "all") configField("patchVersion", "1.0") } ```