配置安装时交付

功能模块允许您将某些功能和资源与应用的基本模块分开,并将它们包含在应用包中。然后,您可以自定义交付选项来控制运行 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>