近期遇到一个需求,由于很少研究gradle相关,所以在实现上卡了一阵子,现已基本实现需求,回过头来记录一下。
需求:
项目中接入腾讯bugly,使用其热更新功能,由于热更新目前不支持自定义补丁包的生成路径,因此会产生一个问题就是,补丁包生成后位于build/outputs/patch文件夹中,有时会执行clean后,导致patch文件夹刷没了。补丁包就会忘记保存,因此想在生成补丁包时,将生成后的补丁包复制到其他文件夹中,便于保存。
思路:
① 重新配置一个复制task,然后补丁包task执行完后,手动再去执行复制task。
结果:当补丁包task执行完后,再去手动执行复制的task,此时build会刷新,出现patch文件夹刷没了的情况。
②重写生成补丁包的task
结果:我直接拿到buildTinkerPatchReleaset名次进行重写,结果报错(觉得是重写方法不对,请赐教)
③因为在.gradle中打补丁包时,会执行复制基线包的方法,所以打算在这个方法中,增加一个复制补丁包的方法;
tasks.all {
if ("assemble${taskName.capitalize()}".equalsIgnoreCase(it.name)) {
it.doLast {
copy {
def fileNamePrefix = "${project.name}-${variant.baseName}"
def newFileNamePrefix = "KT_HPP_1.2.00-${date}"
def destPath = hasFlavors ? file("${bakPath}/${project.name}-${date}/${variant.flavorName}") :
bakPath
from variant.outputs.outputFile
into destPath
rename { String fileName ->
fileName.replace("${fileNamePrefix}.apk", "${newFileNamePrefix}.apk")
}
//在此处增加一个from into方法
from "地址"
into "地址"
from "${buildDir}/outputs/mapping/${variant.dirName}/mapping.txt"
into destPath
rename { String fileName ->
fileName.replace("mapping.txt", "${newFileNamePrefix}-mapping.txt")
}
from "${buildDir}/intermediates/symbols/${variant.dirName}/R.txt"
into destPath
rename { String fileName ->
fileName.replace("R.txt", "${newFileNamePrefix}-R.txt")
}
}
}
}
}
结果:会把基线版本复制到了补丁包应该去的文件,gradle顺序执行出现这个操蛋问题也是招笑。(目前原因也没找到)
④监听补丁包task执行状态,在他结束后,在去执行cp补丁包task
结果:监听方法未实现。。。(请赐教留言)
⑤监听build文件变化
结果:将该方法放置在第③点的代码里,神奇的是未生效,猜测原因是,基线版本在复制时,实际是执行了补丁包复制方法,但是此时补丁包应该是在生成中,还没放置到的patch目标文件夹中,所以没有生效(原因是否正确未知)
⑥任务依赖
配置一个复制task,依赖于生成补丁包task,生成补丁包task执行顺序位于复制之前,执行复制task时,就会先生成补丁包然后再去执行复制。
def patchSource = "${buildDir}/outputs/patch/release";
def patchCopy ="${rootDir}/patchApk"
task generatePtachRelease (type: Copy) {
dependsOn ':app:buildTinkerPatchRelease'
//切记不要加doFirst
from patchSource
into patchCopy
}
再去执行generatePtachRelease 时,会首先去执行app:buildTinkerPatchRelease任务,然后在执行复制,至此基本实现本需求。
应该还有更好方法,耐于功力有限,还请大伙多多指教实现方法。