第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/流量判断 + 本地缓存有效期。
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的并发数,确保未超过设备限制。