条件交付允许您为功能模块设置某些设备配置要求,以便在应用安装期间自动下载。例如,您可以配置一个包含增强现实 (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_*
常量相同的特性。如果您选择此选项,请在下拉菜单旁边的字段中键入特性的常量值的任何部分,例如“bluetooth”,然后选择出现的建议之一。 - 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>