为您的应用配置 Play Feature Delivery

为您的应用配置 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 中的按需分发,请查阅:

版权声明

禁止一切形式的转载-禁止商用-禁止衍生 申请授权

脉脉不得语
脉脉不得语
Zhengzhou Website
Android Developer | https://androiddevtools.cn and https://androidweekly.io Funder | GDG Zhengzhou Funder & Ex Organizer | http://Toast.show(∞) Podcast Host

你已经成功订阅到 Android 开发技术周报
太棒了!接下来,完成检验以获得全部访问权限 Android 开发技术周报
欢迎回来!你已经成功登录了。
Unable to sign you in. Please try again.
成功!您的帐户已完全激活,您现在可以访问所有内容。
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.
🍗