配置安装时交付

功能模块允许您将某些功能和资源与应用的基础模块分开,并将它们包含在应用包中。然后,您可以自定义交付选项来控制运行 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 中,请选中融合旁边的复选框。这意味着您可以省略不支持下载和安装拆分 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>