这是一个新的系列文章,我们称之为 "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 中的按需分发,请查阅:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。