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 核心优势

  1. 减小初始安装包体积:用户只需下载基础 APK,降低安装门槛,提高转化率。
  2. 节省用户流量与存储:仅在需要时下载模块,下载后可随时手动卸载。
  3. 增量更新:模块更新时仅下载变化部分,无需重新安装整个应用。
  4. 灵活的模块化架构:团队可独立开发、测试、发布不同功能模块,提高迭代效率。
  5. 兼容性稳定:基于 Android App Bundle 和 Play Core 官方库,向下兼容至 API 21。
注意:动态模块需要 Google Play 商店分发,无法用于侧载(APK 直接安装)场景。若应用面向中国区无 Play 商店的设备,需使用类似“插件化”方案替代。
动态模块按需加载(SplitInstall)架构流程 1. 用户安装基础 APK 2. 用户触发动态功能 3. 调用 SplitInstall API 4. 下载动态模块分片 5. 加载 Activity/资源 说明 基础 APK 始终在设备上; 动态模块按需从 Play 商店 下载,支持进度监听、 延迟安装和卸载。 环境要求 • Android 5.0 (API 21)+ • Google 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 详细调用、错误处理和性能优化。