美文网首页
为您的应用配置 Play Feature Delivery

为您的应用配置 Play Feature Delivery

作者: 谷歌开发者 | 来源:发表于2021-03-30 17:14 被阅读0次
    image

    这是一个新的系列文章,我们称之为 "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 中的按需分发,请查阅:

    相关文章

      网友评论

          本文标题:为您的应用配置 Play Feature Delivery

          本文链接:https://www.haomeiwen.com/subject/vfughltx.html