近期遇到一个需求,由于很少研究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任务,然后在执行复制,至此基本实现本需求。


应该还有更好方法,耐于功力有限,还请大伙多多指教实现方法。