前言

一般情况下,我们的开发环境分为debugrelease两个环境,这个一般在新建Android项目时,Gradle文件中已完成了默认的配置,代码如下(debug默认存在):

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

那么,如果我们在有的项目中需要配置其它环境(如alpha、beta等),这个时候就需要额外的配置了。


buildTypes(配置构建类型)

buildTypes位于app-build.gradle文件的android{}代码块中,它是用来创建和配置app的构建类型的,新建一个项目在模块的build.gradle文件中会默认生成debugrelease两个环境版本。


多类型配置与其作用

当我们app需要在不同的环境下生成对应的版本时,这个时候就需要在buildTypes内进行对应版本类型的配置工作(如:网络baseUrl的配置),示例代码如下:

buildTypes {
    release {
        minifyEnabled false
        buildConfigField 'String', 'BASE_URL', '"http://xxxx-release.**/"'
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }

    alpha {
        minifyEnabled false
        buildConfigField 'String', 'BASE_URL', '"http://xxxx-alpha.**/"'
    }

    beta {
        minifyEnabled false
        buildConfigField 'String', 'BASE_URL', '"http://xxxx-beta.**/"'
    }
}

通过如上配置,我们可以实现针对不同的环境创建对应的版本类型。

通过Gradle->app->build->assemble可以一键进行所有类型版本的构建,生成对应的apk文件。


applicationIdSuffix

该字段表示,在不改变当前程序默认ID(包名)的情况下,为其添加后缀。如:当前包名是com.zihao.app,如果你想区分测试包与线上包的情况,这个时候在buildTypes->debug中将applicationIdSuffix设置为applicationIdSuffix ".debug",那么对应的包名就变成了com.zihao.app.debug,示例代码如下:

buildTypes {
    ...
    debug {
        applicationIdSuffix ".debug"
    }
}

源集(Source Sets)构建

Android Studio会为每个模块将源代码和资源文件组成一个逻辑上的源集。每个模块的main/源集包括所有构建变种都是用的源码和资源。其它源集的目录是可选的,Android Studio不会自动为你创建他们,当你构建新的变种的时候。但是,构建具体的app版本的时候,创建于main/类似的源集,可以帮助组织Gradle应该使用的文件和资源(有助于让Gradle只应在构建特定应用版本时使用的文件和资源井然有序)。

通常源代码是放在'src/main'文件目录下的,但是你可以根据不同的构建类型(比如debug、release、alpha等)区分不同的源文件,这样对应建立的文件夹就是一个不同的构建源。打个比方,debug的构建源为src/debugrelease的构建源为src/release,而在src/main定义的为公共资源,最后在构建时进行合并操作。

构建源的命名规则如下

  • src/main/
    此源集包括所有构建变体共用的代码和资源。
  • src/<buildTypes>/
    创建这个源集来包括仅仅为一个具体的buildType使用的代码和资源。示例:src/alpha
  • src/<productFlavor>/
    创建这个源集来包括仅仅为一个具体的productFlavor使用的代码和资源。示例:src/baidu
  • src/<productFlavorBuildType>/
    创建此源集可加入特定构建变体专用的代码和资源。

例如,要生成应用的“baiduDebug”版本,构建系统需要合并来自以下源集的代码、设置和资源:

  • src/baiduDebug/(构建变种源集)
  • src/debug/(构建类型buildType源集)
  • src/baidu/(productFlavor源集)
  • src/main/(main源集)

注意:当你在Android Studio中创建一个新的文件或者目录时,使用File->New菜单项,你可以为一个具体的源集创建它。你可以选择的这些源集是基于你的构建配置的,并且Android Studio自动创建需要的目录,如果它们不存在的话。

源集的优先级
如果不同的源集包含同一个文件的不同版本,当决定哪个文件使用的时候Gradle使用下面的优先级顺序。(在左边的源集会重写右边的源集文件和设置):

buildVariant > buildType > productFlavor > main source set > library dependencies

这可以让Gradle在构建的时候使用与具体构建变种相关的文件,当重用activity,应用逻辑,以及和其他版本通用的资源的时候。当merging multiple manifests的时候,Gradle使用同样的优先级顺序,因此每个构建变种可以定义不同的组件或者权限在最终的manifest文件中。
学习更多关于创建自定义源集,点击Create source sets for build variants


参考:【译】Android构建配置
Android 多渠道打包配置
Android Studio Set of source 代码源集 源集创建等操作
官方文档