对于 Android 工程来说就比较复杂了,因为可能有很多相同的任务,他们的名字是基于 Build Types和Product Flavors 生成的。

    为了解决这个问题, android 对象提供了两个属性:

    • applicationVariants (仅仅适用于 app plugin )
    • libraryVariants (仅仅适用于 library plugin )
    • testVariants (两种 plugin 都适用)

    ApplicationVariant, LibraryVariant, and TestVariant 这三个对象都会分别返回一个。

    请注意访问这些集合中的任何一个都会触发生成所有的创建。这意味着访问这些集合后无须重新配置就会产生。

    这三个variant类都具有以下属性:

    ApplicationVariant类还有以下属性:

    LibraryVariant类还有以下属性:

    TestVariant类还有以下属性:

    • ProcessManifest
      • File manifestOutputFile
    • AidlCompile
      • File sourceOutputDir
    • RenderscriptCompile
      • File sourceOutputDir
      • File resOutputDir
    • MergeResources
    • MergeAssets
      • File outputDir
    • ProcessAndroidResources
      • File manifestFile
      • File resDir
      • File assetsDir
      • File sourceOutputDir
      • File textSymbolOutputDir
      • File packageOutputFile
      • File proguardOutputFile
    • GenerateBuildConfig
    • 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

    每一个任务类型的 API 都会因为 Gradle 的工作方式以及 Android plugin 的设置受到限制。
    首先,Gradle 限制只能配置任务的输入/输出以及一些可选的标志。所以,这里的这些任务只能定义输入/输出。

    其次,大多数任务的输入并不唯一,通常会混合 sourceSets,Build Types 以及 Product Flavors。为了保持构建简单以及可读性,我们的目标是让开发者通过 DSL 通过这些对象修改构建,而不是深入的了解任务的输入和选项进而修改它们。

    还要注意的是,除了 ZipAlign 任务类型,其他所有的任务都需要设置私有数据让他们运行。这就意味着不能基于这些类型手动的创建新的任务。

    对于 Gradle 的任务(DefaultTask, JavaCompile, Copy, Zip),请参考 Gradle 文档。