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 允许直接的访问所有对象,或者通过更为方便的过滤器访问。

  1. android.applicationVariants.each { variant ->
  2. ....
  3. }

这三个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 文档。