Files
Obsidian/项目文档/犀重/文档与代码核对报告.md
2026-11-05 14:35:04 +08:00

8.3 KiB
Raw Permalink Blame History

文档与代码核对报告

一、发现的关键差异

❌ 差异1:SOC升级包名称不一致

文档描述:
  update_soc.zip

实际代码:
  StorageVolumeEventListener.java:29
  public static final String SOC_UPDATE_FILE = "update.zip";
  
结论:代码检测的是 "update.zip",不是 "update_soc.zip"

二、完整对照表

2.1 升级包名称对照

项目 文档描述 实际代码 是否一致
MCU升级包 update_mcu.zip update_mcu.zip ✅ 一致
SOC升级包 update_soc.zip update.zip ❌ 不一致
MCU固件文件 cortex-gdm4.bin cortex-gdm4.bin ✅ 一致
SOC升级文件 update.zip update.zip ✅ 一致
签名文件 ValidationFile.ini ValidationFile.ini ✅ 一致

2.2 升级包结构对照

MCU升级包(一致)

文档描述:
  update_mcu.zip
    ├── cortex-gdm4.bin
    └── ValidationFile.ini

实际代码:
  McuM3Update.java:446
    File updateFile = new File(unzippedPath + "cortex-gdm4.bin");
  
  McuM3Update.java:450
    File signatureFile = new File(unzippedPath + "ValidationFile.ini");

结论:✅ 完全一致

SOC升级包(有差异)

文档描述:
  update_soc.zip
    ├── update.zip
    └── ValidationFile.ini

实际检测:
  StorageVolumeEventListener.java:92
    File socFile = new File(path + File.separator + SOC_UPDATE_FILE);
    // SOC_UPDATE_FILE = "update.zip"
    
  所以用户插入的U盘里,SOC升级包名称应该是:
    update.zip(不是 update_soc.zip)
    
  解压后的文件:
    SocUpdate.java:149
      File updateFile = new File("/sdcard/zhongqi_soc_update/update.zip");
    
    SocUpdate.java:203
      File signatureFile = new File(unzippedPath + "ValidationFile.ini");

实际结构:
  update.zip(外层,用户插入U盘的文件)
    ├── update.zip(内层,真正的OTA包)
    └── ValidationFile.ini

结论:❌ 文档描述错误
  - 用户U盘里的文件名是 "update.zip",不是 "update_soc.zip"
  - 解压后的结构一致

三、详细代码验证

3.1 升级包检测逻辑

// StorageVolumeEventListener.java:89-102
File mcuFile = new File(path + File.separator + MCU_M3_UPDATE_FILE);
// MCU_M3_UPDATE_FILE = "update_mcu.zip"

File socFile = new File(path + File.separator + SOC_UPDATE_FILE);
// SOC_UPDATE_FILE = "update.zip"

if (mcuFile.exists()) {
    this.mUpdateFiles.add(mcuFile);  // 添加MCU升级包
}
if (socFile.exists()) {
    this.mUpdateFiles.add(socFile);  // 添加SOC升级包
}

结论:

  • MCU检测:update_mcu.zip ✅
  • SOC检测:update.zip ✅(不是 update_soc.zip)

3.2 验证逻辑对照

MCU验证流程

// McuM3Update.java:427-472
private boolean verify(File zipFile) {
    String unzippedPath = "/sdcard/zhongqi_mcu_update/";
    
    // 1. 解压
    ZipUtils.unzipFile(zipFile, targetDir);
    
    // 2. 计算哈希
    File updateFile = new File(unzippedPath + "cortex-gdm4.bin");
    byte[] fileHash = ZipFileVerifier.computeFileHash(updateFile);
    
    // 3. 读取签名
    File signatureFile = new File(unzippedPath + "ValidationFile.ini");
    byte[] signatureBytes = readSignBytes(signatureFile);
    
    // 4. 加载公钥
    String pem = "-----BEGIN PUBLIC KEY-----\n...";
    PublicKey publicKey = ZipFileVerifier.loadPublicKey(pem);
    
    // 5. 验证签名
    boolean isValid = ZipFileVerifier.verifySignature(fileHash, signatureBytes, publicKey);
    
    return isValid;
}

文档对照:

  • ✅ 解压路径:/sdcard/zhongqi_mcu_update/
  • ✅ 固件文件:cortex-gdm4.bin
  • ✅ 签名文件:ValidationFile.ini
  • ✅ 算法:SHA256withRSA

SOC验证流程

// SocUpdate.java:180-225
private boolean verify(File zipFile) {
    String unzippedPath = "/sdcard/zhongqi_soc_update/";
    
    // 1. 解压
    ZipUtils.unzipFile(zipFile, targetDir);
    
    // 2. 计算哈希
    File updateFile = new File(unzippedPath + "update.zip");
    byte[] fileHash = ZipFileVerifier.computeFileHash(updateFile);
    
    // 3. 读取签名
    File signatureFile = new File(unzippedPath + "ValidationFile.ini");
    byte[] signatureBytes = readSignBytes(signatureFile);
    
    // 4. 加载公钥
    String pem = "-----BEGIN PUBLIC KEY-----\n...";
    PublicKey publicKey = ZipFileVerifier.loadPublicKey(pem);
    
    // 5. 验证签名
    boolean isValid = ZipFileVerifier.verifySignature(fileHash, signatureBytes, publicKey);
    
    return isValid;
}

文档对照:

  • ✅ 解压路径:/sdcard/zhongqi_soc_update/
  • ✅ 固件文件:update.zip(内层)
  • ✅ 签名文件:ValidationFile.ini
  • ✅ 算法:SHA256withRSA

3.3 文件清理逻辑

// UpdateService.java:394-411
private void deleteFile() {
    String soc_path = "/sdcard/zhongqi_soc_update/";
    File soc_directory = new File(soc_path);
    deleteDirectory(soc_directory);
    
    String mcu_path = "/sdcard/zhongqi_mcu_update/";
    File mcu_directory = new File(mcu_path);
    deleteDirectory(mcu_directory);
}

文档对照:

  • ✅ 清理SOC目录:/sdcard/zhongqi_soc_update/
  • ✅ 清理MCU目录:/sdcard/zhongqi_mcu_update/
  • ✅ 递归删除:deleteDirectory()

四、修正后的正确流程

4.1 正确的升级包结构

用户U盘中的文件:

MCU升级包:
  update_mcu.zip
    ├── cortex-gdm4.bin
    └── ValidationFile.ini
        内容:sign=<256字节签名>

SOC升级包:
  update.zip(注意:不是 update_soc.zip!)
    ├── update.zip(内层真正的OTA包)
    └── ValidationFile.ini
        内容:sign=<256字节签名>

4.2 正确的文件名

类型 U盘文件名 解压后固件文件 签名文件
MCU update_mcu.zip cortex-gdm4.bin ValidationFile.ini
SOC update.zip update.zip(内层) ValidationFile.ini

五、总结

5.1 一致的部分 ✅

✅ 核心算法:SHA256withRSA
✅ 验证步骤:解压 → 计算哈希 → 读取签名 → 验证签名
✅ MCU升级包结构:update_mcu.zip
✅ MCU固件文件:cortex-gdm4.bin
✅ SOC解压后文件:update.zip
✅ 签名文件:ValidationFile.ini
✅ 公钥硬编码位置:McuM3Update.java / SocUpdate.java
✅ 文件清理逻辑:自动删除临时文件

5.2 不一致的部分 ❌

❌ SOC升级包名称:
   文档写的:update_soc.zip
   实际代码:update.zip
   
   影响:用户制作升级包时,SOC包名应该是 update.zip,不是 update_soc.zip

5.3 修正建议

需要修正文档中的以下内容:

第四章"升级包格式"部分:

错误:
  update_soc.zip

修正为:
  update.zip

说明:
  用户U盘中的SOC升级包名称是 "update.zip",不是 "update_soc.zip"
  解压后的内部结构保持不变(内层还是 update.zip)

六、实际流程确认

6.1 用户操作流程(修正版)

用户制作升级包:

MCU升级:
  1. 准备 cortex-gdm4.bin 文件
  2. 用私钥签名,生成 ValidationFile.ini
  3. 打包成 update_mcu.zip
  4. 复制到U盘根目录

SOC升级:
  1. 准备 update.zip(OTA升级包)
  2. 用私钥签名,生成 ValidationFile.ini
  3. 打包成 update.zip(注意:外层也叫 update.zip)
  4. 复制到U盘根目录

用户升级:
  1. 插入U盘
  2. 系统自动检测 update_mcu.zip 或 update.zip
  3. 自动验证签名
  4. 验证通过后升级
  5. 升级完成自动删除临时文件

6.2 文件命名总结

✅ 正确命名:
  MCU:update_mcu.zip
  SOC:update.zip

❌ 错误命名:
  SOC:update_soc.zip(文档错误描述)

七、建议

  1. 修正文档:将文档中的 update_soc.zip 改为 update.zip
  2. 添加说明:说明SOC升级包外层和内层都叫 update.zip,避免混淆
  3. 统一命名:建议未来版本考虑统一命名规范,如:
    • MCU:update_mcu.zip
    • SOC:update_soc.zip(需要同时修改代码)

核对完成时间: 2025-05-07 核对范围: 全部核心代码文件 发现差异: 1处(SOC升级包名称)