条件交付允许您为功能模块设置某些设备配置要求,以便在应用安装期间自动下载这些模块。例如,您可以配置一个包含增强现实 (AR) 功能的功能模块,使其仅在支持 AR 的设备上在应用安装时可用。
此交付机制当前支持根据以下设备配置在应用安装时控制模块的下载
如果设备不满足您指定的所有要求,则该模块不会在应用安装时下载。但是,您的应用可能稍后会请求使用 Play Core SDK 按需下载该模块。
在开始之前,请确保您使用的是 Android Studio 3.5 或更高版本。以下部分将向您展示如何为功能模块添加对条件交付的支持。
添加具有条件交付选项的新模块
创建具有条件交付的新功能模块的最简单方法是通过**新建模块**向导,如下所示
- 要打开**新建模块**对话框,请从菜单栏中选择**文件 > 新建 > 新建模块**。
- 在新模块对话框中,选择**动态功能模块**,然后单击**下一步**。
- 按照通常的方式配置您的模块,然后单击**下一步**。
在**模块下载选项**部分,完成以下步骤
使用最多 50 个字符指定**模块标题**。平台使用此标题来识别用户在确认是否要下载模块时的模块。因此,您的应用的基本模块必须包含模块标题作为 字符串资源,您可以对其进行翻译。使用 Android Studio 创建模块时,IDE 会为您将字符串资源添加到基本模块中,并在功能模块的清单中注入以下条目
<dist:module ... dist:title="@string/feature_title"> </dist:module>
在**安装时包含**下的下拉菜单中,选择**仅在具有指定功能的设备上安装时包含模块**,这将创建一个仅在具有您指定的某些配置的设备(例如设备功能或国家/地区)上在应用安装时包含在您的应用中的模块。Android Studio 会在模块的清单中注入以下内容以反映您的选择
<dist:module ... > <dist:delivery> <dist:install-time> <dist:conditions> <!-- If you specify conditions, as described in the steps below, the IDE includes them here. --> </dist:conditions> </dist:install-time> </dist:delivery> </dist:module>
如果您想将模块的自动下载限制在某些国家/地区或最低 API 级别,请单击**完成**以完成模块的创建,然后阅读有关如何根据国家/地区指定条件或最低 API 级别 的部分。否则,请单击**+ 设备功能**以添加设备需要下载安装时模块的功能。
在 设备特性 旁边,从下拉菜单中选择以下选项之一并指定其值。
- 名称: 允许您指定设备在安装时下载模块所需的硬件或软件特性。 条件交付支持的特性与
PackageManager
列出的FEATURE_*
常量相同。 如果您选择此选项,请在下拉菜单旁边的字段中键入特性的常量值的任何部分(例如“蓝牙”),然后选择出现的建议之一。 - OpenGL ES 版本: 允许您指定设备在安装时下载模块所需的 OpenGL ES 版本。 如果您选择此选项,请在下拉菜单旁边的字段中键入版本(例如“0x00030001”),然后选择出现的建议之一。
- 名称: 允许您指定设备在安装时下载模块所需的硬件或软件特性。 条件交付支持的特性与
如果要根据可用的设备特性添加多个条件,请单击 + 设备特性 以指定每个设备特性的条件。
如果您希望此模块可用于运行 Android 4.4(API 级别 20)及更低版本的设备并包含在多 APK 中,请选中 融合 旁边的复选框。 这意味着您可以为该模块启用按需行为,并禁用融合以将其从不支持下载和安装拆分 APK 的设备中省略。 Android Studio 会在模块的清单中注入以下内容以反映您的选择。
<dist:module ...> <dist:fusing dist:include="true | false" /> </dist:module>
配置完模块下载选项后,请单击 完成。
请注意,Android Gradle 插件不支持从动态特性模块运行 lint。 从相应的应用程序模块运行 lint 将在它的动态特性模块上运行 lint,并将所有问题包含在应用程序的 lint 报告中。
向现有特性模块添加条件交付选项
您可以通过模块的清单轻松地向现有特性模块添加条件交付选项。 但是,您应该首先阅读有关 条件交付选项与您可能已启用的其他交付选项的兼容性 的信息。
要开始使用,您需要首先将您的清单迁移到新的 <dist:delivery>
元素。 以下代码段显示了旧语法示例
<!-- This is the old syntax. -->
<dist:module
dist:title="@string/feature_title" dist:onDemand="true">
<dist:fusing dist:include="true"/>
</dist:module>
现在按如下方式指定上述交付选项。
<dist:module
dist:title="@string/feature_title">
<dist:delivery>
<dist:on-demand/>
</dist:delivery>
<dist:fusing dist:include="true"/>
</dist:module>
然后,您可以根据设备特性包含条件交付选项,如下所示。
<dist:module
dist:title="@string/feature_title">
<dist:delivery>
<dist:on-demand/>
<dist:install-time>
<dist:conditions>
<!-- Requires that the device support AR to download the module at
app install-time. -->
<dist:device-feature dist:name="android.hardware.camera.ar"/>
</dist:conditions>
</dist:install-time>
</dist:delivery>
<dist:fusing dist:include="true"/>
</dist:module>
以下部分讨论了条件交付的其他选项,例如按国家或最低 API 级别。
与其他模块下载选项的兼容性
由于特性模块提供多种选项来配置每个特性如何交付到用户的设备,因此了解条件交付选项如何受到其他设置的影响非常重要。 下表总结了条件交付与其他模块下载选项的兼容性。
模块下载选项 | 与条件交付的兼容性 |
---|---|
融合 (<dist:fusing dist:include="true"/> ) |
如果模块将此选项设置为 true,Google Play 不会在将应用程序部署到运行 API 级别 19 或更低版本的设备时尊重您指定的条件交付选项。 也就是说,启用融合的特性模块始终在安装时包含在运行 API 级别 19 或更低版本的设备中。 |
启用即时 (<dist:module dist:instant="true"/> ) |
条件交付选项不支持启用即时的特性模块。 |
按需 (<dist:on-demand/> ) |
默认情况下,如果您指定条件交付选项,该模块也可以按需提供。 |
根据国家指定条件
条件交付还允许您指定要从应用程序安装时下载模块中排除(或包含)的国家/地区。 例如,如果您模块实现了某些地区不可用的付款方式,则指定此条件可能会有用。
在此情况下,设备国家/地区通常由用户在其 Google Play 帐户中注册的账单地址确定。
要为您的模块指定国家/地区,请在特性模块的清单中包含以下内容。
<dist:conditions>
<!-- Set to "true" to specify countries to exclude from downloading
this module at app install-time. By default, modules are available
for download to all user countries. -->
<dist:user-countries dist:exclude="true">
<!-- Specifies the two-letter CLDR country code for regions that should
not download the module at app install-time. -->
<dist:country dist:code="CN"/>
<dist:country dist:code="HK"/>
</dist:user-countries>
</dist:conditions>
为 API 级别指定条件
如果特性模块依赖于仅在特定版本的 Android 平台中可用的 API,则根据设备的 API 级别指定条件可能很有用。
要根据设备的最小或最大 API 级别设置条件,请在特性模块的清单中包含以下内容。
<dist:conditions> <!-- Specifies the minimum API level that the device must satisfy in order to download your module at app install-time. The API level you specify must be greater or equal to the module's own minSdkVersion. --> <dist:min-sdk dist:value="21"/> <!-- Specifies the maximum API level that the device cannot exceed in order to download your module at app install-time. The API level you specify must be less than or equal to the module's own maxSdkVersion. --> <dist:max-sdk dist:value="24"/> </dist:conditions>