6 高级构建定制(Advanced Build Customization)

6.1 运行ProGuard(Running ProGuard)

ProGuard插件通过Android插件自动应用,如果构建类型(Build Type)配置minifyEnabled来运行ProGuard,则任务会自动创建。

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFile getDefaultProguardFile('proguard-android.txt')
        }
    }

    productFlavors {
        flavor1 {
        }
        flavor2 {
            proguardFile 'some-other-rules.txt'
        }
    }
}

变种(variant)使用在构建类型(Build Type)和产品标识(Product Flavor)中声明的所有规则。

默认有2个规则文件:

  • proguard-android.txt
  • proguard-android-optimize.txt

它们存在于SDK路径,使用getDefaultProguardFile()会返回文件的完整路径。它们除了是否开启优化外其他配置都一致。

6.2 优化资源(Shrinking Resources)

你也可以在编译时自动删除未使用的资源。了解更多信息,查看Resource Shrinking文档。

6.3 控制任务(Manipulating tasks)

基本的Java项目由一系列有限的任务来一起生成输出结果,classes任务就是其中用于编译Java源代码。可以通过build.gradle文件编写脚本来简单地使用classes,例如project.tasks.classes

在Android项目中,这显得相对复杂许多。因为其中存在着相当多的同样的任务,它们的名称是基于构建类型(Build Type)和产品标识(Product Flavor)生成的。

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

  • applicationVariants(只存在应用插件)
  • libraryVariants(只存在库插件)
  • testVariants(存在于应用插件和库插件)

这三个分别是ApplicationVariantLibraryVarinatTestVariant对象的DomainObjectCollection

需要注意的是,访问这些集合中任何一个将触发所有任务的创建,这意味着在访问集合之后不会有任何新配置生效。

DomainObjectCollection提供了直接访问所有对象或通过过滤器的访问的方式:

android.applicationVariants.all { variant ->
    ...
}

所有变种类共享以下属性:

属性名称 属性类型 说明
name String 变种名称,绝对唯一。
description String 可读的变种说明。
dirName String 变种的子目录名称,绝对唯一。可能多层目录,例如:"debug/flavor1"
baseName String 变种输出的基本名称,绝对唯一。
outputFile File 变种输出文件,这是可读/可写属性。
processManifest ProcessManifest 处理清单文件任务。
aidlCompile AidlCompile 编译AIDL文件的任务。
renderscriptCompile RenderscriptCompile 编译Renderscript文件的任务。
mergeResources MergeResources 合并资源任务。
mergeAssets MergeAssets 合并assets任务。
processResources ProcessAndroidResources 处理和编译资源任务。
generateBuildConfig GenerateBuildConfig 生成BuildConfig类任务。
javaCompile JavaCompile 编译Java代码任务。
processJavaResources Copy 处理Java资源任务。
assemble DefaultTask 变种的组装锚任务。

ApplicationVariant类添加以下属性:

属性名称 属性类型 说明
buildType BuildType 变种的构建类型。
productFlavors List 变种的产品标识。不为Null,但可能为空。
mergedFlavor ProductFlavor android.defaultConfig和variant.productFlavors合并。
signingConfig SigningConfig 变种使用的SigningConfig对象。
isSigningReady boolean true表示变种拥有用于签名的所有必须信息。
testVariant BuildVariant 测试变种的TestVariant。
dex Dex 打包代码的任务。如果变种是库时为空。
packageApplication PackageApplication 生成最终APK的任务。如果变种是库时为空。
zipAlign ZipAlign zip对齐APK的任务。如果变种是库或者APK未签名时为空。
install DefaultTask 安装任务。可以为空。
uninstall DefaultTask 卸载任务。

LibraryVariant类添加以下属性:

属性名称 属性类型 说明
buildType BuildType 变种的构建类型。
mergedFlavor ProductFlavor android.defaultConfig和variant.productFlavors合并。
testVariant BuildVariant 测试变种的TestVariant。
packageLibrary Zip 打包库位AAR存档的任务。如果不为库则为空。

TestVariant类添加以下属性:

属性名称 属性类型 说明
buildType BuildType 变种的构建类型。
productFlavors List 变种的产品标识。不为Null,但可能为空。
mergedFlavor ProductFlavor android.defaultConfig和variant.productFlavors合并。
signingConfig SigningConfig 变种使用的SigningConfig对象。
isSigningReady boolean true表示变种拥有用于签名的所有必须信息。
testedVariant BaseVariant 使用该TestVariant测试的BaseVariant。
dex Dex 打包代码的任务。如果变种是库时为空。
packageApplication PackageApplication 生成最终APK的任务。如果变种是库时为空。
zipAlign ZipAlign zip对齐APK的任务。如果变种是库或者APK未签名时为空。
install DefaultTask 安装任务。可以为空。
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 变更最终输出文件直接使用"outputFile"参数
  • ZipAlign
    • File inputFile
    • File outputFile 变更最终输出文件直接使用"outputFile"参数

每个任务类型的API由于Gradle的工作方式和Android插件的配置而受到限制。

首先,Gradle意味着一些任务只能配置输入/输出位置和可能的可选标识,因此,这些任务只定义输入/输出。

其次,这些任务大部分的输入是不单一的,往往是由源码集合、构建类型(Build Type)和产品标识(Product Flavor)组合而成的值。保证构建文件简单易懂,是为了让开发者通过DSL调整这些对象来修改构建方式,而不是深入到任务的输入和选项来修改构建方式。

还需注意的是,除了ZipAlign任务类型外,其他所有类型需要设置私有数据来使之工作,这意味着不能手动创建这些类型的新任务。

这些API也是可以改变的。通常情况下,当前的API是围绕着任务提供的输入和输出的来添加额外的处理。

对于Gradle任务(DefaultTask,JavaCompile,Copy,Zip),请查看Gradle文档。

6.4 设置JDK版本(Setting language level)

你可以通过设置compileOptions代码块来选择编译器的JDK版本。默认值在compileSdkVersion值基础上。

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_6
        targetCompatibility JavaVersion.VERSION_1_6
    }
}