配置构建变体

此页面以“配置构建概述”为基础,向您展示如何配置构建变体以从单个项目创建应用程序的不同版本,以及如何正确管理依赖项和签名配置。

每个构建变体代表可以构建的应用程序的不同版本。 它们是Gradle使用一组特定的规则来组合在构建类型和产品风格中配置的设置,代码和资源的结果。 尽管您没有直接配置构建变体,但是可以配置构成它们的构建类型和产品口味。

例如,“演示” 产品风格可以指定不同的功能和设备要求,例如自定义源代码,资源和最低API级别,而“调试” 构建类型则应用不同的构建和打包设置,例如调试选项和签名键。 生成的构建变体是应用程序的“ demoDebug”版本,它包含“ demo”产品类型,“ debug”构建类型和主/源集中包含的配置和资源的组合。

配置构建类型

您可以在android {}块内的模块级build.gradle文件中创建和配置构建类型。 创建新模块时,Android Studio会自动为您创建调试和发布构建类型。 尽管调试构建类型未显示在构建配置文件中,但Android Studio会将其配置为可调试true。 这使您可以在安全的Android设备上调试应用程序,并使用通用调试密钥库配置APK签名。

如果要添加或更改某些设置,可以将调试构建类型添加到配置中。 以下示例为调试构建类型指定了applicationIdSuffix,并配置了“ jnidebug”构建类型,该构建类型使用调试构建类型中的设置进行了初始化。

  android {... defaultConfig {...} buildTypes {release {minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'} debug {applicationIdSuffix“ .debug”} / ** * The “ initWith”属性使您可以从其他构建类型复制配置,*因此您不必从头开始配置一个。 然后,您可以配置*仅要更改的设置。 以下行使用调试构建类型初始化*'jnidebug',并仅更改* applicationIdSuffix和versionNameSuffix设置。  * / jnidebug {//复制可调试属性和调试签名配置。  initWith调试applicationIdSuffix“ .jnidebug” jniDebuggable true}}} 

注意:对构建配置文件进行更改时,Android Studio要求您将项目与新配置同步。 要同步您的项目,可以在进行更改后立即在出现的通知栏中单击“ 立即同步” ,或从工具栏中单击“ 同步项目 ”。 如果Android Studio注意到您的配置有任何错误,则会显示“ 消息”窗口来描述问题。

要了解有关您可以使用构建类型配置的所有属性的更多信息,请阅读构建类型DSL参考。

配置产品风味

创建产品风味类似于创建构建类型:将它们添加到productFlavors {}块并配置所需的设置。 产品版本支持与defaultConfig相同的属性-这是因为defaultConfig实际上属于ProductFlavor类。 这意味着您可以在defaultConfig {}块中提供所有风味的基本配置,并且每种风味都可以覆盖任何这些默认值,例如applicationId。

注意:您仍然需要使用main /清单文件中的package属性指定一个包名称。 您还必须在源代码中使用该程序包名称来引用R类,或解决任何相对活动或服务注册。 这使您可以使用applicationId为每种产品赋予包装和分发的唯一ID,而无需更改源代码。

以下代码示例使用其自己的applicationId和versionName创建“演示”和“完整”产品风味

  android {... defaultConfig {...} buildTypes {...} productFlavors {demo {applicationId“ com.example.myapp.demo” versionName“ 1.0-demo”} full {applicationId“ com.example.myapp.full” versionName“ 1.0-full”}}} 

注意:要使用Google Play中的“多个APK支持”分发您的应用,请为所有变体分配相同的applicationId值,并为每个变体赋予不同的versionCode。 要将您的应用的不同变体作为单独的应用分发到Google Play中,您需要为每个变体分配不同的applicationId。

创建和配置产品口味后,请在通知栏中单击立即同步 。 同步完成后,Gradle会根据您的构建类型和产品口味自动创建构建变体,并根据 为其命名。 例如,如果您创建了“ demo”和“ full”产品风味,并保留了默认的“ debug”和“ release”构建类型,则Gradle将创建以下构建变体:

  • demoDebug
  • demoRelease
  • fullDebug
  • fullRelease

您可以将构建变体更改为要构建和运行的任何一种-只需转到“ 构建” >“ 选择构建变体”,然后从下拉菜单中选择一个即可。 但是,要开始使用其自身的功能和资源自定义每个构建变体,您需要了解如何创建和管理源集。

创建构建变体的源集

默认情况下,Android Studio会为要在所有构建变体之间共享的所有内容创建主/源集和目录。 但是,您可以创建新的源集,以精确控制Gradle针对特定构建类型,产品口味和构建变体编译和打包的文件。 例如,您可以在主/源集中定义基本功能,并使用产品风味源集来更改不同客户端的应用程序品牌,或者仅对使用调试构建类型的构建变体包括特殊权限和日志记录功能。

Gradle希望您以某种方式组织源代码集文件和目录,类似于main /源代码集。 例如,Gradle希望特定于您的“调试”构建类型的Java类文件位于src / debug / java /目录中。

Android Gradle插件提供了一个有用的Gradle任务,该任务向您展示如何针对每种构建类型,产品口味和构建变体来组织文件。 例如,报告的以下部分描述了Gradle希望在何处找到“调试”构建类型的某些文件:

  -------------------------------------------------- ----------项目:app ------------------------------------- ----------------------- ... debug ----编译配置:编译build.gradle名称:android.sourceSets.debug Java源:[app / src / debug / java]清单文件:app / src / debug / AndroidManifest.xml Android资源:[app / src / debug / res]资产:[app / src / debug / assets] AIDL源:[app / src / debug / aidl] RenderScript源代码:[app / src / debug / rs] JNI源代码:[app / src / debug / jni] JNI库:[app / src / debug / jniLibs] Java风格的资源:[app / src /调试/资源] 

要为您的构建配置生成并查看此报告,请执行以下操作:

  1. 单击IDE窗口右侧的Gradle
  2. 导航到MyApplication> Tasks> android ,然后双击sourceSets
  3. 要查看报告,请单击IDE窗口底部的Gradle Console

注意:该报告还向您显示了如何组织要用于运行应用程序测试的文件的源集,例如test /和androidTest /测试源集。

当您创建新的构建变体时,Android Studio不会为您创建源集目录,但会为您提供一些帮助您的选择。 例如,仅为“调试”构建类型创建java /目录:

  1. 打开“ 项目”窗格,然后从窗格顶部的下拉菜单中选择“ 项目”视图。
  2. 导航到MyProject / app / src /。
  3. 右键单击src目录,然后选择新建 > 文件夹 > Java文件夹
  4. 目标源集旁边的下拉菜单中,选择调试
  5. 点击完成

Android Studio为您的调试构建类型创建一个源集目录,然后在其中创建java /目录。 另外,在为特定的构建变体创建新文件时,也可以使Android Studio为您创建目录。 例如,要为“调试”构建类型创建一个值XML文件:

  1. 在同一Project窗格中,右键单击src目录,然后选择New > XML > Values XML File
  2. 输入XML文件的名称或保留默认名称。
  3. 目标源集旁边的下拉菜单中,选择调试
  4. 点击完成

由于将“调试”构建类型指定为目标源集,因此Android Studio在创建XML文件时会自动创建必要的目录。 生成的目录结构应如图2所示。

图2.调试构建类型的新源集目录。

使用相同的过程,您还可以为产品口味创建源集目录,例如src / demo /,并构建变体,例如src / demoDebug /。 另外,您可以创建针对特定构建变体的测试源集,例如src / androidTestDemoDebug /。 要了解更多信息,请转到测试源集。

用源集构建

您可以使用源集目录仅包含要与某些配置打包在一起的代码和资源。 例如,如果要构建“ demoDebug”构建变体,它是“ demo”产品风味和“ debug”构建类型的交叉产物,则Gradle会查看这些目录,并赋予它们以下优先级:

  1. src / demoDebug / (构建变体源集)
  2. src / debug / (构建类型源集)
  3. src / demo / (产品风味源集)
  4. src / main / (主要来源集)

上面列出的顺序确定了Gradle组合代码和资源时哪个源集具有更高的优先级。 因为demoDebug /源集目录可能包含特定于该构建变体的文件,所以如果demoDebug /包含也在debug /中定义的文件,则Gradle将使用demoDebug /源集中的文件。 同样,Gradle会给构建类型的文件和产品风味源设置的优先级高于main /中的相同文件。 在应用以下构建规则时,Gradle会考虑此优先顺序:

  • java /目录中的所有源代码都被编译在一起以生成单个输出。
  • 注意:对于给定的构建变体,如果Gradle遇到两个或多个定义了相同Java类的源集目录,则Gradle会引发构建错误。 例如,构建调试APK时,不能同时定义src / debug / Utility.java和src / main / Utility.java。 这是因为Gradle在构建过程中会同时查看这两个目录,并引发“重复类”错误。 如果要为不同的构建类型使用不同版本的Utility.java,则可以使每种构建类型定义其自己的文件版本,而不是将其包括在main / source集中。
  • 清单合并到一个清单中。 优先顺序与上面列出的顺序相同。 也就是说,构建类型的清单设置会覆盖产品风味的清单设置,依此类推。 要了解更多信息,请阅读清单合并。
  • 同样,values /目录中的文件合并在一起。 如果两个文件共享相同的名称,例如两个strings.xml文件,则优先级的分配顺序与上面的列表相同。 也就是说,在构建类型源集中的文件中定义的值会覆盖产品风味相同的文件中定义的值,依此类推。
  • res /和asset /目录中的资源打包在一起。 如果在两个或多个源集中定义了具有相同名称的资源,则优先级的分配顺序与上面的列表相同。
  • 最后,在构建APK时,Gradle将库模块依赖项中包含的资源和清单赋予最低优先级。

声明依赖

以下示例在app /模块的build.gradle文件中声明了三种不同类型的直接依赖项:

  android {...} ...依赖项{//'compile'配置告诉Gradle将依赖项添加到//编译类路径中,并将其包含在最终包中。  //此项目对“ mylibrary”模块的依赖性编译project(“:mylibrary”)//远程二进制依赖性编译'com.android.support:appcompat-v7:23.4.0'//本地二进制依赖性编译fileTree(dir :'libs',包括:['* .jar'])} 

这些直接依赖性中的每一个都在下面描述。

模块依赖项 compile project(’:mylibrary’)行将名为“ mylibrary”的本地Android库模块声明为依赖项,并要求构建系统在构建应用程序时对其进行编译并包括该本地模块。 远程二进制依赖性编译’com.android.support:appcompat-v7:23.4.0’行通过指定其JCenter坐标来声明对Android支持库23.4.0版的依赖性。 默认情况下,Android Studio会将项目配置为使用顶级构建文件中的JCenter存储库。 当您将项目与构建配置文件同步时,Gradle会自动从JCenter中提取依赖项。 或者,您可以使用SDK Manager下载并安装某些依赖项。 本地二进制依赖项编译fileTree(dir:’libs’,include:[‘* .jar’])行告诉编译系统在编译类路径和最终包中的app / libs /目录内包括所有JAR文件。您的应用。 如果您有需要本地二进制依赖项的模块,请将这些依赖项的JAR文件复制到项目内的 / libs中。

模块的某些直接依赖项可能具有其自身的依赖项,称为模块的传递依赖项。 不必手动声明每个传递依赖,Gradle会自动为您收集并添加它们。 Android Gradle插件提供了一个有用的Gradle任务,该任务可以为每个构建变体和测试源集生成依赖关系树,因此您可以轻松地可视化模块的直接依赖关系和传递依赖关系。 要生成此报告,请执行以下操作:

  1. 单击IDE窗口右侧的Gradle
  2. 导航至MyApplication> Tasks> android ,然后双击androidDependencies
  3. 要查看报告,请单击IDE窗口底部的Gradle Console

以下样本报告显示了调试构建变体的依赖关系树,其中包括上一示例中的本地模块依赖关系和远程依赖关系。

 执行任务:[androidDependencies]:app:androidDependencies debug / ** *列出了库模块依赖项和远程二进制依赖项,以及它们的传递性依赖项。  * / + --- MyApp:mylibrary:unspecified |  \ --- com.android.support:appcompat-v7:23.4.0 |  + --- com.android.support:animated-vector-drawable:23.4.0 |  |  \ --- com.android.support:support-vector-drawable:23.4.0 |  |  \ --- com.android.support:support-v4:23.4.0 |  |  \ ---本地:internal_impl-23.4.0.jar |  + --- com.android.support:support-v4:23.4.0 |  |  \ ---本地:internal_impl-23.4.0.jar |  \ --- com.android.support:support-vector-drawable:23.4.0 |  \ --- com.android.support:support-v4:23.4.0 |  \ ---本地:internal_impl-23.4.0.jar \ --- com.android.support:appcompat-v7:23.4.0 + --- com.android.support:animated-vector-drawable:23.4.0 |  \ --- com.android.support:support-vector-drawable:23.4.0 |  \ --- com.android.support:support-v4:23.4.0 |  \ ---本地:internal_impl-23.4.0.jar + --- com.android.support:support-v4:23.4.0 |  \ ---本地:internal_impl-23.4.0.jar \ --- com.android.support:support-vector-drawable:23.4.0 \ --- com.android.support:support-v4:23.4.0 \ ---本地:internal_impl-23.4.0.jar ... 

有关在Gradle中管理依赖项的更多信息,请参阅《 Gradle用户指南》中的“依赖关系管理基础知识”。

配置依赖关系

您可以使用某些配置关键字来告诉Gradle如何以及何时使用依赖项,例如前面示例中的compile关键字。 下面介绍了一些可用于配置依赖项的关键字:

compile指定编译时间依赖性。 Gradle使用此配置将依赖项添加到类路径和应用程序的APK中。 这是默认配置。 apk指定Gradle需要与您的应用的APK打包在一起的仅运行时依赖项。 您可以将此配置与JAR二进制依赖关系一起使用,但不能与其他库模块依赖关系或AAR二进制依赖关系一起使用。 提供的指定编译时依赖性,Gradle不将其与您应用的APK打包在一起。 如果运行时不需要依赖项,则这有助于减小APK的大小。 您可以将此配置与JAR二进制依赖关系一起使用,但不能与其他库模块依赖关系或AAR二进制依赖关系一起使用。

此外,您可以通过将构建变体或测试源集的名称应用于配置关键字来为特定的构建变体或测试源集配置依赖项,如以下示例所示。

 依赖项{... //将特定的库模块依赖项作为编译时依赖项//添加到fullRelease和fullDebug构建变​​体中。  fullReleaseCompile project(path:':library',configuration:'release')fullDebugCompile project(path:':library',configuration:'debug')//为本地测试添加编译时间相关性。  testCompile'junit:junit:4.12'//为测试APK添加编译时间相关性。  androidTestCompile'c​​om.android.support.test.espresso:espresso-core:2.2.2'} 

配置签名设置

除非您为该版本明确定义签名配置,否则Gradle不会对发布版本的APK进行签名。 您可以使用Android Studio轻松创建发布密钥并签署发布版本类型。

要使用Gradle构建配置为发布构建类型手动配置签名配置,请执行以下操作:

  1. 创建一个密钥库。 密钥库是一个二进制文件,其中包含一组私钥。 您必须将密钥库保存在安全的地方。
  2. 创建一个私钥。 私钥代表要通过应用程序识别的实体,例如个人或公司。
  3. 将签名配置添加到模块级别的build.gradle文件中:
  • …android {…defaultConfig {…} signingConfigs {发布{storeFile file(“ myreleasekey.keystore”)storePassword“密码” keyAlias“ MyReleaseKey” keyPassword“密码”}} buildTypes {版本{…signingConfig signingConfigs.release}}}}

要生成签名的APK,请从主菜单中选择“ 构建”>“生成签名的APK ”。 现在,使用您的发布密钥对app / build / apk / app-release.apk中的软件包进行了签名。

注意:在构建文件中包括发布密钥和密钥库的密码不是一种好的安全做法。 或者,您可以配置构建文件以从环境变量获取这些密码,或者让构建过程提示您输入这些密码。

要从环境变量获取这些密码:

  storePassword System.getenv(“ KSTOREPWD”)keyPassword System.getenv(“ KEYPWD”) 

如果要从命令行调用构建,要使构建过程提示您输入以下密码:

  storePassword System.console()。readLine(“ \ n密钥存储密码:”)keyPassword System.console()。readLine(“ \ n密钥密码:”) 

完成此过程后,您可以分发您的应用程序并将其发布在Google Play上。

警告:将您的密钥库和私钥保存在安全的地方,并确保您有安全的备份。 如果您将某个应用发布到Google Play,然后丢失了用来签署该应用的密钥,则您将无法发布该应用的任何更新,因为您必须始终使用同一密钥对所有版本的应用进行签名。

签署Android Wear应用

发布Android Wear应用程序时,您将可穿戴式应用程序打包在手持式应用程序内,因为用户无法直接在可穿戴式设备上浏览和安装应用程序。 两个应用都必须签名。 有关打包和签名Android Wear应用的详细信息,请参阅打包Wearable应用。

本网站使用Cookie来存储您对网站特定语言和显示选项的偏好。