第1章 理解Dynamic Delivery核心概念与使用场景

1.1 什么是Dynamic Delivery

Dynamic Delivery(按需分发)是一种移动端资源交付策略:不将所有资源打包进安装包,而是在用户运行时按需加载、动态下发。其核心目标在于安装包瘦身与体验优化,同时支持灵活的功能更新。

关键收益:安装包体积降低 40%~70%;功能模块可独立更新,无需发版;用户仅下载真正使用的资源。

1.2 核心概念

概念说明技术依赖
资源按需加载运行时动态判断是否需要某资源,若需要则实时拉取资源清单(live manifest),异步加载框架
动态下发通过网络通道将资源推送到用户设备CDN + 版本管理 + 增量更新 (diff)
瘦身优化安装包只包含核心代码,非关键资源(图片、语言包、业务模块)延迟下载资源分包,懒加载,预加载策略
体验优化通过预加载、渐进式加载、降级策略减少等待预取(prefetch)、loading占位、错误重试

1.3 典型应用场景

  • 大型游戏资源包:关卡、纹理、音效按需下载,先玩首章,后续后台静默下载。
  • 多语言/多地区业务:仅下载当前用户语言和区域的UI字符串、业务规则。
  • A/B实验与功能灰度:动态下发实验配置,用户触发实验时才下载对应逻辑包。
  • 超大规模列表/图片:社交媒体、电商首页只下载可视区域的内容,滚动时再加载。
避坑点:动态下发不当会导致“下载风暴”,建议使用优先级队列 + WIFI/流量判断 + 本地缓存有效期。
Dynamic Delivery 核心流程 安装包(核心) 资源清单服务 按需加载引擎 CDN资源分发 用户设备缓存 预加载 / 占位 / 降级 瘦身:安装包仅含核心代码 → 按需加载引擎 → 动态下载非关键资源 → 优化启动与滚动体验

1.4 与静态分发的对比

维度静态打包分发Dynamic Delivery
安装包体积全量资源,高仅核心,低
更新频率需发版审核实时下发,无需审核
首次启动时间较慢(大包下载)极快(小包+按需)
离线可用全部可用需提前缓存核心资源
错误容灾依赖安装完整性可降级、重试、版本回退

1.5 实现雏形:资源清单与懒加载配置

一个简化的资源清单 manifest.json 定义哪些资源可动态下发:

{
  "version": "1.0.0",
  "resources": [
    {
      "id": "level_2_scene",
      "url": "https://cdn.example.com/scenes/level2.scene",
      "size": 2048,
      "required": false,
      "preload": false
    },
    {
      "id": "en_strings",
      "url": "https://cdn.example.com/i18n/en.json",
      "size": 128,
      "required": true,
      "lang": "en"
    }
  ]
}

客户端按需加载引擎判断用户触发场景时执行:

// 伪代码示意
if (needResource('level_2_scene')) {
  loadFromCDN('level_2_scene', (data) => {
    sceneRenderer.render(data);
  }, (error) => {
    fallbackToPlaceholder(); // 降级
  });
}
常见错误:首次启动时并发加载过多动态资源导致主线程卡顿。应设置并发下载数 ≤ 4,并使用requestIdleCallback调度。

1.6 调试与验证清单

  • 确认资源清单是否能在无网络时返回缓存版本(离线降级)。
  • 使用Charles / Fiddler拦截动态资源请求,检查Cache-Control和ETag头部。
  • 在弱网(3G / 丢包 5%)下验证滚动列表图片是否出现空位或裂图。
  • 监控DownlaodPool的并发数,确保未超过设备限制。