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
SplitInstall 异步任务状态流程 请求异步安装 Pending(等待) Downloading(下载) Installing(安装) Installed(完成) Failed(失败) 与传统同步安装对比 • 异步任务不阻塞 UI 线程,用户可保持操作连续;同步安装需用户等待安装完成。 • 异步提供回调监听(OnSuccess/OnFailure/OnProgress),可细化错误处理;同步通常只有成功/失败两种结果。 • 异步支持中途取消、恢复及会话管理;同步一旦开始无法中断。

适用场景

  • 减少初始安装包体积:将非核心功能(如高级滤镜、语音识别、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 收到回调。