应用包与 APK 的区别在于,您无法将应用包部署到设备上。它是一种发布格式,将应用的所有已编译代码和资源包含在一个构建工件中。因此,上传已签名的应用包后,Google Play 拥有构建和签名应用的 APK 以及将其提供给用户所需的一切。
开始
大多数应用项目不需要花费太多精力来支持 Android 应用包。这是因为包含应用的基本 APK 的代码和资源的模块是标准应用模块,在您在 Android Studio 中创建新的应用项目时默认会获得该模块。也就是说,在下面的 build.gradle
文件中应用 application
插件的模块提供了应用基本功能的代码和资源。
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") }
除了提供应用的核心功能外,基本模块还提供了许多影响整个应用项目的构建配置和清单条目。
基本模块构建配置
对于大多数现有应用项目,您无需更改基本模块的构建配置中的任何内容。但是,如果您正在考虑向应用项目添加功能模块,或者之前使用多个 APK 发布了应用,则应注意基本模块构建配置的某些方面。
版本代码和应用更新
使用 Android 应用包,您不再需要管理上传到 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"
}
}
上传应用包后,Google Play 会使用基础模块中的版本代码为其从该包生成的所有 APK 分配相同的版本代码。也就是说,当设备下载并安装您的应用时,该应用的所有拆分 APK 共享相同的版本代码。
当您想要使用新代码或资源更新应用时,必须更新应用基础模块中的版本代码,并构建一个新的完整应用包。将该应用包上传到 Google Play 后,它会根据基础模块指定的版本代码生成一组新的 APK。随后,当用户更新您的应用时,Google Play 会为他们提供设备上当前安装的所有 APK 的更新版本。也就是说,所有已安装的 APK 都更新到新的版本代码。
其他注意事项
- 应用签名:如果在构建文件中包含签名信息,则应仅将其包含在基础模块的构建配置文件中。有关更多信息,请参阅 配置 Gradle 以对应用进行签名。
- 代码压缩:如果要为整个应用项目(包括其功能模块)启用代码压缩,则必须从基础模块的 build.gradle 文件中执行此操作。也就是说,您可以在功能模块中包含自定义 ProGuard 规则,但功能模块构建配置中的
minifyEnabled
属性将被忽略。 splits
块将被忽略:构建应用包时,Gradle 会忽略android.splits
块中的属性。如果要控制应用包支持的配置 APK 类型,请改用android.bundle
来禁用配置 APK 类型。- 应用版本控制:基础模块确定整个应用项目的版本代码和版本名称。有关更多信息,请转到有关如何管理应用更新的部分。
重新启用或禁用配置 APK 类型
默认情况下,构建应用包时,它支持为每组语言资源、屏幕密度资源和 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 库按需下载语言,如下载其他语言资源中所述。