app bundle 与 APK 的不同之处在于,您无法将其部署到设备。相反,它是一种发布格式,将您应用的所有经过编译的代码和资源包含在一个构建工件中。因此,在您上传已签名的 app Bundle 后,Google Play 就具备了构建和签署应用 APK 并将其提供给用户所需的一切。
开始使用
对于大多数应用项目而言,支持 Android App Bundle 并不费力。这是因为,包含应用基本 APK 所需代码和资源的模块是标准应用模块,当您在 Android Studio 中创建新的应用项目时,会默认获得该模块。也就是说,将下面的 application
插件应用到其 build.gradle
文件的模块,会提供应用的基本功能所需的代码和资源。
Groovy
// The standard application plugin creates your app's base module. plugins { id 'com.android.application' }
Kotlin
plugins { // The standard application plugin creates your app's base module. id("com.android.application") }
基础模块除了为应用提供核心功能,还提供许多影响整个应用项目的 build 配置和清单条目。
基础模块 build 配置
对于大多数现有的应用项目,您无需更改基础模块 build 配置中的任何内容。但是,如果您想要在应用项目中添加功能模块,或如果您先前使用多个 APK 发布了应用,则需要注意关于基础模块 build 配置的一些方面。
版本代码和应用更新
借助 Android App Bundle,您不必再为上传到 Google Play 的多个 APK 管理版本代码,而只需在应用的基本模块中管理一个版本代码,如下所示:
// In your base module build.gradle file
android {
defaultConfig {
…
// You specify your app’s version code only in the base module.
versionCode 5
versionName "1.0"
}
}
在您上传 app bundle 后,Google Play 会将您的基本模块中的版本代码分配给它从该 bundle 生成的所有 APK。也就是说,当设备下载并安装您的应用时,该应用的所有拆分 APK 会共用同一版本代码。
如果您想用新的代码或资源更新应用,则必须更新应用的基本模块中的版本代码,并重新构建整个 app bundle。在您将新 app bundle 上传到 Google Play 后,Google Play 会根据基本模块指定的版本代码生成一组新的 APK。随后,当用户更新应用时,Google Play 会向他们提供当前在设备上安装的所有 APK 的更新版本。也就是说,所有已安装的 APK 都会更新为新版本代码。
其他注意事项
- 应用签名:如果您在 build 文件中包含签名信息,则仅应将其包含在基础模块的 build 配置文件中。 如需了解详情,请参阅配置 Gradle 为您的应用签名。
- 代码缩减:如果需要为整个应用项目(包括其功能模块)启用代码缩减,您必须从基本模块的 build.gradle 文件实现。也就是说,您可以在功能模块中包含自定义 ProGuard 规则,但是功能模块构建配置中的
minifyEnabled
属性将被忽略。 - 忽略
splits
块:构建 app bundle 时,Gradle 会忽略android.splits
块中的属性。如果您想控制 app bundle 所支持的配置 APK 的类型,请改为使用android.bundle
停用配置 APK 的类型。 - 应用版本控制:基本模块将确定整个应用项目的版本代码和版本名称。如需了解详情,请转到介绍如何管理应用更新的部分。
重新启用或停用配置 APK 的类型
默认情况下,在您构建 app bundle 时,支持为每一组语言资源、屏幕密度资源和 ABI 库生成配置 APK。如下所示,在基础模块的 build.gradle
文件中使用 android.bundle
块,可以停用对一种或多种配置 APK 类型的支持:
Groovy
android { // When building Android App Bundles, the splits block is ignored. // You can remove it, unless you're going to continue to build multiple // APKs in parallel with the app bundle splits {...} // Instead, use the bundle block to control which types of configuration APKs // you want your app bundle to support. bundle { language { // This property is set to true by default. // You can specify `false` to turn off // generating configuration APKs for language resources. // These resources are instead packaged with each base and // feature APK. // Continue reading below to learn about situations when an app // might change setting to `false`, otherwise consider leaving // the default on for more optimized downloads. enableSplit = false } density { // This property is set to true by default. enableSplit = true } abi { // This property is set to true by default. enableSplit = true } } }
Kotlin
android { // When building Android App Bundles, the splits block is ignored. // You can remove it, unless you're going to continue to build multiple // APKs in parallel with the app bundle splits {...} // Instead, use the bundle block to control which types of configuration APKs // you want your app bundle to support. bundle { language { // This property is set to true by default. // You can specify `false` to turn off // generating configuration APKs for language resources. // These resources are instead packaged with each base and // feature APK. // Continue reading below to learn about situations when an app // might change setting to `false`, otherwise consider leaving // the default on for more optimized downloads. enableSplit = false } density { // This property is set to true by default. enableSplit = true } abi { // This property is set to true by default. enableSplit = true } } }
处理语言变更
Google Play 会根据在用户的设备设置中选择的语言来确定要随应用一起安装的语言资源。设想有用户在下载您的应用之后需要更改其默认系统语言,如果您的应用支持这种语言,设备就会从 Google Play 中请求并下载这些语言资源的额外配置 APK。
对于在应用内提供语言选择器,并且独立于系统级语言设置来动态更改应用语言的应用,您必须进行一些更改来避免因缺少资源而导致崩溃。将 android.bundle.language.enableSplit
属性设置为 false
,或者考虑按照下载其他语言资源中的描述,使用 Play Core 库实现按需语言下载