Gradle功能强大,可以实现非常多的自动化任务, 下面以我工作中实际用到的SDK自动打包为例说明下。
1、背景:做过SDK开发或是接入过第三方SDK的都知道,SDK是有个完整包的,里面包含了示例的demo工程、接入文档、demo的apk包等,每次开发测试完成就都需要操作一遍:将最新demo工程和lib工程(或是aar)复制出来到一个目录下,同时还有demo的apk和最新的接入文档,然后操作压缩,打包成压缩包提供出去。这时候就想到了gradle的自动化任务。
2、研究过程:首先想到的是自定义Task,但是后来发现需要编译,发布等等操作,所以换了个思路,通过编写gradle脚本代码来实现,先看下初版的:
task CopyDemoTask(type:Copy) {
from("${projectDir}/../app")
into("${projectDir}/../doc/demo")
exclude [".settings", "build", "bin", "gen", "*.iml", "lint.xml", "proguard", "build.gradle", "project.properties"]
rename("build.bak.gradle", "build.gradle")
}
ps:由于项目最早是由Eclipse转过来的,所以还保留支持Eclipse的开发方式,还保留有.settings、bin、gen、lint.xml、project.properties等文件或文件夹
代码说明:从app module拷贝除了剔除的文件(为非AndroidStudio必须文件或编译的本地目录)外的所有文件到doc/demo目录下,同时将build.bak.gradle文件重命名为build.gradle,因为我们原始用到的build.gradle文件包含了一些自动化打包以及调试控制的逻辑,所以重新写了一份可以正常提供给外部的比较纯净的build.gradle文件
然后最终提供出去的包含Eclipse和AndroidStudio2种接入方式的2个demo,需要写的复制Task有10个,而且lib工程中也需要写4,5个复制Task,最终就想说可不可以抽出公共部分,通过函数定义的方式来实现复用
3、对创建task进行复用封装: