GeneralUpdate.Core — 执行流程详解
目标读者: 第一次接触 GeneralUpdate.Core 的开发者
阅读完你将理解:
- 更 新系统的整体架构和分层设计
- 从 App 启动到更新完成的完整执行链路
- Client 和 Upgrade 两个进程各自的职责
- Chain(差分)和 Full(全量)包的选择逻辑和执行差异
- 中间件管道的设计和工作原理
- Chain 失败时自动 Full 回退的容错机制
- IPC 通信如何跨进程传递更新任务
- Silent Mode 延迟更新的设计意图
目录
- 架构总览
- 入口:Bootstrap 的双重身份设计
- ClientStrategy:完整的更新流程
- DownloadPlanBuilder:下载计划与 Chain/Full 决策
- 下载引擎:DefaultDownloadOrchestrator
- 中间件管道:Hash → Compress → Patch
- DiffPipeline:差分引擎内部揭秘
- Chain→Full 回退机制
- IPC 通信协议
- UpdateStrategy:Upgrade 进程的执行流程
- OSS 模式:对象存储更新执行流程
- Silent Mode:延迟升级机制
- OS 策略的平台差异
- 错误恢复全景
- 关键代码路径索引
1. 架构总览
1.1 三层架构
GeneralUpdate.Core 采用三层调度 + 两层引擎的设计:
┌──────────────────────────────────────────────────────────┐
│ 第一层:入口调度 │
│ GeneralUpdateBootstrap │
│ 根据 AppType 分发到不同的角色策略 │
├──────────────────────────────────────────────────────────┤
│ 第二层:角色策略 │
│ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ClientStrategy│ │UpdateStrategy│ │ OssStrategy │ │
│ │ 下载+调度 │ │ 读IPC+应用 │ │ OSS 模式 │ │
│ └──────┬──────┘ └──────┬───────┘ └───────┬───────┘ │
│ │ │ │ │
│ └────────────────┼──────────────────┘ │
│ ▼ │
│ 第三层:OS 策略 │
│ ┌──────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │WindowsStrategy│ │LinuxStrategy│ │ MacStrategy │ │
│ └──────┬───────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ └────────────────┼───────────────┘ │
│ ▼ │
│ 中间件管道(每个版本独立执行) │
│ Hash → Compress → Patch │
├──────────────────────────────────────────────────────────┤
│ 两层引擎 │
│ ┌─────────────────────┐ ┌─────────────────────────┐ │
│ │ 下载引擎 │ │ 差分引擎 │ │
│ │ DefaultDownload │ │ DiffPipeline │ │
│ │ Orchestrator │ │ + HDiffPatch │ │
│ │ + 重试策略 │ │ + 并行补丁应用 │ │
│ └─────────────────────┘ └─────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
1.2 核心设计原则
| 原则 | 说明 |
|---|---|
| Client 统一下载 | 所有包(Client + Upgrade + Chain + Full 的 ZIP)都在 Client 进程中一次性下载到 %TEMP%/main_temp/ |
| Upgrade 只应用 | Upgrade 进程不做任何网络请求,通过加密 IPC 文件接收版本信息,只运行中间件管道 |
| 链式回退 | Chain(差分)包应用失败时,自动用已预下载的 Full 包原地重试,不需要第二次服务端请求 |
| 中间件管道 | 每个版本独立走一次 Hash → Compress → Patch 管道,单一职责、可测试、可替换 |
1.3 两种包类型
| 类型 | PackageType | 内容 | 应用方式 |
|---|---|---|---|
| Chain(差分) | 1 | .patch 二进制差分文件 + 新增文件 + 删除清单 | 解压到临时 PatchPath → 安装在目录的旧文件 + .patch 通过 HDiffPatch 合成新文件 |
| Full(全量) | 2 | 完整的应用文件 | 直接解压覆盖安装目录,跳过 PatchMiddleware |