Skip to content

Most visited

Recently visited

navigation

配置构建变体

此页面以配置构建概览为基础,向您介绍如何配置构建变体,以便从同一个项目中创建应用的不同版本,以及如何正确地管理依赖项并签署配置。

每个构建变体都代表您可以为应用构建的一个不同版本。例如,您可能希望构建应用的免费版本(只提供有限的内容)和付费版本(提供更多内容)。您还可以针对不同的设备、根据 API 级别或其他设备变体构建应用的不同版本。然而,如果您希望根据设备 ABI 或屏幕密度构建不同的版本,则请改用 APK 拆分

构建变体是 Gradle 按照特定规则集合并在构建类型和产品风味中配置的设置、代码和资源所生成的结果。您并不直接配置构建变体,而是配置组成变体的构建类型和产品风味。

例如,一个“演示”产品风味可以指定不同的功能和设备要求,例如自定义源代码、资源和最低 API 级别,而“调试”构建类型则应用不同的构建和打包设置,例如调试选项和签署密钥。最终生成的构建变体是应用的“演示调试”版本,其既包含“演示”产品风味中包含的各种配置和资源,又包含“调试”构建类型和 main/ 源集。

配置构建类型

您可以在模块级 build.gradle 文件的 android {} 代码块内部创建和配置构建类型。当您创建新模块时,Android Studio 会自动为您创建调试和发布这两种构建类型。尽管调试构建类型不会出现在构建配置文件中,Android Studio 会将其配置为 debuggable true。这样,您可以在安全的 Android 设备上调试应用并使用通用调试密钥库配置 APK 签署。

如果您希望添加或更改特定设置,您可以将调试构建类型添加到您的配置中。以下示例为调试构建类型指定了 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 通知配置出现错误,会显示 Messages 窗口,具体描述该问题。

如需详细了解对于构建类型可以配置的所有属性,请阅读构建类型 DSL 参考

配置产品风味

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

:您仍需在 main/ 清单文件中使用 package 属性指定程序包名称。您还必须在源代码中使用此程序包名称引用 R 类或者解析任何相关的 Activity 或服务注册。这样,您可以使用 applicationId 为每个产品风味分配一个唯一的 ID,以用于打包和分发,而不必更改您的源代码。

以下代码示例创建了一个“演示”和“完整”产品风味并赋予其自己的 applicationIdversionName

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

在创建和配置您的产品风味之后,在通知栏中点击 Sync Now。在同步完成后,Gradle 会根据您的构建类型和产品风味自动创建构建变体,并按照 <product-flavor><Build-Type> 的格式命名这些变体。例如,如果您创建了“演示”和“完整”这两种产品风味并保留默认的“调试”和“发布”构建类型,Gradle 将创建以下构建变体:

您可以将构建变体更改为您要构建并运行的任何变体,只需转到 Build > Select Build Variant,然后从下拉菜单中选择一个变体。然而,要开始自定义每个构建变体及其功能和资源,您需要了解如何创建和管理源集。

创建用于构建变体的源集

默认情况下,Android Studio 会创建 main/ 源集和目录,用于存储您要在所有构建变体之间共享的一切资源。然而,您可以创建新的源集来确切控制 Gradle 要为特定的构建类型、产品风味和构建变体来编译和打包哪些文件。例如,您可以在 main/ 源集中定义基本的功能,使用产品风味源集针对不同的客户更改应用的品牌,或者仅针对使用调试构建类型的构建变体包含特殊的权限和日志记录功能。

Gradle 要求您按照与 main/ 源集类似的特定方式组织源集文件和目录。例如,Gradle 要求您的“调试”构建类型所特定的 Java 类文件位于 src/debug/java/ 目录中。

Android Plugin for Gradle 提供了一项有用的 Gradle 任务,可向您展示如何针对每种构建类型、产品风味和构建变体组织您的文件。例如,报告的以下部分描述了 Gradle 要求在何处能找到“调试”构建类型的特定文件:

------------------------------------------------------------
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]

要为您的构建配置生成和查看此报告,请继续如下操作:

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

:此报告还向您展示了如何为您希望用来运行应用测试的文件组织源集,例如 test/androidTest/ 测试源集

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

  1. 打开 Project 窗格并从窗格顶端的下拉菜单中选择 Project 视图。
  2. 导航至 MyProject/app/src/
  3. 右键点击 src 目录并选择 New > Folder > Java Folder
  4. Target Source Set 旁边的下拉菜单中,选择 debug
  5. 点击 Finish

Android Studio 将会为您的调试构建类型创建源集目录,然后在该目录内部创建 java/ 目录。或者,您也可以让 Android Studio 在为特定的构建变体创建新文件时为您创建目录。例如,要为“调试”构建类型创建 XML 值文件:

  1. 在该 Project 窗格中,右键点击 src 目录并选择 New > XML > Values XML File
  2. 为 XML 文件输入名称或保留默认名称。
  3. Target Source Set 旁边的下拉菜单中,选择 debug
  4. 点击 Finish

由于“调试”构建类型被指定为目标源集,Android Studio 会在创建 XML 文件时自动创建必要的目录。最终的目录结构看上去应该类似于图 2。

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

按照同样的方法,您还可以为产品风味创建源集目录(例如 src/demo/),为构建变体创建源集目录(例如 src/demoDebug/)。此外,您还可以针对特定的构建变体创建测试源集,例如 src/androidTestDemoDebug/。如需了解更多信息,请转至测试源集

使用源集构建

您可以使用源集目录包含您希望仅针对特定配置打包的代码和资源。例如,如果您要构建“演示调试”构建变体(它是“演示”产品风味和“调试”构建类型的合体),Gradle 会查看这些目录并赋予以下优先级顺序:

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

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

声明依赖项

以下示例在 app/ 模块的 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:25.1.0'

    // Local binary dependency
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

下面逐一介绍了每种直接依赖项。

模块依赖项
compile project(':mylibrary') 行声明了一个名为“mylibrary”的本地 Android 库模块作为依赖项,并要求构建系统在构建应用时编译并包含该本地模块。
远程二进制依赖项
compile 'com.android.support:appcompat-v7:25.1.0' 行通过指定其 JCenter 坐标,针对 Android 支持库的 25.1.0 版本声明了一个依赖项。默认情况下,Android Studio 会将项目配置为使用顶级构建文件中的 JCenter 存储区。当您将项目与构建配置文件同步时,Gradle 会自动从 JCenter 中抽取依赖项。或者,您也可以通过使用 SDK 管理器下载和安装特定的依赖项。
本地二进制依赖项
compile fileTree(dir: 'libs', include: ['*.jar']) 行告诉构建系统在编译类路径和最终的应用软件包中包含 app/libs/ 目录内的任何 JAR 文件。如果您有模块需要本地二进制依赖项,请将这些依赖项的 JAR 文件复制到项目内部的 <moduleName>/libs 中。

该模块的某些直接依赖项可能会有其自己的依赖项,这称为该模块的传递依赖项。Gradle 将会自动为您收集并添加这些传递依赖项,而不必手动逐一加以声明。Android Plugin for Gradle 提供了一项有用的 Gradle 任务,可为每个构建变体和测试源集生成依赖项树,因此,您可以轻松地可视化模块的直接和传递依赖项。要生成此报告,请继续如下操作:

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

以下示例报告显示了调试构建变体的依赖项树,并包含前一示例中的本地模块依赖项和远程依赖项。

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:25.1.0
|         +--- com.android.support:animated-vector-drawable:25.1.0
|         |    \--- com.android.support:support-vector-drawable:25.1.0
|         |         \--- com.android.support:support-v4:25.1.0
|         |              \--- LOCAL: internal_impl-25.1.0.jar
|         +--- com.android.support:support-v4:25.1.0
|         |    \--- LOCAL: internal_impl-25.1.0.jar
|         \--- com.android.support:support-vector-drawable:25.1.0
|              \--- com.android.support:support-v4:25.1.0
|                   \--- LOCAL: internal_impl-25.1.0.jar
\--- com.android.support:appcompat-v7:25.1.0
     +--- com.android.support:animated-vector-drawable:25.1.0
     |    \--- com.android.support:support-vector-drawable:25.1.0
     |         \--- com.android.support:support-v4:25.1.0
     |              \--- LOCAL: internal_impl-25.1.0.jar
     +--- com.android.support:support-v4:25.1.0
     |    \--- LOCAL: internal_impl-25.1.0.jar
     \--- com.android.support:support-vector-drawable:25.1.0
          \--- com.android.support:support-v4:25.1.0
               \--- LOCAL: internal_impl-25.1.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 构建配置为您的发布构建类型手动配置签署配置:

  1. 创建密钥库。密钥库是一个二进制文件,它包含一组私钥。您必须将密钥库存放在安全可靠的地方。
  2. 创建私钥。私钥代表将通过应用识别的实体,如某个人或某家公司。
  3. 将签署配置添加到模块级 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 应用的更多信息,请参阅打包可穿戴式设备应用

This site uses cookies to store your preferences for site-specific language and display options.

Hooray!

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.