Conditional delivery允许您设置某些设备配置要求,以便在应用程序安装期间自动下载动态功能模块。例如,您可以配置一个动态特性模块,其中包含增强现实(AR)功能,该功能仅在支持AR的设备的app安装中可用。
该交付机制目前支持基于以下设备配置,在app安装时控制模块的下载:
- 设备硬件和软件功能,包括OpenGL ES版本
- 用户的国家
- API级别
如果设备不满足您指定的所有要求,则在app安装时不会下载模块。但是,您的应用程序稍后可能会请求使用Play Core库按需下载模块。
在开始之前,请确保您使用的是Android Studio 3.5或更高版本。下面几节将向您展示如何向动态特性模块添加对条件交付的支持。
添加带有条件交付选项的新模块
最简单的方法,创建一个新的动态功能模块与条件交付是通过新的模块向导,如下:
- 要打开New Module对话框,请从菜单栏中选择File > New > New Module。
- 在New Module对话框中,选择Dynamic Feature Module并单击Next。
- 像往常一样配置模块,然后单击Next。
- 在模块下载选项部分,完成以下操作:
a 指定最多使用50个字符的模块标题。例如,当确认用户是否想下载模块时,平台使用这个标题向用户标识模块。因此,应用程序的基本模块必须包含模块标题作为字符串资源,您可以将其翻译。当使用Android Studio创建模块时,IDE将字符串资源添加到基本模块中,并在动态特性模块的清单中注入以下条目:
<dist:module
...
dist:title="@string/title_dynamic_feature">
</dist:module>
b.在“安装时包含”下拉菜单中,为具有指定功能的设备选择“app install Only include module at app install”,这将创建一个模块,该模块只包含在具有特定配置的设备(如设备功能或国家)的app安装时。Android Studio在模块的manifest中注入以下内容来反映你的选择:
<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>
c.如果希望将模块的自动下载限制在某些国家或最低API级别,请单击Finish完成创建模块,然后阅读关于如何根据国家或最低API级别指定条件的部分。否则,单击+ device feature添加设备所需的功能,以便在安装时下载模块。
d.在device-feature旁边,从下拉菜单中选择以下选项之一,并指定其值:
Name:允许指定设备在安装时下载模块所需的硬件或软件特性。条件交付支持的特性与PackageManager列出的features _* constants相同。如果选择此选项,请在下拉框旁边的字段中键入该特性的任何常量,如“bluetooth”,并选择出现的建议之一。
OpenGL ES版本:允许您指定设备在安装时下载模块所需的OpenGL ES版本。如果选择此选项,则在下拉框旁边的字段中输入版本,如“0x00030001”,并选择出现的建议之一。
d.如果希望根据可用的设备特性添加多个条件,请单击要指定的每个设备特性条件的+ device feature。
f.如果您希望这个模块对运行Android 4.4 (API级别20)或更低的设备可用,并且包含在multi- apk中,请选中Fusing旁边的复选框。这意味着您可以为这个模块启用随需而动的行为,并禁用fusing,以便从不支持下载和安装split apk的设备中省略它。Android Studio在模块的manifest中注入以下内容来反映你的选择:
<dist:module ...>
<dist:fusing dist:include="true | false" />
</dist:module>
5.配置完模块下载选项后,单击Finish。
向现有的动态特性模块添加条件交付选项
您可以通过模块的清单轻松地向现有的动态特性模块添加条件交付选项。但是,您应该首先了解条件交付选项与您可能已经启用的其他交付选项的兼容性。
首先,您需要将清单迁移到新的元素。下面的代码片段展示了旧语法的一个例子:
<!-- This is the old syntax. -->
<dist:module
dist:title="@string/title_dynamic_feature" dist:onDemand="true">
<dist:fusing dist:include="true"/>
</dist:module>
上面的交付选项现在指定如下。
<dist:module
dist:title="@string/title_dynamic_feature">
<dist:delivery>
<dist:on-demand/>
</dist:delivery>
<dist:fusing dist:include="true"/>
</dist:module>
然后,可以根据设备特性包括条件交付选项,如下所示。
<dist:module
dist:title="@string/title_dynamic_feature">
<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级别进行交付。
兼容其他模块下载选项
由于动态特性模块提供多个选项来配置如何将每个特性交付给用户的设备,因此了解条件交付选项如何受其他设置的影响非常重要。下表总结了条件交付与其他模块下载选项的兼容性。
下载选项模块 | 与conditional delivery的兼容性 |
Fusing (<dist:fusing dist:include="true"/> ) |
如果模块将此选项设置为true,则谷歌Play不考虑在将应用程序部署到运行API级别19或更低的设备时指定的条件传递选项。也就是说,对于运行API级别19或更低的设备,总是在安装时包含支持融合的动态特性模块。 |
Instant-enabled (<dist:module dist:instant="true"/> ) |
对于即时启用的动态特性模块,不支持条件交付选项。 |
On demand (<dist:on-demand/> ) |
默认情况下,如果指定条件交付选项,模块也可以随需应变。 |
根据国家指定条件
有条件交付还允许您指定希望在应用程序安装时从下载模块中排除(或包括)哪些国家。如果您的模块实现了在某些区域不可用的支付方法,那么指定此条件可能会很有用。
在此上下文中,设备国家通常由用户在其谷歌Play帐户上注册的账单地址决定。
要为模块指定国家,请在dynamic feature模块的清单中包含以下内容。
<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级别设置条件,请在动态特性模块的清单中包含以下内容。请记住,作为条件指定的API级别应该大于或等于模块自己的minSdkVersion。
<dist:conditions>
<!-- Specifies the minimum API level that the device must satisfy
in order to download your module at app install-time. -->
<dist:min-sdk dist:value="24"/>
</dist:conditions>