集成指南
直接按官网文档步骤来就行,参考以下资料:
问题记录
1.打多渠道补丁包时遇到的问题
发现问题
由于项目配置了打包命名规则:
android.applicationVariants.all { variant ->
//自定义打包命名规则
def outputApkName = "tfysy_v${variant.versionName}_${variant.versionCode}.apk"
variant.outputs.all {
outputFileName = outputApkName
}
}
导致多渠道打包assembleRelease后tinker自动备份的文件是这样的:

tinker脚本配置为buildAllFlavorsDir = "${bakPath}/${baseApkDir}",这个就是表明要对每个渠道打多渠道补丁,然后执行buildAllFlavorsTinkerPatchRelease打多渠道补丁,这样就会提示如下错误:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:tinkerPatchBaiduRelease'.
> old apk D:\Project\Android\yishengyue_tianfu\app\build\bakApk/app-0927-10-39-35/baidu/app-baidu-release.apk is not exist, you must set the correct old apk value!
提示找不到基准包,再看基准包的名字是app-baidu-release.apk,这和前面备份的包名字不一样,所以就会找不到基准包。
解决问题
既然是因为命名的问题,这里就要通过命名规则来入手。
- 方案一:不使用自定义命名规则,直接删除掉命名规则,使用默认命名。
- 方案二:设置备份文件的命名规则以满足tinker的读取的基准包命名规则:
在tinker-support.gradle文件中添加如下配置:
def date = new Date().format("MMdd-HH-mm-ss")
/**
* bak apk and mapping
*/
android.applicationVariants.all { variant ->
//自定义打包命名规则
def outputApkName = "tfysy_v${variant.versionName}_${variant.versionCode}.apk"
variant.outputs.all {
outputFileName = outputApkName
}
/**
* task type, you want to bak
*/
def taskName = variant.name
tasks.all {
if ("assemble${taskName.capitalize()}".equalsIgnoreCase(it.name)) {
it.doLast {
copy {
//备份文件前缀
def bakFilePrefix = "${project.name}-${variant.baseName}"
def destPath = "${bakPath}/${project.name}-${date}/${variant.flavorName}"
from variant.outputs.first().outputFile
into destPath
rename { String fileName ->
fileName.replace(outputApkName, "${bakFilePrefix}.apk")
}
from "${buildDir}/outputs/mapping/${variant.dirName}/mapping.txt"
into destPath
rename { String fileName ->
fileName.replace("mapping.txt", "${bakFilePrefix}-mapping.txt")
}
from "${buildDir}/intermediates/symbols/${variant.dirName}/R.txt"
into destPath
rename { String fileName ->
fileName.replace("R.txt", "${bakFilePrefix}-R.txt")
}
}
}
}
}
}
现在打多渠道包assembleRelease后tinker自动备份的文件是这样的:

buildAllFlavorsTinkerPatchRelease打多渠道补丁,就不会报错了。