1. 动态模块与 SplitInstall 概述
Android 动态功能模块(Dynamic Feature Module)允许开发者将应用的部分功能拆分为独立模块,在用户需要时才按需下载、安装并运行。Play Core 库中的 SplitInstallManager 是实现这一能力的核心 API,其官方名称为 SplitInstall(拆分安装)。
1.1 定义与核心概念
| 概念 | 说明 |
|---|---|
| 动态功能模块 | Android App Bundle 中可独立打包、延迟安装的模块,包含代码、资源和清单。 |
| SplitInstall | Google Play 提供的按需下载安装机制,用户无需更新整个 APK 即可获得新功能。 |
| 基础 APK | 应用启动时必须安装的核心模块,永远在设备上。 |
| 按需加载 | 通过 API 触发下载,完成后动态加载模块中的 Activity、Service 或资源。 |
关键点:动态模块的代码不会打包进初始 APK,而是作为单独的分片(Split)在 Play 商店分发。应用体积仅增加基础 APK 大小,用户流量和存储空间均得到优化。
1.2 适用场景
- 低频功能:如高级设置、帮助中心、客服聊天等用户很少使用的模块。
- 大资源模块:包含大量图片、音频、AR 模型等,仅在特定业务场景下需要。
- 区域限定功能:仅对特定国家/地区用户开放的功能,按需加载避免全球包膨胀。
- 促销/限时活动:节日主题、限时玩法等临时功能,活动结束后可卸载释放空间。
- 付费功能:通过应用内购买后按需下载的付费内容。
1.3 与 Instant App 的区别
| 维度 | 动态模块 SplitInstall | Instant App |
|---|---|---|
| 安装形态 | 用户需先安装基础 APK,模块按需下载到设备 | 无需安装,直接通过 URL 启动“免安装体验” |
| 应用大小限制 | 基础 APK + 模块总和不超过 Google Play 上限(目前约 150MB 以内可下载,更大需分片) | 所有模块总大小限制 10MB(Android 11+ 放宽至 15MB) |
| 持久性 | 模块下载后永久保留,用户可手动卸载 | 无持久状态,退出即清理 |
| 依赖 | 需要 Google Play 服务,使用 Play Core SDK | 需要 Google Play 服务及 Instant App 兼容性声明 |
| 典型用途 | 减少首次安装体积、按需扩容 | 试用、临时访问、场景化快速入口 |
1.4 核心优势
- 减小初始安装包体积:用户只需下载基础 APK,降低安装门槛,提高转化率。
- 节省用户流量与存储:仅在需要时下载模块,下载后可随时手动卸载。
- 增量更新:模块更新时仅下载变化部分,无需重新安装整个应用。
- 灵活的模块化架构:团队可独立开发、测试、发布不同功能模块,提高迭代效率。
- 兼容性稳定:基于 Android App Bundle 和 Play Core 官方库,向下兼容至 API 21。
注意:动态模块需要 Google Play 商店分发,无法用于侧载(APK 直接安装)场景。若应用面向中国区无 Play 商店的设备,需使用类似“插件化”方案替代。
1.5 基本实现思路预览
SplitInstall 的典型代码流程如下(后续章节详解):
// 1. 初始化 SplitInstallManager
SplitInstallManager manager = SplitInstallManagerFactory.create(context);
// 2. 准备安装请求
SplitInstallRequest request = SplitInstallRequest
.newBuilder()
.addModule("my_dynamic_feature")
.build();
// 3. 开始下载安装
manager.startInstall(request)
.addOnSuccessListener(sessionId -> { /* 下载成功 */ })
.addOnFailureListener(exception -> { /* 处理失败 */ });
// 4. 通过 Intent 启动模块中的 Activity
startActivity(new Intent().setClassName(
getPackageName(),
"com.example.mydynamicfeature.MainActivity"));
关键 API 类:
SplitInstallManager、SplitInstallRequest、SplitInstallSessionState。所有操作均通过异步回调或 LiveData 监听状态变化。
本章为动态模块按需加载奠定了基础。接下来的章节将逐步深入模块配置、清单声明、API 详细调用、错误处理和性能优化。