为您的应用配置 Play Feature Delivery

这是一个新的系列文章,我们称之为 “Modern Android Development 技巧”,简称为 “MAD Skills”。本系列文章致力于帮助开发者们打造更好的现代 Android 开发体验,敬请关注。

今天为大家发布本系列文章中的第六篇: 为您的应用配置 Play Feature Delivery。如果您想回顾过去发布的内容,请参考下面链接查看:

在 “MAD Skills” 系列文章中,Android App Bundle 是 Android 应用默认的发布格式。

在用户设备上,相比于通用 apk 文件,使用 Android App Bundle 的应用文件大小平均缩减了 15%。您只需简单地切换到 Android App Bundle,就可以利用其节约文件大小和改进发布,无需改变应用的任何代码。在 2021 年下半年,Google Play 将要求 新的应用和游戏以 Android App Bundle 的格式发布

想要了解更多关于如何构建您的第一个 Android App Bundle,请参阅这个系列 之前的文章

当然您也可以利用 Play Feature Delivery 来进一步模块化以及优化安装应用。

为什么需要模块化应用和 Play Feature Delivery 呢?

模块化应用会在应用的不同部分之间创建清晰的界限,这会带来各种好处。

大多数情况下,您只需要重新构建应用的一部分,这也可以帮助您缩短应用的构建时间。构建时间的缩短以及清晰的模块界限可能会提高工程开发速度。

同时,从 Google Play Store 我们也可以发现:

应用的下载大小每降低 3 MB 可以增加 1% 的下载量

通过这篇文章您可以了解到 Android App Bundles 带来的 Play Feature Delivery 的新特性,这些特性可以帮助您更进一步地降低应用的大小。同时我还将会介绍一些 API (这些 API 可以用来实现按条件或按需进行功能分发) 以及各种不同的配置选项。

您可以使用 Android Studio 来体验 “新建模块 (New Module)” 的流程,我们在这篇文章里还会介绍该流程背后的逻辑,以及之后您可以如何更改配置。

建立基本模块

当使用功能模块开始模块化一个应用的时候,您的基本模块是安装时模块 (install-time modules),此时您已经可以从诸如构建速度以及工程开发速度的提升中获益。

安装时模块的基础配置如下所示:

/* Copyright 2020 Google LLC.  
   SPDX-License-Identifier: Apache-2.0 */

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dist="http://schemas.android.com/apk/distribution"
    package="com.google.android.samples.playcore.picture">

    <uses-feature android:name="android.hardware.camera" android:required="true" />

    <dist:module dist:title="@string/module_feature_picture">
        <dist:fusing dist:include="true" />
        <dist:delivery>
            <dist:install-time />
        </dist:delivery>
    </dist:module>
</manifest>

最重要的部分是分发命名空间 (distribution namespace),xmlns:dist="http://schemas.android.com/apk/distribution" 以及分发配置属性被设置为 install-time

当首次安装时,像这样配置的模块会被默认安装。

每个安装时模块都会被融合进基本模块,这也使他们变成不可移除的。如果您想以后可以移除安装时模块,您需要设置其 removable 的属性值为 true

有些模块很占存储空间,且只有初始安装应用时有用,一旦完成就不再需要,比如新手教程和注册流程等。对于这些模块来说,模块卸载会非常有用。

我们还提供了 PlayCore API 来按需安装和卸载某些模块,我稍后会在本文中介绍它。

对于 Android 5.0 以前的设备的提示

功能模块的安装机制需要运行在 Android 5.0 及以后的机型上。对于旧版本的 Android,功能模块可以放到基础 apk 中。如果想开启这个功能,您需要在 module 标签中设置 fusing 的 include 属性值为 true。

<dist:fusing dist:include=”true”>

设置按条件分发

除了安装时分发,按条件分发是另外一个请求功能模块的方法。安装条件包括设备 API 版本、用户所在国家和设备特性。

这是一个完整的 AndroidManifest 配置文件。

/* Copyright 2020 Google LLC.  
   SPDX-License-Identifier: Apache-2.0 */

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dist="http://schemas.android.com/apk/distribution"
    package="com.google.android.samples.playcore.picture">

    <uses-feature android:name="android.hardware.camera" android:required="true" />

    <dist:module dist:title="@string/module_feature_picture" >
        <dist:fusing dist:include="true" />
        <dist:delivery>
            <dist:install-time>
                <dist:conditions>
                    <dist:min-api dist:value="21"/>
                    <dist:max-api dist:value="29"/>
                    <dist:device-feature dist:name="android.hardware.camera"/>
                    <dist:user-countries dist:exclude="false">
                        <dist:country dist:code="DE"/>
                        <dist:country dist:code="GB"/>
                    </dist:user-countries>
                </dist:conditions>
            </dist:install-time>
            <dist:removable value="true" />
        </dist:delivery>
    </dist:module>
</manifest>

并不是所有的这些条件都需要设置,而且您也不大可能需要在单个模块中使用所有这些条件。我们来一步步解释它们。

如果要设置按条件分发,我们需要添加 dist:conditions 标签。

然后,通过使用 min-api 和 max-api,您可以声明所支持的最低以及最高的 API 版本。

如果您需要为一个特定模块指定 API 版本,这些会非常有用。

此外,AndroidManifest 文件中的每一个 uses-feature 元素 都可以被用来作为安装条件。通过使用 device-feature 属性,您可以确保功能模块只会被分发到有相关配置的设备上。

默认情况下,每个用户都可以从应用所发布的地区下载到其所有功能模块。您可以选择某些特定的功能模块只在特定的国家可用。这将是一个实现本地化应用非常好的方式。为了实现这个功能,您需要添加 user-countries 标签并设置两个字母的国家代码。

当您想设置某个功能在某些特定的国家不可用时,请确保设置 dist:exclude=“false”。如果您想让一个功能只在某个国家可用,请设置该值为 true。

不含代码的模块

有时您只想分发给用户一个类似 TensorFlow 模型的大型资源文件,在这个功能模块中,您并没有任何代码,这时请确保该模块的 AndroidManifest 文件中 hasCode 的值设置为 false。

<application android:hasCode="false" />

这个设置会告诉编译器不必生成 dex 文件

如果模块中没有代码而且忘记设置 hasCode 为 false 则会导致运行时异常。

按需分发配置

如果想完全自己控制应用的安装时间,您可以使用按需安装 (on-demand installation)。这意味着您可以在应用被下载并安装到用户设备之后调用 API 来安装模块。

使用按需安装节省了初始的下载时间和大小。

在 AndroidManifest 文件中,您需要设置分发选项为 on-demand。随后,您可以在应用的流程中使用 PlayCore API 来下载、安装和卸载模块。

如需更多资料详细了解 Play Feature Delivery 中的按需分发,请查阅: