此页面基于“配置构建概述”,介绍如何配置构建变体以从单个项目创建不同版本的应用程序,以及如何正确管理依赖项和签名配置。
每个构建变体 代表您可以构建的应用程序的一个不同版本。 例如,您可能希望构建一个免费应用版本,内容有限,另一个付费版本包含更多内容。 您还可以根据API级别或其他设备版本来构建针对不同设备的不同版本的应用。 但是,如果你想基于设备ABI或屏幕密度构建不同的版本,而是使用APK拆分。
构建变体是Gradle使用一组特定的规则来组合在构建类型和产品版本中配置的设置,代码和资源的结果。 虽然您不直接配置构建变体,但您可以配置构建类型和产品版本来形成它。
例如,“demo”产品可以指定不同的特征和设备要求,例如定制源代码,资源和最小API级别,而“debug”构建类型应用不同的构建和打包设置,例如调试选项和签名键。 生成的构建版本是您的应用程序的“demoDebug”版本,它包括“demo”产品风格,“debug”构建类型和main/
源集中包含的配置和资源的组合。
配置构建类型
您可以在模块级的build.gradle
文件android {}
块中创建和配置构建类型。 当您创建新模块时,Android Studio会自动为您创建调试和发布构建类型。 虽然调试生成类型不会显示在构建配置文件中,但是Android Studio会使用debuggable true来配置它。 这允许您使用通用调试密钥库配置APK签名的程序在安全的Android设备上调试应用程序。
如果要添加或更改某些设置,可以将调试生成类型添加到配置中。 以下示例为调试生成类型指定一个applicationIdSuffix
,并配置一个从调式模式版本的构建类型衍生的”jnidebug”构建类型。
android {
...
defaultConfig {...}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
applicationIdSuffix ".debug"
}
/**
* The 'initWith' property allows you to copy configurations from other build types,
* so you don't have to configure one from the beginning. You can then configure
* just the settings you want to change. The following line initializes
* 'jnidebug' using the debug build type, and changes only the
* applicationIdSuffix and versionNameSuffix settings.
*/
jnidebug {
// This copies the debuggable attribute and debug signing configurations.
initWith debug
applicationIdSuffix ".jnidebug"
jniDebuggable true
}
}
}
注意:当您更改构建配置文件时,Android Studio需要您将项目与新配置同步。 要同步您的项目,您可以点击在更改项目后出现的工具栏上的Sync Now 按钮或者Sync Project。 如果Android Studio发现您的配置出现任何错误,则会显示“消息”窗口来描述该问题。
要了解有关可以使用构建类型配置的所有属性的详细信息,请阅读构建类型DSL参考。
配置产品风味
创建产品风格与创建构建类型类似:将它们添加到productFlavors {}
块并配置所需的设置。 产品flavor支持与defaultConfig
相同的属性 - 这是因为defaultConfig
实际上属于ProductFlavor
类。 这意味着您可以在defaultConfig {}
块中为所有类型提供基本配置,每个flavor可以覆盖任何这些默认值,如applicationId。
注意:您仍然需要使用
main/
清单文件中的package
属性指定包名称。 您还必须在源代码中使用该包名称来引用R类,或解析任何相对活动或服务注册。 这允许您使用applicationId
为每个产品flavor提供用于打包和分发的唯一ID,而无需更改源代码。
以下代码示例展示使用自己的applicationId
和versionName
创建一个“demo”和“full”产品风格
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中使用 Multiple APK Support 来分发您的应用,请为所有变体指定相同的
applicationId
值,并为每个变体指定不同的versionCode
。 要将您应用的不同版本作为单独的应用分发到Google Play,您需要为每个版本分配不同的applicationId
。
创建和配置您的产品风格后,单击通知栏中的Sync Now。 同步完成后,Gradle会根据您的构建类型和产品风格自动创建构建变体,并根据<product-flavor><Build-Type>
命名它们。 例如,如果您创建了“demo”和“full”产品,并保留默认的“debug”和“release”构建类型,Gradle会创建以下构建版本:
- demoDebug
- demoRelease
- fullDebug
- fullRelease
您可以更改要构建和运行的构建变体,只需转到 Build > Select Build Variant
,然后从下拉菜单中选择一个。 但是,要开始自定义具有自己的功能和资源的每个构建变体,您需要知道如何创建和管理源集。
为构建变量创建源集
默认情况下,Android Studio会在所有构建版本之间共享的内容创建的main/
源集和目录。 但是,您可以创建新的源集,以精确控制特定构建类型,产品类型和构建变体的Gradle编译和包。 例如,您可以在main/
源集中定义基本功能。并使用产品flavor源集来更改不同客户端的应用程序的品牌,或仅对使用调试生成类型的构建版本包含特殊权限和日志记录功能。
Gradle希望你以某种方式组织源集合文件和目录,类似于main/
源集合。 例如,Gradle希望特定于”debug”构建类型的Java类文件位于src/debug/java/
目录中。
Gradle的Android插件提供了一个有用的Gradle任务,它显示了如何组织您的每个构建类型,产品风格和构建变体的文件。 例如,报告的以下部分描述了Gradle希望为”debug”构建类型查找特定文件的位置:
------------------------------------------------------------
Project :app
------------------------------------------------------------
...
debug
----
Compile configuration: compile
build.gradle name: android.sourceSets.debug
Java sources: [app/src/debug/java]
Manifest file: app/src/debug/AndroidManifest.xml
Android resources: [app/src/debug/res]
Assets: [app/src/debug/assets]
AIDL sources: [app/src/debug/aidl]
RenderScript sources: [app/src/debug/rs]
JNI sources: [app/src/debug/jni]
JNI libraries: [app/src/debug/jniLibs]
Java-style resources: [app/src/debug/resources]
要为构建配置生成和查看此报告,请执行以下操作:
- 在IDE窗口右侧点击Gradle 。
- 导航到MyApplication > Tasks > android,双击sourceSets。
- 要查看报告,请单击IDE窗口底部的Gradle Console。
注意:该报告还显示了如何组织要用于为应用程序运行测试的文件的源集,例如
test/
和androidTest/
测试源集。
当您创建新的构建变体时,Android Studio不会为您创建源集目录,但它提供了几个选项来帮助您。 例如,为您的“debug”构建类型创建只java/
目录:
- 打开Project 窗格,然后从窗格顶部的下拉菜单中选择Project视图。
- 导航至
MyProject/app/src/
- 右键
src
目录,选择New > Folder > Java Folder - 从Target Source Set旁边的下拉菜单中,选择debug。
- 点击Finish
Android Studio为您的调试版本类型创建一个源集目录,然后在其中创建java/
目录。 或者,您也可以使Android Studio在为特定构建版本创建新文件时为您创建目录。 例如,为”debug” 构建类型创建值XML文件:
- 在同样的Project窗格中,右键单击
src
目录,然后选择New > XML > Values XML File.文件。 - 输入XML文件的名称或保留默认名称。
- 从Target Source Set旁边的下拉菜单中,选择debug。
- 点击Finish
因为”debug”构建类型被指定为目标源集合,所以Android Studio会在创建XML文件时自动创建必要的目录。 生成的目录结构应如图2所示。
图2.调试类型的源集目录。
用相同的步骤,您还可以为产品风格(如src/demo/
)和构建变量(如src/demoDebug/
)创建源集目录。 此外,您可以创建针对构建特定版本的测试源集,例如src/androidTestDemoDebug/
。 要了解更多信息,请转到测试源集。
构建源集合
您可以使用源集目录来包含仅在某些配置下打包的代码和资源。 例如,如果您正在构建“demoDebug”构建变量(这是“演示”产品风格和“调试”构建类型的交叉产品),Gradle会查看这些目录,并给予他们以下优先级:
src/demoDebug/
(build variant source set)src/debug/
(build type source set)src/demo/
(product flavor source set)src/main/
(main source set)
当Gradle组合代码和资源时,上面列出的顺序确定哪个源集具有更高的优先级。 因为demoDebug/
source set目录可能包含特定于该构建变量的文件,如果demoDebug/
也包含debug/
中定义的文件,Gradle使用demoDebug/
source集合中的文件。 类似地,Gradle在构建类型和产品风味源中提供文件比main/
中的相同文件设置更高的优先级。 Gradle在应用以下构建规则时会考虑此优先级顺序:
java/
目录中的所有源代码都在一起编译生成单个输出。注意:对于给定的构建变体,如果Gradle遇到定义了相同Java类的两个或多个源集目录,则会抛出构建错误。 例如,当构建调试APK时,您不能同时定义
src/debug/Utility.java
和src/main/Utility.java
。 这是因为Gradle在构建过程中查看这两个目录并抛出“重复类”错误。 如果你想要不同版本的Utility.java
用于不同的构建类型,你可以让每个构建类型定义自己的文件版本,而不是包含在main/
源集合中。多个清单被合并成单个清单。 优先级按照与上面列表相同的顺序给出。 也就是说,构建类型的清单设置会覆盖产品风格的清单设置,等等。 要了解更多,请阅读有关清单合并。
- 同样,
values/
目录中的文件也将合并在一起。 如果两个文件共享相同的名称,例如两个strings.xml
文件,优先级按照与上面列表相同的顺序给出。 也就是说,在构建类型源集合中的文件中定义的值将覆盖在产品flavor中的同一文件中定义的值,等等。 res/
和asset/
目录中的资源打包在一起。 如果在两个或多个源集中定义了相同名称的资源,则按照与上述列表相同的顺序给出优先级。- 最后,在构建APK时,Gradle为依赖的模块库中资源和清单设置了最低的优先级。
声明依赖关系
以下示例在应用程序/模块的build.gradle
文件中声明了三种不同类型的直接依赖关系:
android {...}
...
dependencies {
// The 'compile' configuration tells Gradle to add the dependency to the
// compilation classpath and include it in the final package.
// Dependency on the "mylibrary" module from this project
compile project(":mylibrary")
// Remote binary dependency
compile 'com.android.support:appcompat-v7:23.4.0'
// Local binary dependency
compile fileTree(dir: 'libs', include: ['*.jar'])
}
下面描述每一个直接依赖类型。
模块依赖
compile project(':mylibrary')
行声明一个名为“mylibrary”的本地Android库模块作为依赖项,并且在构建应用程序时需要编译系统编译并包含本地模块。
远程二进制依赖
compile'com.android.support:appcompat-v7:23.4.0'
行声明了对Android支持库23.4.0版本的依赖,方法是指定其JCenter坐标。 默认情况下,Android Studio在顶级构建文件中使用JCenter存储库配置项目。 当您将项目与构建配置文件同步时,Gradle会自动从JCenter中提取依赖项。 或者,您可以使用SDK Manager下载并安装某些依赖关系。
本地二进制依赖
compile fileTree(dir: 'libs', include: ['*.jar'])
行告诉构建系统在app/libs/
目录中所有的JAR文件编译到最终应用程序中。 如果有模块需要本地二进制依赖,请将这些依赖关系的JAR文件复制到项目中的<moduleName>/libs
中。
模块的一些直接依赖性可以具有它们自己的依赖性,称为模块的传递依赖性。 而不是手动声明每个传递依赖,Gradle会自动收集并添加它们。 Gradle的Android插件提供了一个有用的Gradle任务,可以为每个构建变体和测试源集合生成依赖关系树,因此您可以轻松地可视化模块的直接和传递依赖性。 要生成此报告,请按以下步骤操作:
- 在IDE窗口右侧点击Gradle 。
- 导航至MyApplication > Tasks > android,并双击androidDependencies
- 要查看报告,请单击IDE窗口底部的Gradle Console(也可能在Run窗口,文字报告点击)。
以下示例报告显示了调试版本变体的依赖关系树,并包括上一个示例的本地模块依赖项和远程依赖项。
Executing tasks: [androidDependencies]
:app:androidDependencies
debug
/**
* Both the library module dependency and remote binary dependency are listed
* with their transitive dependencies.
*/
+--- 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
| | \--- LOCAL: internal_impl-23.4.0.jar
| +--- com.android.support:support-v4:23.4.0
| | \--- LOCAL: internal_impl-23.4.0.jar
| \--- com.android.support:support-vector-drawable:23.4.0
| \--- com.android.support:support-v4:23.4.0
| \--- LOCAL: 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
| \--- LOCAL: internal_impl-23.4.0.jar
+--- com.android.support:support-v4:23.4.0
| \--- LOCAL: internal_impl-23.4.0.jar
\--- com.android.support:support-vector-drawable:23.4.0
\--- com.android.support:support-v4:23.4.0
\--- LOCAL: internal_impl-23.4.0.jar
...
有关在Gradle中管理依赖关系的更多信息,请参阅Gradle用户指南中的依赖关系管理基础。
配置依赖关系
您可以使用某些配置关键字来告诉Gradle如何以及何时使用依赖关系,例如前面示例中的compile关键字。 以下介绍可用于配置依赖关系的一些关键字:
compile
指定编译时依赖项。 Gradle将依赖关系添加到类路径和应用程序的APK。 这是默认配置。
apk
指定Gradle需要使用应用程序的APK打包的仅运行时依赖关系。 您可以将此配置与JAR二进制依赖关系一起使用,但不能与其他库模块依赖关系或AAR二进制依赖关系一起使用。
provided
指定Gradle不使用应用程序的APK打包的编译时依赖关系。 如果在运行时不需要依赖,这有助于减小APK的大小。 您可以将此配置与JAR二进制依赖关系一起使用,但不能与其他库模块依赖关系或AAR二进制依赖关系一起使用。
此外,您可以通过将构建变量或测试源集合的名称应用于配置关键字来配置特定构建变体或测试源集合的依赖关系,如以下示例所示。
dependencies {
...
// Adds specific library module dependencies as compile time dependencies
// to the fullRelease and fullDebug build variants.
fullReleaseCompile project(path: ':library', configuration: 'release')
fullDebugCompile project(path: ':library', configuration: 'debug')
// Adds a compile time dependency for local tests.
testCompile 'junit:junit:4.12'
// Adds a compile time dependency for the test APK.
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
}
配置签名设置
Gradle不会签署您的发布版本的APK,除非您明确定义了这个版本的签名配置。 您可以轻松创建发布密钥,并使用Android Studio签署发布版本类型。
要使用Gradle构建配置为发布构建类型手动配置签名配置:
- 创建keystore 。 keystore 是一个包含一组私钥的二进制文件。 您必须将密钥库放在安全可靠的地方。
- 创建private key。 private key表示应用程序标识的实体,例如个人又或者公司。
将签名配置添加到模块级build.gradle文件:
... android { ... defaultConfig {...} signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { ... signingConfig signingConfigs.release } } }
要生成签名的APK,请从菜单栏中选择Build > Generate Signed APK。 app/build/apk/app-release.apk
是使用发布密钥签名的应用程序。
注意:在构建文件中写明发布密钥和密钥库的密码不是一个好的安全做法。 或者,您可以从环境变量或在构建过程提示您输入密码这些获取密码来配置构建文件。
从环境变量获取这些密码:
storePassword System.getenv("KSTOREPWD")
keyPassword System.getenv("KEYPWD")
构建过程提示您输入这些密码,如果您从命令行调用构建:
storePassword System.console().readLine("\nKeystore password: ")
keyPassword System.console().readLine("\nKey password: ")
完成此过程后,您可以分发您的应用并将其发布到Google Play上。
警告:将密钥库和私钥保存在安全可靠的位置,并确保对其进行安全备份。 如果您将应用程式发布到Google Play,然后遗失了应用程式签署的金钥,就无法发布应用程式的任何更新,因为您必须使用相同的金钥为应用程式签署所有版本。
Android Wear应用程式签名
发布Android Wear应用程式时,您可以在手持应用程式中封装穿戴式应用程式,因为使用者无法直接在穿戴式装置上浏览及安装应用程式。 这两个应用程序必须签名。 有关打包和签名Android Wear应用的详情,请参阅 打包可穿戴应用。