配置安装时分发

借助动态功能模块,您可以从应用的基本模块中分离某些功能和资源,并将其包含在 App Bundle 中。然后,您可以通过 Dynamic Delivery 自定义分发选项来控制搭载 Android 5.0(API 级别 21)或更高版本的设备何时以及如何下载应用功能。

请注意,这种类型的模块化所需的工作量更大,并可能需要重构您应用的现有代码,因此请仔细考虑您应用的哪些功能可从按需提供给用户中获得最大收益。

如果您想逐步对应用功能进行模块化处理,而不更改应用的行为,也不自定义高级分发选项,则可以通过创建(配置为在安装时分发的)动态功能模块来实现此目的。也就是说,您可以将某项功能模块化为动态功能,但不启用高级选项,以便用户安装您的应用时可以使用该功能。

此外,创建配置为在安装时分发的动态功能可能很有用,因为如果您日后不再需要该功能,可以选择将其卸载掉。例如,要减小应用的安装大小,您可以将完成培训或新手入门所需的内容模块化,然后在用户开始使用应用后卸载动态功能模块

本部分介绍了如何创建配置为在安装时分发的动态功能模块。开始前,请确保您使用的是 Android Studio 3.3 或更高版本以及 Android Gradle Plugin 3.3.0 或更高版本。

配置为在安装时分发新模块

创建新动态功能模块的最简单方法是使用 Android Studio 3.3 或更高版本。由于动态功能模块本身依赖于基本应用模块,因此您只能在创建好应用项目之后向其中添加动态功能模块。

要使用 Android Studio 向应用项目中添加动态功能模块,请按以下步骤操作:

  1. 在 IDE 中打开您的应用项目(如果您尚未打开)。
  2. 从菜单栏中依次选择 File > New > New Module
  3. Create New Module 对话框中,选择 Dynamic Feature Module,然后点击 Next
  4. Configure your new module 部分中,完成以下操作:
    1. 从下拉菜单中选择应用项目的 Base application module
    2. 指定 Module name。IDE 会使用此名称在 Gradle 设置文件中将该模块标识为 Gradle 子项目。当您编译 App Bundle 时,Gradle 会使用子项目名称的最后一个元素在动态功能模块的清单中注入 <manifest split> 属性。
    3. 指定该模块的 package name。默认情况下,Android Studio 会建议一个软件包名称,该名称由基本模块的根目录软件包名称和您在上一步中指定的模块名称组合而成。
    4. 选择您希望该模块支持的 Minimum API level。此值应与基本模块的值一致。
  5. 点击 Next
  6. Configure On-Demand Options 部分中,取消选中 Enable on-demand 旁边的复选框。如果您想了解如何创建可在安装应用后下载的动态功能,请参阅配置按需分发
  7. 点击 Finish

在 Android Studio 完成模块创建后,从 Project 窗格中自行检查其内容(从菜单栏中依次选择 View > Tool Windows > Project)。默认代码、资源和组织应与标准应用模块的默认代码、资源和组织类似。

动态功能模块编译配置

当您使用 Android Studio 创建新的动态功能模块时,IDE 会对该模块的 build.gradle 文件应用以下 Gradle 插件。

// The following applies the dynamic-feature plugin to your dynamic feature module.
    // The plugin includes the Gradle tasks and properties required to configure and build
    // an app bundle that includes your dynamic feature module.

    apply plugin: 'com.android.dynamic-feature'
    

适用于标准应用插件的很多属性也适用于动态功能模块。以下各部分介绍了您应该和不应该在动态功能模块的编译配置中包含的属性。

不应在动态功能模块编译配置中包含的内容

由于每个动态功能模块都依赖于基本模块,因此它还会继承某些配置。因此,您应该在动态要素模块的 build.gradle 文件中省略以下内容:

  • 签名配置:使用您在基本模块中指定的签名配置对 App Bundle 进行签名。
  • minifyEnabled 属性:您只能根据基本模块的编译配置为整个应用项目启用代码压缩功能。因此,您应该从动态功能模块中省略此属性。不过,您可以为每个动态功能模块指定其他 ProGuard 规则
  • versionCodeversionName:编译 App Bundle 时,Gradle 会使用基本模块提供的应用版本信息。您应该从动态模块的 build.gradle 文件中省略这些属性。

与基本模块建立关系

当 Android Studio 创建动态功能模块时,它会向基本模块的 build.gradle 文件添加 android.dynamicFeatures 属性(如下所示),以使该动态功能模块对基本模块可见:

// In the base module’s build.gradle file.
    android {
        ...
        // Specifies dynamic feature modules that have a dependency on
        // this base module.
        dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
    }
    

此外,Android Studio 还会将基本模块添加为动态功能模块的依赖项,如下所示:

// In the dynamic feature module’s build.gradle file:
    ...
    dependencies {
        ...
        // Declares a dependency on the base module, ':app'.
        implementation project(':app')
    }
    

指定其他 ProGuard 规则

虽然只有基本模块的编译配置可以为您的项目启用代码压缩,但您可以使用 proguardFiles 属性为每个动态功能模块提供自定义 ProGuard 规则,如下所示。

android.buildTypes {
         release {
             // You must use the following property to specify additional ProGuard
             // rules for dynamic feature modules.
             proguardFiles 'proguard-rules-dynamic-features.pro'
         }
    }
    

请注意,这些 ProGuard 规则会在编译时与其他模块(包括基本模块)的规则合并在一起。因此,尽管每个动态功能模块都可以指定一组新规则,但这些规则会应用于应用项目中的所有模块。

部署应用

在开发支持 Dynamic Delivery 的应用时,您可以像往常一样,从菜单栏中依次选择 Run > Run(或点击工具栏中的 Run 图标 ),将该应用部署到连接的设备。

如果您的应用项目包含一个或多个动态功能模块,则可以通过修改现有的运行/调试配置来选择要在部署应用时包含的动态功能,如下所示:

  1. 从菜单栏中依次选择 Run > Edit Configurations
  2. Run/Debug Configurations 对话框的左侧面板中,选择所需的 Android App 配置。
  3. General 标签中的 Dynamic features to deploy 下,选中要在部署应用时包含的每个动态功能模块旁边的复选框。
  4. 点击 OK

默认情况下,Android Studio 不会使用 App Bundle 部署您的应用。但是,IDE 会编译针对部署速度(而非 APK 大小)进行了优化的 APK,并将其安装到设备中。要将 Android Studio 配置为通过 App Bundle 编译和部署 APK 和免安装体验,请修改运行/调试配置

其他资源

要详细了解如何使用/支持 Dynamic Delivery,请使用以下资源。

博文

视频