SplitInstall 异步任务概述
核心概念
Play Core SplitInstall 是 Google Play 提供的动态功能模块安装库,允许应用在运行时按需下载并安装功能模块,而不必在首次安装时打包所有资源。SplitInstall 的所有操作均以异步任务形式执行,不会阻塞应用的主线程。
- 模块化交付:将应用拆分为基础 APK 和多个功能分割包(Split APK),按需加载。
- 非阻塞安装:下载、安装、卸载等操作在后台线程执行,通过回调或监听器通知结果。
- 状态机驱动:每个异步任务从触发到完成会经历多个明确状态:
Pending→Downloading→Installing→Installed/Failed。 - 会话管理:每次安装请求生成一个会话 ID,可用于查询进度、取消或重试。
与传统同步安装对比
| 对比维度 | SplitInstall(异步) | 传统安装(同步) |
|---|---|---|
| 安装方式 | 后台下载 + 增量安装 | 直接启动 Intent 安装 APK / 阻塞式更新 |
| 对 UI 线程的影响 | 不阻塞,用户可继续操作 | 阻塞主线程,可能导致 ANR |
| 用户体验 | 进度可回显,支持取消、暂停 | 安装中无反馈,必须等待完成 |
| 失败处理 | 提供 OnFailureListener,可对应不同错误码 |
通常只能捕获 ActivityResult 失败 |
| 调用模式 | 基于 Task / ListenableFuture |
基于 startActivityForResult 或同步 API |
适用场景
- 减少初始安装包体积:将非核心功能(如高级滤镜、语音识别、AR 模块)作为按需模块,用户首次下载基础 APK 即可快速启动。
- 按需激活功能:仅在用户首次点击某个功能时才开始下载,避免浪费流量和存储。
- A/B 测试与灰度发布:为不同用户群体动态推送新功能模块,无需重新发布完整 APK。
- 动态语言包:根据用户设备语言设置只下载对应资源包。
- 节省后台流量:SplitInstall 支持仅在 Wi-Fi 下下载,且可检测存储空间、网络状态后自动恢复。
设计建议:尽量在应用内提前预注册 SplitInstallStateUpdatedListener,以便在安装过程中展示进度条或提示;同时使用 deferred-uninstall 策略清理不用的模块以释放空间。
API 示例:启动异步安装
以下 Kotlin 代码演示了如何发起一个异步 SplitInstall 任务并注册成功/失败回调:
val splitInstallManager = SplitInstallManagerFactory.create(context)
val request = SplitInstallRequest.newBuilder()
.addModule("feature_camera")
.build()
splitInstallManager.startInstall(request)
.addOnSuccessListener { sessionId ->
// 安装成功,可以加载模块
}
.addOnFailureListener { exception ->
// 处理错误,例如网络不可用、存储不足等
when ((exception as SplitInstallException).errorCode) {
SplitInstallErrorCode.NETWORK_ERROR -> { /* 提示用户检查网络 */ }
SplitInstallErrorCode.INSUFFICIENT_STORAGE -> { /* 清理空间 */ }
else -> { /* 通用处理 */ }
}
}
注意:在 Activity 或 Service 中使用回调时,务必使用 Context 的生命周期感知绑定(如 applicationContext 或协程作用域),避免内存泄漏或已销毁的 Activity 收到回调。