借助功能模块,您可以从应用的基本模块中分离某些功能和资源,并将其包含在 app bundle 中。然后,您可以自定义分发选项,以便控制搭载 Android 5.0(API 级别 21)或更高版本的设备何时以及如何下载应用功能。
请注意,这种类型的模块化所需的工作量更大,并可能需要重构您应用的现有代码,因此请仔细考虑您应用的哪些功能可从按需提供给用户中获得最大收益。
如果您想逐步对应用功能进行模块化处理,而不更改应用的行为,也不自定义高级分发选项,您可以通过创建功能模块(配置为在安装时分发)实现此目的。也就是说,您可以将某项功能模块化为功能模块,但不启用高级选项,以便用户安装您的应用时可以使用该功能。
此外,创建配置为安装时分发的功能模块可能很有用,因为如果您日后不再需要该功能,可以选择将其卸载掉。例如,如需减小应用的安装大小,您可以将完成培训或新手入门所需的内容模块化,然后在用户开始使用应用后卸载功能模块。
本部分介绍了如何创建配置为在安装时分发的功能模块。开始前,请确保您使用的是 Android Studio 3.5 或更高版本以及 Android Gradle 插件 3.5.0 或更高版本。
将新模块配置为在安装时分发
如需创建新功能模块,最简单的方法是使用 Android Studio 3.5 或更高版本。由于功能模块本身依赖于基本应用模块,因此您只能在创建好应用项目之后向其中添加功能模块。
如需使用 Android Studio 向应用项目中添加功能模块,请按以下步骤操作:
- 在 IDE 中打开您的应用项目(如果您尚未打开)。
- 从菜单栏中依次选择 File > New > New Module。
- 在 Create New Module 对话框中,选择 Dynamic Feature Module,然后点击 Next。
- 在 Configure your new module 部分中,完成以下操作:
- 从下拉菜单中选择应用项目的 Base application module。
- 指定 Module name。IDE 会使用此名称在 Gradle 设置文件中将该模块标识为 Gradle 子项目。当您构建 app bundle 时,Gradle 会使用子项目名称的最后一个元素在功能模块的清单中注入
<manifest split>
属性。 - 指定该模块的 package name。默认情况下,Android Studio 会建议一个软件包名称,该名称由基本模块的根目录软件包名称和您在上一步中指定的模块名称组合而成。
- 选择您希望该模块支持的 Minimum API level。此值应与基本模块的值一致。
- 点击 Next。
在 Module Download Options 部分中,完成以下操作:
指定最多包含 50 个字符的 Module title。应用的基本模块必须将模块标题作为您能读懂的字符串资源纳入其中。使用 Android Studio 创建模块时,IDE 会为您将字符串资源添加到基本模块中,并在功能模块的清单中注入以下条目:
<dist:module ... dist:title="@string/feature_title"> </dist:module>
在 Install-time inclusion 下的下拉菜单中,选择 Include module at install-time。Android Studio 会在该模块的清单中注入以下内容来反映您的选择:
<dist:module ... > <dist:delivery> <dist:install-time /> </dist:delivery> </dist:module>
如果您想了解如何创建可在安装应用后下载的功能模块,请参阅配置按需分发。
如果您希望此模块可提供给搭载 Android 4.4(API 级别 20)及更低版本的设备并包含在多 APK 中,请选中 Fusing 旁边的复选框。这意味着,您可以从不支持下载和安装拆分 APK 的设备上将其省略。Android Studio 会在该模块的清单中注入以下内容来反映您的选择:
<dist:module ...> <dist:fusing dist:include="true | false" /> </dist:module>
点击 Finish。
在 Android Studio 完成模块创建后,从 Project 窗格中自行检查其内容(从菜单栏中依次选择 View > Tool Windows > Project)。默认代码、资源和组织应与标准应用模块的默认代码、资源和组织类似。
功能模块构建配置
当您使用 Android Studio 创建新的功能模块时,IDE 会对该模块的 build.gradle
文件应用以下 Gradle 插件。
// The following applies the dynamic-feature plugin to your feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your feature module.
apply plugin: 'com.android.dynamic-feature'
适用于标准应用插件的很多属性也适用于功能模块。下面几部分介绍了应该和不应该包含在功能模块构建配置中的属性。
不应包含在功能模块构建配置中的内容
由于每个功能模块都依赖于基本模块,因此它还会继承某些配置。因此,您应该在功能模块的 build.gradle
文件中省略以下内容:
- 签名配置:使用您在基本模块中指定的签名配置对 app bundle 进行签名。
minifyEnabled
属性:您只能在基本模块的构建配置中为整个应用项目启用代码缩减。因此,您应该在功能模块中省略此属性。不过,您可以为每个功能模块指定其他 ProGuard 规则。versionCode
和versionName
:构建 app bundle 时,Gradle 会使用基本模块提供的应用版本信息。您应该在功能模块的build.gradle
文件中省略这些属性。
与基本模块建立关系
当 Android Studio 创建功能模块时,它会向基本模块的 build.gradle
文件添加 android.dynamicFeatures
属性,以使该功能模块对基本模块可见,如下所示:
// In the base module’s build.gradle file.
android {
...
// Specifies feature modules that have a dependency on
// this base module.
dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}
此外,Android Studio 还会将基本模块添加为功能模块的依赖项,如下所示:
// In the 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 feature modules.
proguardFiles 'proguard-rules-dynamic-features.pro'
}
}
请注意,这些 ProGuard 规则会在构建时与其他模块(包括基本模块)的规则合并在一起。因此,尽管每个功能模块都可以指定一组新规则,但这些规则会应用于应用项目中的所有模块。
部署应用
在开发支持功能模块的应用时,您可以像往常一样,从菜单栏中依次选择 Run > Run(或点击工具栏中的 Run 图标 ),将该应用部署到连接的设备。
如果您的应用项目包含一个或多个功能模块,您可以通过修改现有的运行/调试配置以选择需要在部署应用时包含的功能,具体操作步骤如下:
- 从菜单栏中依次选择 Run > Edit Configurations。
- 在 Run/Debug Configurations 对话框的左侧面板中,选择所需的 Android App 配置。
- 在 General 标签页中的 Dynamic features to deploy 下,选中需要在部署应用时包含的每个功能模块旁边的复选框。
- 点击 OK。
默认情况下,Android Studio 不会使用 app bundle 部署您的应用,而是由 IDE 构建针对部署速度(而非 APK 大小)进行了优化的 APK,并将其安装到设备中。如需将 Android Studio 配置为通过 app bundle 构建和部署 APK 以及免安装体验,请修改运行/调试配置。
其他资源
如需详细了解如何使用功能模块,请使用以下资源。
博文
- 能够助力您在 Google Play 上开发和发布产品并拓展业务的新功能
- 最新的 Android App Bundle 更新,包括针对其他语言的 API
- Patchwork Plaid - 模块化故事