# 操作 task
一般的 Java 项目中有一组有限的 task 用于互相处理并最终生成一个输出。
**classes** 是一个编译 Java 源代码的 task。
可以在 *build.gradle* 文件中通过脚本很容易使用 **classes** task。**classes** 是 **project.tasks.classes** 的缩写。
相比之下在 Android 项目中这就有点复杂。因为 Android 项目中会有大量相同的 task,并且它们的名字基于 *Build Types* 和 *Product Flavor* 生成。
为了解决这个问题,**android** 对象有三个属性:
- **applicationVariants**(只适用于 app plugin)
- **libraryVariants**(只适用于 library plugin)
- **testVariants**(app、library plugin 均适用)
这三个属性会分别返回一个 `ApplicationVariant`、`LibraryVariant` 和 `TestVariant` 对象的 [DomainObjectCollection](http://www.gradle.org/docs/current/javadoc/org/gradle/api/DomainObjectCollection.html)。
注意,使用这三个 collection 中的其中一个都会触发生成所有对应的 task。这意味着使用 collection 之后不需要更改配置。
`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 的 task |
| aidlCompile | AidlCompile | 编译 AIDL 文件的 task |
| renderscriptCompile | RenderscriptCompile | 编译 Renderscript 文件的 task |
| mergeResources | MergeResources | 合并资源文件的 task |
| mergeAssets | MergeAssets | 合并 assets 的 task |
| processResources | ProcessAndroidResources | 处理并编译资源文件的 task |
| generateBuildConfig | GenerateBuildConfig | 生成 BuildConfig 类的 task |
| javaCompile | JavaCompile | 编译 Java 源代码的 task |
| processJavaResources | Copy | 处理 Java 资源的 task |
| assemble | DefaultTask | Variant 的标志性 assemble task |
`ApplicationVariant` 类还有以下附加属性:
| 属性名 | 属性类型 | 说明 |
|-----|-----|-----|
| buildType | BuildType | Variant 的 BuildType |
| productFlavors | List<ProductFlavor> | Variant 的 ProductFlavor,一般不为空但允许为空 |
| mergedFlavor | ProductFlavor | android.defaultConfig 和 variant.productFlavors 的组合 |
| signingConfig | SigningConfig | Variant 使用的 SigningConfig 对象 |
| isSigningReady | boolean | 如果是 true 则表明该 Variant 已经具备了所有需要签名的信息 |
| testVariant | BuildVariant | 将会测试该 Variant 的 TestVariant |
| dex | Dex | 将代码打包成 dex 的 task。如果该 Variant 是 Library,该值可为空 |
| packageApplication | PackageApplication | 打包最终 APK 的 task。如果该 Variant 是 Library,该值可为空 |
| zipAlign | ZipAlign | 对 APK 进行 zipalign 的 task。如果该 Variant 是 Library 或者 APK 不能被签名时,该值可为空 |
| install | DefaultTask | 负责安装的 task,可为空 |
| uninstall | DefaultTask | 负责卸载的 task |
`LibraryVariant` 类还有以下附加属性:
| 属性名 | 属性类型 | 说明 |
|-----|-----|-----|
| buildType | BuildType | Variant 的 BuildType |
| mergedFlavor | ProductFlavor | 只有 android.defaultConfig |
| testVariant | BuildVariant | 用于测试 Variant |
| packageLibrary | Zip | 用于打包 Library 项目的 AAR 文件。如果是 Library 项目,该值不能为空 |
`TestVariant` 类还有以下属性:
| 属性名 | 属性类型 | 说明 |
|-----|-----|-----|
| buildType | BuildType | Variant 的 Build Type |
| productFlavors | List<ProductFlavor> | Variant 的 ProductFlavor。一般不为空但允许为空 |
| mergedFlavor | ProductFlavor | android.defaultConfig 和 variant.productFlavors 的组合 |
| signingConfig | SigningConfig | Variant 使用的 SigningConfig 对象 |
| isSigningReady | boolean | 如果是 true 则表明该 Variant 已经具备了所有需要签名的信息 |
| testedVariant | BaseVariant | TestVariant 测试的 BaseVariant |
| dex | Dex | 将代码打包成 dex 的 task。如果该 Variant 是 Library,该值可为空 |
| packageApplication | PackageApplication | 打包最终 APK 的 task。如果该 Variant 是 Library,该值可为空 |
| zipAlign | ZipAlign | 对 APK 进行 zipalign 的 task。如果该 Variant 是 Library 或者 APK 不能被签名时,该值可为空 |
| install | DefaultTask | 负责安装的 task,可为空 |
| uninstall | DefaultTask | 负责卸载的 task |
| connectedAndroidTest | DefaultTask | 在连接设备上执行 Android 测试的 task |
| providerAndroidTest | DefaultTask | 使用扩展 API 执行 Android 测试的 task |
Android task 特有类型的 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`
- 直接在 Variant 对象中使用 “outputFile” 可以改变最终的输出文件夹。
- `ZipAlign`
- `File inputFile`
- `File outputFile`
- 直接在 Variant 对象中使用 “outputFile” 可以改变最终的输出文件夹。
每个 task 类型的 API 都受 Gradle 的工作方式和 Android plugin 的配置方式限制。
首先,Gradle 中存在的 task 只能配置输入输出的路径以及部分可能使用的选项标识。因此,task 只能定义一些输入或者输出。
其次,这里面大多数 task 的输入都不是单一的,一般都混合了 *sourceSet*、*Build Type* 和 *Product Flavor* 中的值。保持构建文件的简洁和可读性,同时让开发者通过 DSL 修改这些对象来影响构建的过程,而不是深入修改输入和 task 的选项。
另外需要注意,上面的 task 中除了 ZipAlign 这个 task 类型,其它类型都要求设置私有数据来让它们运行。这意味着不能手动创建这些类型的新 task 实例。
这些 API 也可能会被修改。一般来说,目前的 API 是围绕着 task 的输入和输出入口来添加额外的处理(需要的时候)。欢迎反馈意见,特别是那些没有预见过的需求。
对于 Gradle 的 task(DefaultTask,JavaCompile,Copy,Zip),请参考 Gradle 文档。
- 译者序
- 简介
- 新构建系统的目标
- 为什么使用 Gradle?
- 配置要求
- 基础项目
- 构建文件示例
- 项目结构
- 配置项目结构
- 构建任务
- 通用任务
- Java 项目的 Task
- Android Tasks
- 基本的构建定制
- Manifest 属性
- 构建类型
- 签名配置
- 运行 ProGuard
- 清理资源
- 依赖、Library 和多项目
- 包依赖
- 本地包依赖
- 远程包依赖
- 多项目设置
- Library 项目
- 创建 Library 项目
- 普通项目和 Library 项目的区别
- 引用 Library 项目
- Library 项目发布
- 测试
- 单元测试
- 基本知识和配置
- 运行测试
- 测试 Android Library 项目
- 测试报告
- 独立项目
- 多项目报告
- Lint 支持
- 构建 Variants(变种)版本
- 产品定制
- 构建类型+产品定制=构建变种版本
- 产品定制的配置
- 源组件和依赖
- 构建和任务
- 测试
- 多定制的变种版本
- 高级构建的自定义
- 构建选项
- Java 编译选项
- aapt 选项
- dex 选项
- 操作 task
- 构建类型和产物定制的属性引用
- 使用sourceCompatibility 1.7
- 附录
- ApplicationId 与 packageName