在使用gradle构建android应用的过程中,build tools提供的标准gradle task有时没法满足自己的要求(比如上传、自动构建),或者有些问题需要一些自定义task才可以解决(比如使用自定义task动态修改一些文件),这个时候就需要自定义task并结合标准task一起在构建版本的过程中达到自己的目的,那么如何让自己写的task能放在指定标准task后运行呢?(或者说hack)
以我最近解决的问题为例,因为公司的产品使用了百川的jar包和so文件,但在使用build tools2.2.0的过程中,发现要打包的so文件被构建系统修改了(官方bug,询问无果,暂无解),导致了阿里云推送无法正常工作,于是我编写了一个task,在即将打包时,把正常的so文件替换掉损坏的so文件,实现如下:
//开始--》移动正常的so文件到打包目录中
task moveLibToTrip(type: Copy) {
from "bctrouble/armeabi/libsecuritysdk-3.1.27.so"
into "$buildDir/intermediates/transforms/stripDebugSymbol/CouponSimpleChinese/debug/folders/2000/1f" +
"/main/lib/armeabi/"
}
task moveLibToTrip2(type: Copy) {
from "bctrouble/x86/libsecuritysdk-3.1.27.so"
into "$buildDir/intermediates/transforms/stripDebugSymbol/CouponSimpleChinese/debug/folders/2000/1f" +
"/main/lib/x86/"
}
afterEvaluate {
tasks.matching {
it.name.startsWith('process') && (it.name.endsWith('ReleaseJavaRes') || it.name.endsWith
('DebugJavaRes'))
}.each { tk ->
tk.dependsOn(moveLibToTrip,moveLibToTrip2)
}
}
//结束
可以看到,这里实现了task moveLibToTrip,moveLibToTrip2先于以process开头以ReleaseJavaRes或DebugJavaRes结尾的标准task执行(当然还可以写成it.name.equals(***),语法类似Java)。