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(存在于应用插件和库插件)
这三个分别是ApplicationVariant、LibraryVarinat和TestVariant对象的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
}
}