配置基本模块

应用包与 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 库实现按需语言下载,如下载其他语言资源中所述。