Android Gradle 插件中文指南

3.4 自定义构建

Android plugin 提供了大量的 DSL 能够让你直接基于构建系统定制很多事情。

3.4.1 Manifest选项

通过 DSL 可以配置 manifest 的如下选项:

  • minSdkVersion
  • targetSdkVersion
  • versionCode
  • versionName
  • applicationId (更有效的 packageName -- 请看ApplicationId 与 PackageName获取更多信息)
  • Package Name for the test application
  • Instrumentation test runner

示例:

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        versionCode 12
        versionName "2.0"
        minSdkVersion 16
        targetSdkVersion 16
    }
}

android 元素里的 defaultConfig 负责定义所有的配置。

Android Plugin 以前的版本是使用 packageName 配置 manifest 的'packageName'属性。 从 0.11.0 开始,你应该在 build.gradle 里使用 applicationId 来配置 manifest 的'packageName'属性。 这是为了消除应用的 packageName(也就是ID)和 java 的 packages 之间的歧义。

通过build文件定义的强大之处在于可以动态的被配置。 比如,可以从一个文件读取版本名字,或者使用一些其他的自定义的逻辑:

def computeVersionName() {
    ...
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        versionCode 12
        versionName computeVersionName()
        minSdkVersion 16
        targetSdkVersion 16
    }
}

注意: 不要使用在给定的范围内,和其他已经存在的 getters 方法冲突的方法名字。比如在 defaultConfig { ...} 中调用 getVersionName() 方法会自动的调用 defaultConfig.getVersionName() 方法,如果你也自定义一个这样的名字的方法,那么你的方法不会调用。

如果一个属性没有通过DSL设置,则会使用它们的默认值。这里有个表格说明是如何处理的。

属性铭 DSL对象的默认值 默认值
versionCode -1 如有有的话从 manifest 中读取
versionName null 如有有的话从 manifest 中读取
minSdkVersion -1 如有有的话从 manifest 中读取
targetSdkVersion -1 如有有的话从 manifest 中读取
applicationId null 如有有的话从 manifest 中读取
testApplicationId null applicationId + “.test”
testInstrumentationRunner null android.test.InstrumentationTestRunner
signingConfig null null
proguardFile N/A (只能设置) N/A (只能设置)
proguardFiles N/A (只能设置) N/A (只能设置)

如果你在构建脚本中使用自定义的逻辑获取这些属性的时候,那么第二列的值尤其重要。比如,你可能这样写:

if (android.defaultConfig.testInstrumentationRunner == null) {
    // assign a better default...
}

如果值一直为 null,那么在构建的时候,它将会被从第三列中获取的实际的默认值替换,但是在DSL元素中又不包含这个默认值,所以你无法查询到它。 这是为了防止解析应用的 manifest 文件,除非真的需要。