操作 task

最后更新于:2022-04-01 02:26:21

# 操作 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 文档。
';