查看原文
其他

为您的应用配置 Play Feature Delivery

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

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


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

  • Android App Bundle

    https://developer.android.google.cn/platform/technology/app-bundle


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


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


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

  • Play Feature Delivery
    https://developer.android.google.cn/guide/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 来按需安装和卸载某些模块,我稍后会在本文中介绍它。

  • PlayCore API
    https://developer.android.google.cn/guide/playcore

对于 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 属性,您可以确保功能模块只会被分发到有相关配置的设备上。

  • uses-feature 元素
    https://developer.android.google.cn/guide/topics/manifest/uses-feature-element

默认情况下,每个用户都可以从应用所发布的地区下载到其所有功能模块。您可以选择某些特定的功能模块只在特定的国家可用。这将是一个实现本地化应用非常好的方式。为了实现这个功能,您需要添加 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 来下载、安装和卸载模块。

  • PlayCore API
    https://developer.android.google.cn/guide/playcore

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


  • Github 上 PlayCoreKtx 的示例工程

    https://github.com/android/app-bundle-samples/tree/main/PlayCoreKtx

  • 视频: 为您的应用配置 Play Feature Delivery - MAD Skills

    https://www.youtube.com/watch?v=5HriGkqNqwk



感谢各位中国 Android 开发者朋友们的一路相伴,我们一直以来都非常重视您的声音,大家的想法和建议我们也都采纳并实施在产品和日常工作中。我们邀请您扫描下方二维码,向 "Android 开发者" 公众号分享您的建议和对我们的期待。



 点击屏末 | 阅读原文 | 即刻了解 Play Feature Delivery



推荐阅读


在应用中导航时使用 SafeArgs | 使用深层链接导航 | MAD Skills




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存