为您的应用配置 Play Feature Delivery
今天为大家发布本系列文章中的第六篇: 为您的应用配置 Play Feature Delivery。如果您想回顾过去发布的内容,请参考下面链接查看:
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 https://developer.android.google.cn/guide/app-bundle/play-feature-delivery
为什么需要模块化应用和 Play Feature Delivery 呢?
大多数情况下,您只需要重新构建应用的一部分,这也可以帮助您缩短应用的构建时间。构建时间的缩短以及清晰的模块界限可能会提高工程开发速度。
同时,从 Google Play Store 我们也可以发现:
应用的下载大小每降低 3 MB 可以增加 1% 的下载量
建立基本模块
/* 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>
每个安装时模块都会被融合进基本模块,这也使他们变成不可移除的。如果您想以后可以移除安装时模块,您需要设置其 removable 的属性值为 true。
有些模块很占存储空间,且只有初始安装应用时有用,一旦完成就不再需要,比如新手教程和注册流程等。对于这些模块来说,模块卸载会非常有用。
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>
uses-feature 元素 https://developer.android.google.cn/guide/topics/manifest/uses-feature-element
不含代码的模块
<application android:hasCode="false" />
如果模块中没有代码而且忘记设置 hasCode 为 false 则会导致运行时异常。
按需分发配置
PlayCore API https://developer.android.google.cn/guide/playcore
Github 上 PlayCoreKtx 的示例工程
https://github.com/android/app-bundle-samples/tree/main/PlayCoreKtx
视频: 为您的应用配置 Play Feature Delivery - MAD Skills
https://www.youtube.com/watch?v=5HriGkqNqwk
推荐阅读
在应用中导航时使用 SafeArgs | 使用深层链接导航 | MAD Skills