Android NDK开发详解Android App Bundle之配置基本模块


对于大多数应用项目而言,支持 Android App Bundle 并不费力。这是因为,包含应用基本 APK 所需代码和资源的模块是标准应用模块,当您在 Android Studio 中创建新的应用项目时,会默认获得该模块。也就是说,将下面的应用插件应用到其 build.gradle 文件的模块,会提供应用的基本功能所需的代码和资源。

// The standard application plugin creates your app’s base module.
apply plugin: ‘com.android.application’
如果您想减小应用的初始下载大小,请一定要注意,此模块中包含的所有代码和资源都包含在应用的基本 APK 中。

基本模块除了为应用提供核心功能,还提供许多影响整个应用项目的构建配置和清单条目。例如,app bundle 的签名由您为基本模块提供的信息决定,而所有应用的 APK 版本则通过基本模块清单中的 versionCode 属性指定。下面将介绍基本模块的其他重要方面。

基本模块清单

应用的基本模块的清单与其他任何应用模块的清单类似。请注意,Google Play 在生成应用的基本 APK 时,会将所有模块的清单合并到基本 APK 的清单中。因此,如果您想要在应用项目中添加功能模块,需要注意关于基本 APK 清单的一些方面:

由于始终会先安装基本 APK,因此基本 APK 应该为应用提供主入口点,也就是说,它应该使用以下 intent 过滤器声明 Activity:


<intent-filter>
     <action android:name="android.intent.action.MAIN" />
     <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

您应该在清单中添加对 SplitCompat 库的支持,才能访问已下载模块的代码和资源。如需了解详情,请参阅访问已下载模块中的代码和资源。

同样,在搭载 Android 6.0(API 级别 23)及更低版本的设备上,也需要先重启应用,然后平台才能应用新的清单条目。因此,如果在下载功能模块后立即需要某些权限或服务,请考虑将它们包含在基本模块的清单中。

Android App Bundle 支持未压缩的原生库。使用 Android Gradle 插件 3.6.0 或更高版本构建应用时,为了帮助用户减少磁盘使用量,默认情况下,该插件会在基本模块的清单中设置以下内容:

<application
    android:extractNativeLibs="false"
    ... >

基本模块构建配置

对于大多数现有的应用项目,您无需更改基本模块构建配置中的任何内容。不过,如果您想要在应用项目中添加功能模块,则需要注意关于基本模块构建配置的一些方面:

应用签名:您无需在构建配置文件中包含签名信息,除非您想从命令行构建 app bundle。不过,如果包含了签名信息,则应仅将其包含在基本模块的构建配置文件中。如需了解详情,请参阅配置 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 类型的支持:


android {
    // When building Android App Bundles, the splits block is ignored.
    splits {...}

    // Instead, use the bundle block to control which types of configuration APKs
    // you want your app bundle to support.
    bundle {
        language {
            // Specifies that the app bundle should not support
            // configuration APKs for language resources. These
            // resources are instead packaged with each base and
            // feature APK.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = true
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }
}

管理应用更新

借助 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 都会更新为新版本代码。

注意:由于您不需要再为应用的所有 APK 管理版本代码,因此也无需再添加根据设备配置动态修改版本代码的逻辑。

下载其他配置 APK

上述更新流程存在一种例外情况,即当已安装的应用需要额外的配置 APK 时。设想有用户在下载您的应用之后需要更改其默认系统语言,如果您的应用支持这种语言,设备就会从 Google Play 中请求并下载这些语言资源的额外配置 APK。不过,这种类型的应用更新不会更改应用的版本代码,因此设备只会下载并安装需要的配置 APK。

本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2020-10-16。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值