8.3 KiB
8.3 KiB
文档与代码核对报告
一、发现的关键差异
❌ 差异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(文档错误描述)
七、建议
- 修正文档:将文档中的
update_soc.zip改为update.zip - 添加说明:说明SOC升级包外层和内层都叫
update.zip,避免混淆 - 统一命名:建议未来版本考虑统一命名规范,如:
- MCU:
update_mcu.zip - SOC:
update_soc.zip(需要同时修改代码)
- MCU:
核对完成时间: 2025-05-07 核对范围: 全部核心代码文件 发现差异: 1处(SOC升级包名称)