配置安装时交付

功能模块允许您将应用中的某些功能和资源与基本模块分离,并将其包含在您的应用包中。然后,您可以自定义交付选项,以控制搭载 Android 5.0(API 级别 21)或更高版本的设备何时以及如何下载应用的功能。

请记住,这种模块化类型需要更多的精力,并且可能需要重构您应用现有的代码,因此请仔细考虑您应用的哪些功能最适合按需提供给用户。

如果您希望随着时间的推移逐步模块化应用功能,而无需更改应用的行为或自定义高级交付选项,则可以通过创建配置为安装时交付的功能模块来实现。也就是说,您可以将某个功能模块化为一个功能模块,但不启用高级选项,以便该功能在用户安装您的应用时可用。

此外,配置为安装时交付的功能模块可以在不再需要时选择卸载。为此,需要将它们设置为可移除

本节介绍如何创建用于安装时交付的功能模块。在开始之前,请确保您使用的是 Android Studio 3.5 或更高版本以及 Android Gradle Plugin 3.5.0 或更高版本。

配置新的安装时交付模块

创建新功能模块最简单的方法是使用 Android Studio 3.5 或更高版本。由于功能模块对基本应用模块具有固有的依赖性,因此您只能将其添加到现有应用项目中。

要使用 Android Studio 将功能模块添加到您的应用项目,请按以下步骤操作:

  1. 如果您尚未打开,请在 IDE 中打开您的应用项目。
  2. 从菜单栏中选择文件 > 新建 > 新建模块
  3. 新建模块对话框中,选择动态功能模块,然后点击下一步
  4. 配置您的新模块部分中,完成以下操作:
    1. 从下拉菜单中选择您应用项目的基本应用模块
    2. 指定模块名称。IDE 使用此名称在您的Gradle 设置文件中将该模块标识为 Gradle 子项目。当您构建应用包时,Gradle 会使用子项目名称的最后一个元素将 <manifest split> 属性注入功能模块的清单中。
    3. 指定模块的包名称。默认情况下,Android Studio 会建议一个包名称,该名称结合了基本模块的根包名称和您在上一步中指定的模块名称。
    4. 选择您希望模块支持的最低 API 级别。此值应与基本模块的值匹配。
  5. 点击下一步
  6. 模块下载选项部分中,完成以下操作:

    1. 指定模块标题,最多 50 个字符。您的应用的基本模块必须包含模块标题作为字符串资源,您可以对其进行翻译。使用 Android Studio 创建模块时,IDE 会为您将字符串资源添加到基本模块,并在功能模块的清单中注入以下条目:

      <dist:module
          ...
          dist:title="@string/feature_title">
      </dist:module>
      
    2. 安装时包含下的下拉菜单中,选择在安装时包含模块。Android Studio 会在模块的清单中注入以下内容以反映您的选择:

      <dist:module ... >
        <dist:delivery>
            <dist:install-time />
        </dist:delivery>
      </dist:module>
      

      如果您想了解如何创建可在应用安装后下载的功能模块,请阅读配置按需交付

    3. 如果您希望此模块可用于搭载 Android 4.4(API 级别 20)及更低版本的设备并包含在多 APK 中,请勾选Fusing旁边的复选框。这意味着您可以将其从不支持下载和安装拆分 APK 的设备中省略。Android Studio 会在模块的清单中注入以下内容以反映您的选择:

      <dist:module ...>
          <dist:fusing dist:include="true | false" />
      </dist:module>
      
  7. 点击完成

Android Studio 完成模块创建后,您可以从项目窗格中自行检查其内容(从菜单栏中选择视图 > 工具窗口 > 项目)。默认代码、资源和组织应与标准应用模块的相似。

使安装时模块可移除

创建可在不再需要时选择卸载的安装时交付功能模块可能很有用。例如,为了减小应用的安装大小,您可以将训练或入门所需的内容模块化,然后在使用 Play Core API 设置用户使用应用后,卸载该功能模块

安装时模块默认不可移除。要将模块标记为可移除并允许卸载,请添加 removable 标签并将其值设置为 true

<dist:module ... >
  <dist:delivery>
      <dist:install-time>
          <dist:removable dist:value="true"/>
      </dist:install-time>
  </dist:delivery>
</dist:module>