高级构建定制 - 操纵任务

优质
小牛编辑
126浏览
2023-12-01

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类都具有以下属性:

属性名属性类型说明
nameStringvariant的名字,必须是唯一的。
descriptionStringvariant的可读性的描述
dirNameStringvariant的子文件夹名称,必须是惟一的。可能还不止一个,比如 “debug/flavor1”
baseNameStringvariant输出的的基本名称,必须是唯一的。
outputFileFilevariant的输出,是一个可读写的属性
processManifestProcessManifest处理manifest的任务
aidlCompileAidlCompile编译AIDL文件的任务
renderscriptCompileRenderscriptCompile编译Renderscript文件的任务
mergeResourcesMergeResources合并资源的任务
mergeAssetsMergeAssets合并资源的任务
processResourcesProcessAndroidResources处理和编译资源的任务
generateBuildConfigGenerateBuildConfig生成BuildConfig类的任务
javaCompileJavaCompile编译Java代码的任务
processJavaResourcesCopy处理Java资源的任务
assembleDefaultTask这个variant的assemble引导任务

ApplicationVariant类还有以下属性:

属性名属性类型说明
buildTypeBuildTypevariant的BuildType。
productFlavorsList\variant的ProductFlavors,不能为空,但可以是空值
mergedFlavorProductFlavorandroid.defaultConfig和variant.productFlavors合并
signingConfigSigningConfig这个variant使用的SigningConfig对象
isSigningReadyboolean如果为true则说明variant已经具备签名所需的一切信息
testVariantBuildVariant将会测试这个variant的TestVariant
dexDexdex代码的任务,如果variant是一个库可以为null
packageApplicationPackageApplication生成最终AP看的任务,如果variant是一个库可以为null
zipAlignZipAlignzip压缩apk的任务,如果variant是一个库或者APK不能被签名可以为null
installDefaultTask安装任务,可以为null。
uninstallDefaultTask卸载任务

LibraryVariant类还有以下属性:

属性名属性类型说明
buildTypeBuildTypevariant的BuildType
mergedFlavorProductFlavor就是defaultConfig
testVariantBuildVariant将要测试这个variant的Build Variant
packageLibraryZip把库打包成一个AAR存档的任务,如果不是一个库值为Null

TestVariant类还有以下属性:

属性名属性类型说明
buildTypeBuildTypevariant的BuildType。
productFlavorsList\variant的ProductFlavors,不能为空,但可以是空值
mergedFlavorProductFlavorandroid.defaultConfig和variant.productFlavors合并
signingConfigSigningConfig这个variant使用的SigningConfig对象
isSigningReadyboolean如果为true则说明variant已经具备签名所需的一切信息
testVariantBaseVariant将会测试这个variant的BaseVariant
dexDexdex代码的任务,如果variant是一个库可以为null
packageApplicationPackageApplication生成最终AP看的任务,如果variant是一个库可以为null
zipAlignZipAlignzip压缩apk的任务,如果variant是一个库或者APK不能被签名可以为null
installDefaultTask安装任务,可以为null。
uninstallDefaultTask卸载任务
connectedAndroidTestDefaultTask在已连接的设备上运行android测试的任务
providerAndroidTestDefaultTask使用扩展的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 文档。