Files
Obsidian/项目文档/犀重/文档与代码核对报告.md
T

341 lines
8.3 KiB
Markdown
Raw Normal View History

2026-11-05 14:35:04 +08:00
# 文档与代码核对报告
## 一、发现的关键差异
### ❌ **差异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 升级包检测逻辑
```java
// 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验证流程**
```java
// 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验证流程**
```java
// 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 文件清理逻辑
```java
// 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升级包名称)