update_process_explanation.md 6.5 KB

📦 Exe软件更新过程详细说明

🎯 核心问题解答

用户选择更新后,后台是否会自动下载exe文件到本地进行安装?

答案:是的,但不是简单的"下载exe替换exe",而是通过Tauri内置的更新器进行完整的更新安装流程。


🔄 Exe软件更新完整流程

阶段1: 更新触发

graph TD
    A[用户点击更新按钮] --> B[调用start_manual_update]
    B --> C[Tauri调用updater.check()]
    C --> D[向后端API发送版本检查请求]
    D --> E{后端返回更新信息}
    E -->|有更新| F[显示更新确认对话框]
    E -->|无更新| G[提示已是最新版本]

阶段2: 更新包下载

graph TD
    H[用户确认更新] --> I[Tauri updater下载更新包]
    I --> J[下载到临时目录]
    J --> K[验证数字签名]
    K -->|验证通过| L[解压更新文件]
    K -->|验证失败| M[下载失败,显示错误]
    L --> N[准备安装]

阶段3: 安装过程

graph TD
    O[开始安装] --> P{不同平台的安装方式}
    P -->|Windows| Q[替换主程序exe文件]
    P -->|macOS| R[更新.app包内容]
    P -->|Linux| S[更新AppImage文件]
    Q --> T[更新完成]
    R --> T
    S --> T

阶段4: 重启生效

graph TD
    U[安装完成] --> V[询问用户是否重启]
    V -->|是| W[立即重启应用]
    V -->|否| X[显示重启提醒]
    W --> Y[启动新版本]
    X --> Z[继续运行旧版本]
    Z --> AA[下次启动时自动使用新版本]

📁 实际文件操作细节

Windows平台更新过程

1. 下载阶段

# 更新包下载到临时目录
C:\Users\{username}\AppData\Local\Temp\tauri_updater\update.exe

# 同时下载签名文件用于验证
C:\Users\{username}\AppData\Local\Temp\tauri_updater\update.exe.sig

2. 安装阶段

# Tauri更新器执行以下操作:
# 1. 验证更新包签名
# 2. 创建备份(可选)
# 3. 替换主程序文件
# 4. 更新相关配置文件
# 5. 清理临时文件

# 原始文件位置
C:\Program Files\游铛铛\youdangdang.exe

# 更新后的新文件
# (文件名不变,但内容已更新)

3. 重启阶段

// Rust代码中的重启逻辑
app.restart(); // 这会关闭当前进程,启动新的exe文件

macOS平台更新过程

1. 下载阶段

# 更新包下载到临时目录
/tmp/tauri_updater/update.dmg

2. 安装阶段

# 挂载DMG文件
hdiutil attach /tmp/tauri_updater/update.dmg

# 复制新版本到应用程序目录
cp -r /Volumes/Update/游铛铛.app /Applications/

# 卸载DMG
hdiutil detach /Volumes/Update

Linux平台更新过程

1. 下载阶段

# 下载AppImage文件
/tmp/tauri_updater/update.AppImage

2. 安装阶段

# 替换原有AppImage文件
mv /tmp/tauri_updater/update.AppImage /opt/youdangdang/youdangdang.AppImage

# 设置执行权限
chmod +x /opt/youdangdang/youdangdang.AppImage

🔍 关键技术细节

1. 不是简单文件替换

// Tauri的update.download_and_install() 做了更多事情:

// 1. 下载更新包到临时目录
// 2. 验证数字签名确保安全性
// 3. 根据平台执行特定的安装逻辑
// 4. 处理依赖项更新
// 5. 维护配置文件一致性
// 6. 清理旧版本文件
// 7. 准备重启环境

2. 原子性更新保证

// 更新过程是原子的,要么全部成功,要么全部回滚
// 如果安装过程中断,不会产生损坏的安装状态

async fn safe_update(app: &AppHandle) -> Result<(), String> {
    // 1. 下载到临时位置
    // 2. 验证完整性
    // 3. 原子性替换
    // 4. 失败时自动清理
    Ok(())
}

3. 用户体验优化

// 前端进度显示
const updateProgress = {
    status: 'downloading', // downloading | installing | restarting
    progress: 75,         // 0-100
    message: '正在安装更新...'
};

// 实时反馈给用户
updateUI(updateProgress);

⚠️ 重要安全考虑

1. 数字签名验证

// 每次更新都验证签名
let is_valid = verify_signature(update_file, signature, public_key)?;
if !is_valid {
    return Err("Update signature verification failed".to_string());
}

2. 权限控制

// tauri.conf.json 中的权限配置
{
  "updater": {
    "active": true,
    "pubkey": "应用程序公钥",
    "endpoints": ["https://secure-api.youdangdang.com/updates"]
  }
}

3. 网络安全

  • HTTPS传输确保更新包不被篡改
  • CDN分发提高下载速度和可靠性
  • 失败重试机制处理网络异常

🚀 实际用户体验

更新对话框流程

1. [发现更新] 对话框
   "发现新版本 v1.0.1,是否更新?"
   [更新内容]
   - 修复了重要bug
   - 提升了稳定性
   [稍后提醒] [立即更新]

2. [下载中] 进度提示
   "正在下载更新文件..."
   [████████████░░░░] 75%

3. [安装中] 提示
   "正在安装更新,请稍候..."

4. [完成] 重启确认
   "更新完成,需要重启应用才能生效"
   [稍后重启] [立即重启]

强制更新特殊处理

// 强制更新不允许跳过
if is_force_update {
    let confirmed = dialog.ask("必须更新", "此更新包含重要安全修复,必须安装");
    if !confirmed {
        app.exit(1); // 直接退出应用
    }
}

🔧 故障排除

常见问题及解决方案

1. 下载失败

原因:网络问题、CDN故障
解决:自动重试、切换备用下载源

2. 签名验证失败

原因:更新包被篡改
解决:从官方渠道重新下载、联系技术支持

3. 安装失败

原因:权限不足、磁盘空间不足
解决:检查权限、清理磁盘空间

4. 重启后仍显示旧版本

原因:更新未正确安装
解决:卸载重装、检查安装日志

📊 性能优化

1. 增量更新

  • 只下载变更部分,减少下载量
  • 智能差异比较算法
  • 支持断点续传

2. 后台更新

// 支持静默更新(用户无感知)
async fn background_update() {
    // 在应用运行时下载更新
    // 等用户下次启动时自动生效
}

3. 流量控制

  • 根据网络状况调整下载速度
  • 支持流量限制设置
  • 移动网络友好

总结:用户选择更新后,系统会通过Tauri的成熟更新框架自动下载、验证、安装新版本exe文件,整个过程安全可靠,用户体验良好。 🚀