高级构建定制 - 操纵任务
7.2 操纵任务
普通的 Java 工程有一个有限的任务集合,这些任务相互配合创建一个输出。
classes 是一个编译Java源代码的任务。
在 build.gradle
中通过脚本访问和使用 classes 任务是很简单的。可以通过 project.tasks.classes
快捷访问。
对于 Android 工程来说就比较复杂了,因为可能有很多相同的任务,他们的名字是基于 Build Types和Product Flavors 生成的。
为了解决这个问题, android 对象提供了两个属性:
- applicationVariants (仅仅适用于 app plugin )
- libraryVariants (仅仅适用于 library plugin )
- testVariants (两种 plugin 都适用)
ApplicationVariant, LibraryVariant, and TestVariant 这三个对象都会分别返回一个DomainObjectCollection。
请注意访问这些集合中的任何一个都会触发生成所有的创建。这意味着访问这些集合后无须重新配置就会产生。
DomainObjectCollection 允许直接的访问所有对象,或者通过更为方便的过滤器访问。
android.applicationVariants.each { variant ->
....
}
这三个variant类都具有以下属性:
属性名 | 属性类型 | 说明 |
---|---|---|
name | String | variant的名字,必须是唯一的。 |
description | String | variant的可读性的描述 |
dirName | String | variant的子文件夹名称,必须是惟一的。可能还不止一个,比如 “debug/flavor1” |
baseName | String | variant输出的的基本名称,必须是唯一的。 |
outputFile | File | variant的输出,是一个可读写的属性 |
processManifest | ProcessManifest | 处理manifest的任务 |
aidlCompile | AidlCompile | 编译AIDL文件的任务 |
renderscriptCompile | RenderscriptCompile | 编译Renderscript文件的任务 |
mergeResources | MergeResources | 合并资源的任务 |
mergeAssets | MergeAssets | 合并资源的任务 |
processResources | ProcessAndroidResources | 处理和编译资源的任务 |
generateBuildConfig | GenerateBuildConfig | 生成BuildConfig类的任务 |
javaCompile | JavaCompile | 编译Java代码的任务 |
processJavaResources | Copy | 处理Java资源的任务 |
assemble | DefaultTask | 这个variant的assemble引导任务 |
ApplicationVariant类还有以下属性:
属性名 | 属性类型 | 说明 |
---|---|---|
buildType | BuildType | variant的BuildType。 |
productFlavors | List\ | variant的ProductFlavors,不能为空,但可以是空值 |
mergedFlavor | ProductFlavor | android.defaultConfig和variant.productFlavors合并 |
signingConfig | SigningConfig | 这个variant使用的SigningConfig对象 |
isSigningReady | boolean | 如果为true则说明variant已经具备签名所需的一切信息 |
testVariant | BuildVariant | 将会测试这个variant的TestVariant |
dex | Dex | dex代码的任务,如果variant是一个库可以为null |
packageApplication | PackageApplication | 生成最终AP看的任务,如果variant是一个库可以为null |
zipAlign | ZipAlign | zip压缩apk的任务,如果variant是一个库或者APK不能被签名可以为null |
install | DefaultTask | 安装任务,可以为null。 |
uninstall | DefaultTask | 卸载任务 |
LibraryVariant类还有以下属性:
属性名 | 属性类型 | 说明 |
---|---|---|
buildType | BuildType | variant的BuildType |
mergedFlavor | ProductFlavor | 就是defaultConfig |
testVariant | BuildVariant | 将要测试这个variant的Build Variant |
packageLibrary | Zip | 把库打包成一个AAR存档的任务,如果不是一个库值为Null |
TestVariant类还有以下属性:
属性名 | 属性类型 | 说明 |
---|---|---|
buildType | BuildType | variant的BuildType。 |
productFlavors | List\ | variant的ProductFlavors,不能为空,但可以是空值 |
mergedFlavor | ProductFlavor | android.defaultConfig和variant.productFlavors合并 |
signingConfig | SigningConfig | 这个variant使用的SigningConfig对象 |
isSigningReady | boolean | 如果为true则说明variant已经具备签名所需的一切信息 |
testVariant | BaseVariant | 将会测试这个variant的BaseVariant |
dex | Dex | dex代码的任务,如果variant是一个库可以为null |
packageApplication | PackageApplication | 生成最终AP看的任务,如果variant是一个库可以为null |
zipAlign | ZipAlign | zip压缩apk的任务,如果variant是一个库或者APK不能被签名可以为null |
install | DefaultTask | 安装任务,可以为null。 |
uninstall | DefaultTask | 卸载任务 |
connectedAndroidTest | DefaultTask | 在已连接的设备上运行android测试的任务 |
providerAndroidTest | DefaultTask | 使用扩展的API运行android测试的任务 |
Android特定任务类型的API
- ProcessManifest
- File manifestOutputFile
- AidlCompile
- File sourceOutputDir
- RenderscriptCompile
- File sourceOutputDir
- File resOutputDir
- MergeResources
- File outputDir
- MergeAssets
- File outputDir
- ProcessAndroidResources
- File manifestFile
- File resDir
- File assetsDir
- File sourceOutputDir
- File textSymbolOutputDir
- File packageOutputFile
- File proguardOutputFile
- GenerateBuildConfig
- File sourceOutputDir
- Dex
- File outputFolder
- PackageApplication
- File resourceFile
- File dexFile
- File javaResourceDir
- File jniDir
- File outputFile
- To change the final output file use “outputFile” on the variant object directly.
- ZipAlign
- File inputFile
- File outputFile
- To change the final output file use “outputFile” on the variant object directly.
每一个任务类型的 API 都会因为 Gradle 的工作方式以及 Android plugin 的设置受到限制。
首先,Gradle 限制只能配置任务的输入/输出以及一些可选的标志。所以,这里的这些任务只能定义输入/输出。
其次,大多数任务的输入并不唯一,通常会混合 sourceSets,Build Types 以及 Product Flavors。为了保持构建简单以及可读性,我们的目标是让开发者通过 DSL 通过这些对象修改构建,而不是深入的了解任务的输入和选项进而修改它们。
还要注意的是,除了 ZipAlign 任务类型,其他所有的任务都需要设置私有数据让他们运行。这就意味着不能基于这些类型手动的创建新的任务。
对于 Gradle 的任务(DefaultTask, JavaCompile, Copy, Zip),请参考 Gradle 文档。