如何使用Gradle的copy命令

由于在工程中使用了Proguard,会生成相关的混淆结果文件,比较重要的是mapping.txt, 当app报错时,堆栈信息需要使用这个文件进行恢复到混淆前的代码。当AndroidStudio进行重新编译时,会覆盖这个文件,所以我希望在每次成功Release后,自动将mapping备份到一个文件夹,并以versioncode命名该文件夹,方便以后查找。
于是我找到了gradle的官方文档中的copy命令,仿照示例,写了一个task,如下:


task copyMapping (type: Copy) {
    doLast {
        from 'build/outputs/mapping/release/mapping.txt'
        into{'proguardLog/'}
        rename('mapping.txt','mapping'+ android.defaultConfig.versionCode +'.txt'
    }
}

尝试执行该task,查看了一下proguardLog目录,mapping666.txt 成功被复制到该目录。但似乎高兴的有点早,当我尝试再次执行这个task时,怎么也不执行了,于是到gradle的执行log中找找答案吧。
发现了一些问题,log大概如下:

...
Determining if task ':copyMapping' is up-to-date
skipping the task as it has no source files.
...

这是Gradle进行的 up-to-date checking。
任何构建工具的一个重要部分是避免做了已经完成的工作的能力。 考虑编译过程。 一旦您的源文件被编译,就不用重新编译它们,除非改变了影响输出的东西,例如修改源文件或删除输出文件。 编译可能需要大量的时间,所以当不需要时跳过这个步骤可以节省大量的时间。这就是Gradle的增量构建功能(UP-TO-DATE)
那怎么跳过这个检查呢?请看如下代码:

task copyMethod {
    doLast {
        copy {
            from 'build/outputs/mapping/release/'
            into 'proguardLog/
            include 'mapping.txt'
        }
    }
}

官方文档给出了解释,当将任务用作复制源(即作为from()的参数)时,copy()方法无法保证任务依赖性,因为它是一种方法而不是任务。 因此,如果您将copy()方法作为任务操作的一部分,则必须显式声明所有输入和输出才能获取正确的行为。即需要显示使用copy命令,并使用include声明需要拷贝的文件。
那么如果我们想在copy任务中使用up-to-date检查该如何写呢?

task copyMethodWithExplicitDependencies{
    // up-to-date check for inputs, plus add copyTask as dependency
    inputs.file copyTask
    outputs.dir 'some-dir' // up-to-date check for outputs
    doLast{
        copy {
            // Copy the output of copyTask
            from copyTask
            into 'some-dir'
        }
    }
}

也就是使用inputs 和outputs对copy源和目标进行显示声明。

更多详细内容,可查看Gradle官方的user guide:
https://docs.gradle.org/current/userguide/userguide_single.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值