first commit
This commit is contained in:
commit
669f49b1d6
342 files changed
+320811
No files matched your search
@@ -0,0 +1,102 @@
|
||||
|
||||
需求:
|
||||
1、增加一个判断当前EMMC大小的接口,8G的设备走之前的从TF卡访问地图数据的接口。32G的设备使用新的接口,地图数据放在/mnt/sdcard/路径下。
|
||||
|
||||
2、增加两个地图拷贝的接口。名称可以是步骤一、步骤二,步骤一是如果map分区下无地图数据,从U盘拷贝到map分区下。如果map分区下已经有地图数据了,进入步骤二,从map分区拷贝到/mnt/sdcard/路径下。
|
||||
|
||||
3、增加一个删除地图数据的接口,万一map分区下数据不完整,可以把整个地图数据删掉重新拷贝。不然这个分区无法通过常规手段来更新地图。
|
||||
|
||||
|
||||
|
||||
源目录:/mnt/map/amapauto9
|
||||
目标目录:/mnt/sdcard/amapauto9
|
||||
|
||||
|
||||
|
||||
点击主页面的 导航 按钮,然后开始上述逻辑。
|
||||
入口现在分2个:
|
||||
1.点击导航按钮
|
||||
2.工程模式添加一个拷贝的入口、删除地图数据的入口
|
||||
|
||||
【腾讯文档】空白文档
|
||||
https://docs.qq.com/doc/DRkhUZFVwTm5VdXhJ
|
||||
|
||||
|
||||
|
||||
![[Screenshot_20260806_140916.png]]
|
||||
|
||||
弹框样式可以参考如下:
|
||||
|
||||
![[Screenshot_20260806_141228.png]]
|
||||
|
||||
|
||||
备注: 可以参考重汽10.1的项目 F:\zdCode\zhongqi 上已经有从U盘拷贝地图数据的接口
|
||||
|
||||
|
||||
|
||||
/mnt/map
|
||||
|
||||
|
||||
/mnt/sdcard amapauto9
|
||||
|
||||
|
||||
|
||||
USB 3.0 NTFS格式 从U盘拷贝到map
|
||||
从16:33分开始 -- 16:54分结束 差不多22分钟
|
||||
|
||||
USB 3.0 NTFS格式 从map拷贝到 sd卡
|
||||
17:41分开始 17:55分结束 差不多15分钟
|
||||
|
||||
|
||||
|
||||
USB 2.0 NTFS格式 从U盘拷贝到map
|
||||
从18:30分开始 -- 16:54分结束 差不多22分钟
|
||||
|
||||
USB 2.0 NTFS格式 从map拷贝到 sd卡
|
||||
17:41分开始 17:55分结束 差不多15分钟
|
||||
|
||||
|
||||
1.无数据
|
||||
2.数据不完整
|
||||
3.数据完整
|
||||
|
||||
根据大小判断,大于10G 代表数据完整
|
||||
|
||||
|
||||
|
||||
2026.08.12
|
||||
通过zip压缩的方式拷贝:
|
||||
从map拷贝到SdCard 耗费时间 23分钟。
|
||||
|
||||
约`31分04.7秒`
|
||||
|
||||
U盘导入到map分区 耗费时间:7分30秒 (U盘需要NTFS格式)
|
||||
|
||||
|
||||
|
||||
|
||||
目前的需求改动:之前的通过文件夹拷贝的方式要改成通过解压压缩包的方式,为了节省存储空间。
|
||||
1.复制地图到sdcard是要
|
||||
把/mnt/map/amapauto9里的amapauto9.zip 解压到 /mnt/sdcard/amapauto9里的地图资源解压到/sdcard/amapauto9/data/navi/compile_v2/chn
|
||||
语音资源解压到 /sdcard/amapauto9/data/voice
|
||||
|
||||
2.从U盘导入到Map分区 也是要改成把 U盘里的amapauto9.zip拷贝到 /mnt/map/amapauto9
|
||||
|
||||
|
||||
|
||||
2026.08.14
|
||||
|
||||
1.76G的数据验证
|
||||
从U盘拷贝到map 1分42秒
|
||||
从map解压到 sdcard **7分31.4秒**
|
||||
|
||||
优化后
|
||||
从U盘拷贝到map 1分42秒
|
||||
从map解压到 sdcard 4分30秒
|
||||
|
||||
优化后
|
||||
|
||||
7.81G的地图数据
|
||||
从U盘拷贝到map 6分03秒
|
||||
从map解压到 sdcard 16分53秒
|
||||
总的约23分钟
|
||||
@@ -0,0 +1,422 @@
|
||||
# PX3 升级流程说明
|
||||
|
||||
> 范围:仅梳理 PX3 本地 MPU 升级和 MCU 升级
|
||||
> 代码:`D:\zdCode\zhongqi_px3`
|
||||
> 分支:`zhongqi_th7_px3_plus_security`,HEAD `8497c2da8`
|
||||
|
||||
## 1. 总体说明
|
||||
|
||||
PX3 当前有两条升级链路:
|
||||
|
||||
| 类型 | 触发方式 | 新版包 | 旧版兼容 |
|
||||
| -------- | ------------ | ---------------- | ---------------------------- |
|
||||
| MPU/系统升级 | 开机或介质挂载后自动扫描 | `update_mpu.zip` | 受属性控制的 `update.img` |
|
||||
| MCU 升级 | 工程菜单手动触发 | `update_mcu.zip` | ZIP 不存在时兼容 `m3/cortex-*.bin` |
|
||||
|
||||
如果 `update_mpu.zip` 就走验签流程,如果有 `update.img` 就走老的升级流程,
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
PX3 计划保留的 MPU 新旧兼容与 RK3568 不同:
|
||||
|
||||
- RK3568:外层都叫 `update.zip`,根据包内是否存在 `ValidationFile.ini` 判断新旧格式。
|
||||
- PX3 业务目标:按外层文件名分流,优先级是 `update_mpu.zip → update.img`。
|
||||
- 当前 `1224` 源码尚未完全符合该目标:扫描函数仍主动检查 `update.zip`,独立裸 `update.img` 默认还会被属性开关拦截。
|
||||
|
||||
---
|
||||
|
||||
## 2. MPU 升级流程
|
||||
|
||||
### 2.1 触发和扫描
|
||||
|
||||
`RKUpdateReceiver` 在以下场景启动本地升级扫描:
|
||||
|
||||
| 场景 | 延时 |
|
||||
|---|---:|
|
||||
| 系统启动完成 `BOOT_COMPLETED` | 20 秒 |
|
||||
| 存储介质挂载 `MEDIA_MOUNTED` | 7 秒 |
|
||||
| 特定 USB 状态变化 | 5 秒 |
|
||||
|
||||
扫描目录:
|
||||
|
||||
```text
|
||||
/data/media/0/
|
||||
Environment.getExternalStorageDirectory()/
|
||||
/mnt/external_sd0/
|
||||
/mnt/usb_storage/
|
||||
```
|
||||
|
||||
如果根目录没有命中,还会扫描 `/mnt/usb_storage` 的一级子目录。
|
||||
|
||||
### 2.2 MPU 业务目标优先级
|
||||
|
||||
| 优先级 | 文件 | 处理方式 |
|
||||
|---:|---|---|
|
||||
| 1 | `update_mpu.zip` | 解压、验签内层 `update.img`、产品检查、RK image 升级 |
|
||||
| 2 | `update.img` | 属性允许时执行产品检查和 RK image 升级 |
|
||||
| 3 | 其他文件 | 不处理 |
|
||||
|
||||
服务发现第一个候选文件后立即返回。
|
||||
|
||||
### 2.3 当前源码与目标的差异
|
||||
|
||||
当前 `getValidFirmwareImageFile()` 实际扫描顺序为:
|
||||
|
||||
```text
|
||||
update_mpu.zip → OTA_PACKAGE_FILE(默认 update.zip)→ update.img
|
||||
```
|
||||
|
||||
另外,`1224` 版本处理独立裸 `update.img` 时会读取:
|
||||
|
||||
```text
|
||||
persist.sys.update.show
|
||||
```
|
||||
|
||||
- 属性为 `false`:直接忽略裸 `update.img`。
|
||||
- 属性为 `true`:才允许继续产品检查和升级。
|
||||
- 当前仓库中,唯一把该属性设置为 `true` 的位置在 `update_mpu.zip` 处理分支。
|
||||
- `1009`、`1010` 等早期压缩版本没有该属性拦截。
|
||||
|
||||
因此,当前源码不能直接表述为“已经实现 `update_mpu.zip → update.img` 两级兼容”。要达到业务目标,还需要停止扫描 `update.zip`,并明确恢复裸 `update.img` 的允许条件。
|
||||
|
||||
### 2.4 新版 `update_mpu.zip`
|
||||
|
||||
包结构:
|
||||
|
||||
```text
|
||||
update_mpu.zip
|
||||
├── update.img
|
||||
└── ValidationFile.ini
|
||||
```
|
||||
|
||||
`ValidationFile.ini` 当前读取:
|
||||
|
||||
```ini
|
||||
sign=<十六进制 RSA 签名>
|
||||
```
|
||||
|
||||
流程:
|
||||
|
||||
```text
|
||||
检测到 update_mpu.zip
|
||||
↓
|
||||
设置 persist.sys.update.show=true
|
||||
↓
|
||||
解压到 update_mpu.zip 所在目录
|
||||
↓
|
||||
读取 update.img 和 ValidationFile.ini
|
||||
↓
|
||||
计算 update.img 的 SHA-256
|
||||
↓
|
||||
使用硬编码 RSA-2048 公钥和 SHA256withRSA 验签
|
||||
↓
|
||||
JNI 读取 update.img 产品名
|
||||
↓
|
||||
与 ro.product.model 比较
|
||||
↓
|
||||
弹出升级确认页
|
||||
↓
|
||||
用户确认
|
||||
↓
|
||||
RecoverySystem.installRKimage()
|
||||
↓
|
||||
写入 /cache/recovery/last_flag 和 command
|
||||
↓
|
||||
执行 sync,等待 2 秒
|
||||
↓
|
||||
重启 Recovery 安装 update.img
|
||||
```
|
||||
|
||||
Recovery 命令:
|
||||
|
||||
```text
|
||||
--update_rkimage=<update.img完整路径>
|
||||
--locale=<当前语言>
|
||||
```
|
||||
|
||||
当前验签失败分支缺少 `return`,仍会打开确认页,并把外层 `update_mpu.zip` 当成标准 OTA 包再次校验。这是现有缺陷,不是兼容流程。
|
||||
|
||||
### 2.5 旧版裸 `update.img`
|
||||
|
||||
```text
|
||||
检测到 update.img
|
||||
↓
|
||||
读取 persist.sys.update.show
|
||||
├── false:忽略,不弹确认页
|
||||
└── true:继续
|
||||
↓
|
||||
检查镜像产品名是否匹配 ro.product.model
|
||||
↓
|
||||
用户确认
|
||||
↓
|
||||
installRKimage()
|
||||
↓
|
||||
重启 Recovery 安装
|
||||
```
|
||||
|
||||
裸 `update.img` 没有新增 RSA 验签,只做产品名检查。
|
||||
|
||||
### 2.6 MPU 结果处理
|
||||
|
||||
服务下次启动时读取:
|
||||
|
||||
```text
|
||||
/cache/recovery/last_flag
|
||||
```
|
||||
|
||||
| 标记 | 含义 |
|
||||
|---|---|
|
||||
| `success$path=...` | Recovery 报告升级成功 |
|
||||
| `updating$path=...` | 上次升级未形成成功状态 |
|
||||
|
||||
当前结果流程尚未闭环:
|
||||
|
||||
- 成功/失败提示 Activity 的启动代码被注释。
|
||||
- 没有统一结果广播。
|
||||
- 升级包删除没有稳定执行。
|
||||
- 新版包验签后用户取消,升级锁没有释放。
|
||||
- Recovery 写回 `last_flag` 的实现不在当前项目中。
|
||||
|
||||
---
|
||||
|
||||
## 3. MCU 升级流程
|
||||
|
||||
### 3.1 页面入口
|
||||
|
||||
```text
|
||||
Pro 版本设置页
|
||||
↓
|
||||
在硬件版本位置 3 秒内连续点击 10 次
|
||||
↓
|
||||
工程菜单 ProjectMenuActivity
|
||||
↓
|
||||
升级菜单 UpgradeMainActivity
|
||||
↓
|
||||
选择“M3程序升级”
|
||||
↓
|
||||
ZhongQiM3UpdateActivity
|
||||
↓
|
||||
用户确认
|
||||
↓
|
||||
IM0ManagerService.sendUpdateRequest(type, flashType)
|
||||
↓
|
||||
ImplM0ManagerService
|
||||
↓
|
||||
MonitorM0Update.sendUpdateRequest()
|
||||
```
|
||||
|
||||
升级通过 Binder 发起。广播只用于 MCU 返回最终结果后通知页面。
|
||||
|
||||
### 3.2 介质和文件
|
||||
|
||||
| 介质 | `flashType` | 文件路径 |
|
||||
|---|---:|---|
|
||||
| U 盘 | `0` | `/mnt/usb_storage/update_mcu.zip` |
|
||||
| TF 卡 | `1` | `/mnt/external_sd0/update_mcu.zip` |
|
||||
|
||||
当前正常 UI 没有传入 `FLASHTYPE=1`,所以实际默认走 U 盘。
|
||||
|
||||
代码保留 TF 卡分支,但页面状态检测历史上使用 `/mnt/external_sd`,通讯服务读取 `/mnt/external_sd0`,两边路径不一致。
|
||||
|
||||
`update_mcu.zip` 只在介质根目录查找,不递归搜索子目录。
|
||||
|
||||
### 3.3 包结构
|
||||
|
||||
```text
|
||||
update_mcu.zip
|
||||
├── cortex-gdm4.bin
|
||||
├── cortex-m3.bin
|
||||
└── ValidationFile.ini
|
||||
```
|
||||
|
||||
根据设备类型,实际刷写文件是 `cortex-gdm4.bin` 或 `cortex-m3.bin`。
|
||||
|
||||
### 3.4 解压和验签
|
||||
|
||||
```text
|
||||
开始 sendUpdateRequest()
|
||||
↓
|
||||
删除 /sdcard/zhongqi_mcu_update/
|
||||
↓
|
||||
解压 update_mcu.zip 到该目录
|
||||
↓
|
||||
根据 MCU 版本选择实际目标固件
|
||||
↓
|
||||
计算 SHA-256
|
||||
↓
|
||||
读取 ValidationFile.ini 中的 sign
|
||||
↓
|
||||
使用硬编码 RSA-2048 公钥和 SHA256withRSA 验签
|
||||
├── 失败:返回 -2
|
||||
└── 成功:选择实际固件并进入协议传输
|
||||
```
|
||||
|
||||
当前算法先计算文件 SHA-256,再把摘要传给 `SHA256withRSA`,实际相当于:
|
||||
|
||||
```text
|
||||
RSA-Sign(SHA256(SHA256(payload)))
|
||||
```
|
||||
|
||||
制包工具必须使用相同的双重摘要方式。
|
||||
|
||||
### 3.5 固件选择
|
||||
|
||||
页面选择升级类型:
|
||||
|
||||
| MCU 版本 | 升级类型 |
|
||||
|---|---:|
|
||||
| `110px02m3`、`110rv01m3` | `0x01` |
|
||||
| `ae6501` | `0x0F` |
|
||||
| 其他版本 | `0x1F` |
|
||||
|
||||
通讯服务选择实际文件:
|
||||
|
||||
| MCU 版本 | 实际传输文件 |
|
||||
|---|---|
|
||||
| `110px02m3`、`110rv01m3` | `cortex-m3.bin` |
|
||||
| 其他情况 | `cortex-gdm4.bin` |
|
||||
|
||||
当前工作区已改为使用同一个目标文件名完成验签和传输:M3 设备验签并传输 `cortex-m3.bin`,其他设备验签并传输 `cortex-gdm4.bin`。页面按 `-` 分割版本字符串后判断,通讯服务直接比较原始版本字符串,这个差异仍需后续统一。
|
||||
|
||||
### 3.6 MCU 协议
|
||||
|
||||
| 消息号 | 名称 | 作用 |
|
||||
|---:|---|---|
|
||||
| `0xE1` | `MSG_REQUEST_UPDATE` | MCU 主动请求升级 |
|
||||
| `0xE2` | `MSG_SEND_UPDATE_REQUEST` | 主机发送固件总长度 |
|
||||
| `0xE3` | `MSG_REQUEST_UPDATE_DATA` | MCU 按偏移请求固件数据 |
|
||||
| `0xE4` | `MSG_RECV_UPDATE_RESULT` | MCU 返回最终结果 |
|
||||
|
||||
主时序:
|
||||
|
||||
```text
|
||||
Android 完成解压和验签
|
||||
↓
|
||||
E2:主机发送固件总长度
|
||||
↓
|
||||
MCU 返回状态和最大分包长度
|
||||
↓
|
||||
E3:MCU 发送 offset(4B) + length(2B)
|
||||
↓
|
||||
主机按偏移读取并返回固件数据
|
||||
↓
|
||||
重复 E3 直到传输完成
|
||||
↓
|
||||
MCU 校验并执行升级
|
||||
↓
|
||||
E4:MCU 返回最终结果
|
||||
↓
|
||||
主机回复 ACK
|
||||
↓
|
||||
通讯服务发送 ACTION_M0_UPDATE_FILE 广播
|
||||
↓
|
||||
升级页面显示结果
|
||||
```
|
||||
|
||||
收到 MCU 主动 E1 后,当前代码会再次删除临时目录、解压、验签并发送 E2,可能与已经开始的 Binder 升级会话冲突。
|
||||
|
||||
### 3.7 状态码
|
||||
|
||||
E2 阶段:
|
||||
|
||||
| 返回值 | 含义 |
|
||||
|---:|---|
|
||||
| `-2` | ZIP 不存在、验签失败或目标固件不可读 |
|
||||
| `-1` | 发送失败或等待响应超时 |
|
||||
| `0` | MCU 不支持升级 |
|
||||
| `1` | MCU 已准备好,开始传输 |
|
||||
| `2` | 固件长度超限 |
|
||||
|
||||
E4 最终结果:
|
||||
|
||||
| 返回值 | 含义 |
|
||||
|---:|---|
|
||||
| `1` | 升级成功 |
|
||||
| `2` | 固件校验和错误 |
|
||||
| `3` | 版本错误或固件非法 |
|
||||
| `4` | 文件或数据获取失败 |
|
||||
|
||||
E2 成功响应当前没有检查至少包含 3 字节,截断响应可能导致数组越界。
|
||||
|
||||
### 3.8 MCU 新旧兼容
|
||||
|
||||
历史裸固件路径:
|
||||
|
||||
```text
|
||||
<介质根目录>/m3/cortex-m3.bin
|
||||
<介质根目录>/m3/cortex-gdm4.bin
|
||||
```
|
||||
|
||||
当前工作区已恢复历史裸固件路径。
|
||||
|
||||
| 输入 | 当前行为 |
|
||||
|---|---|
|
||||
| 合法 `update_mcu.zip` | 解压、验签、传输 |
|
||||
| 非法 `update_mcu.zip` | 返回失败,不回退裸 bin |
|
||||
| ZIP 不存在,存在 `m3/cortex-m3.bin` | M3 设备使用旧版文件 |
|
||||
| ZIP 不存在,存在 `m3/cortex-gdm4.bin` | GDM4 设备使用旧版文件 |
|
||||
| ZIP 与裸 bin 同时存在 | 只处理 ZIP |
|
||||
|
||||
PX3 当前分支不包含 RK3568 的 `446193a73` 新旧包兼容提交。
|
||||
|
||||
---
|
||||
|
||||
## 4. 当前待完善点
|
||||
|
||||
### MPU
|
||||
|
||||
1. 将未跟踪的 `ZQ_TH7_RKUpdateService` 纳入正式源码和构建基线。
|
||||
2. 从业务扫描流程中移除 Rockchip 遗留 `update.zip` 分支。
|
||||
3. 明确恢复裸 `update.img` 时对 `persist.sys.update.show` 的处理方式。
|
||||
4. 验签失败后立即结束,不得回退裸 `update.img`。
|
||||
5. 使用安全解压和私有暂存目录,保证验签文件与安装文件一致。
|
||||
6. 补齐取消、异常、Recovery 结果和升级包清理流程。
|
||||
|
||||
### MCU
|
||||
|
||||
1. 统一页面和通讯服务的 MCU 版本解析。
|
||||
2. 增加升级会话互斥,避免 E1 重复初始化。
|
||||
3. 修复 ZIP 路径校验、共享目录替换和文件流关闭问题。
|
||||
4. 明确裸 bin 兼容允许使用的工程授权场景。
|
||||
|
||||
---
|
||||
|
||||
## 5. 关键代码
|
||||
|
||||
### MPU
|
||||
|
||||
| 文件 | 行号 | 说明 |
|
||||
|---|---:|---|
|
||||
| `ZQ_TH7_RKUpdateService/src/android/rockchip/update/service/RKUpdateReceiver.java` | 53 | 本地升级触发 |
|
||||
| `ZQ_TH7_RKUpdateService/src/android/rockchip/update/service/RKUpdateService.java` | 328 | MPU 本地升级主流程 |
|
||||
| 同上 | 498 | 文件扫描和优先级 |
|
||||
| `ZQ_TH7_RKUpdateService/src/android/rockchip/update/service/ZipFileVerifier.java` | 86 | MPU 解压和验签 |
|
||||
| `ZQ_TH7_RKUpdateService/src/android/rockchip/update/service/UpdateAndRebootActivity.java` | 159 | 选择 RK image 或 OTA 模式 |
|
||||
| `ZQ_TH7_RKUpdateService/src/android/rockchip/update/service/RecoverySystem.java` | 354 | 安装 `update.img` |
|
||||
|
||||
### MCU
|
||||
|
||||
| 文件 | 行号 | 说明 |
|
||||
|---|---:|---|
|
||||
| `YX_MainInterface_ZhongQi/src/main/java/com/yaxon/base/system/UpgradeMainActivity.java` | 111 | MCU 升级入口 |
|
||||
| `YX_MainInterface_ZhongQi/src/main/java/com/yaxon/base/system/ZhongQiM3UpdateActivity.java` | 321 | 发起 Binder 调用 |
|
||||
| `YX_CommunicatePro_ZhongQi/src/main/java/com/yaxon/telematics/service/ImplM0ManagerService.java` | 30 | AIDL 转发 |
|
||||
| `YX_CommunicatePro_ZhongQi/src/main/java/com/yaxon/telematics/service/protocol/monitor/m0/MonitorM0Update.java` | 75 | E1~E4 协议处理 |
|
||||
| 同上 | 203 | 查包、验签和 E2 请求 |
|
||||
| 同上 | 264 | 实际固件选择 |
|
||||
| `YX_CommunicatePro_ZhongQi/src/main/java/com/yaxon/utils/ZipFileVerifier.java` | 80 | MCU 解压和验签 |
|
||||
|
||||
## 6. 代码状态说明
|
||||
|
||||
- MPU 升级目录 `ZQ_TH7_RKUpdateService` 当前未纳入 Git。
|
||||
- 当前源码实际扫描三种文件;业务目标只保留 `update_mpu.zip` 和 `update.img`。
|
||||
- MCU 签名升级由 `aeb1d9c9e`、`897dc0607` 两笔提交引入。
|
||||
- 2026-08-19 当前工作区恢复 `m3/cortex-m3.bin`、`m3/cortex-gdm4.bin` 旧版兼容,并改为验签实际传输的 ZIP 内固件。
|
||||
- 本文只描述 MPU 和 MCU 本地升级,不包含其他升级类型。
|
||||
|
||||
|
||||
|
||||
不签名: 新版本 - >旧版本
|
||||
@@ -0,0 +1,331 @@
|
||||
# PX3 地图拷贝功能流程图
|
||||
|
||||
## 1. 文档说明
|
||||
|
||||
| 项目 | 内容 |
|
||||
|---|---|
|
||||
| 适用工程 | `YX_MainInterface_ZhongQi` |
|
||||
| 适用平台 | Android 4.4 PX3 车机 |
|
||||
| 新流程适用范围 | PX3 且 eMMC 判定为 32G 的设备 |
|
||||
| 旧设备兼容 | 非 32G 设备继续使用原 TF 卡地图流程 |
|
||||
| 文档依据 | 2026-09-09 当前代码实现 |
|
||||
|
||||
本文档只描述当前有效的 ZIP 地图方案。Map 分区正式文件直接位于 `/mnt/map` 根目录,不再使用旧路径 `/mnt/map/amapauto9/amapauto9.zip`。
|
||||
|
||||
## 2. 固定路径
|
||||
|
||||
| 用途 | 当前路径 |
|
||||
|---|---|
|
||||
| U 盘地图压缩包 | `/mnt/usb_storage/amapauto9.zip` |
|
||||
| Map 导入临时文件 | `/mnt/map/amapauto9.zip.part` |
|
||||
| Map 正式地图压缩包 | `/mnt/map/amapauto9.zip` |
|
||||
| 内部地图目录 | `/mnt/sdcard/amapauto9/data/navi/compile_v2/chn` |
|
||||
| 内部语音目录 | `/mnt/sdcard/amapauto9/data/voice` |
|
||||
| 解压中标记 | `/mnt/sdcard/amapauto9/.yaxon_map_copying` |
|
||||
| 解压完成标记 | `/mnt/sdcard/amapauto9/.yaxon_map_complete` |
|
||||
| 旧设备 TF 卡地图 | `/mnt/external_sd0/amapauto9` |
|
||||
|
||||
ZIP 内只处理以下两个目录:
|
||||
|
||||
```text
|
||||
amapauto9/data/navi/compile_v2/chn/...
|
||||
amapauto9/data/voice/...
|
||||
```
|
||||
|
||||
## 3. 总体流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["设备启动"] --> B["BSP 挂载 tfcard 分区到 /mnt/map"]
|
||||
B --> C["设置 /mnt/map 属主 system:system 和权限 0770"]
|
||||
C --> D{"/mnt/map 挂载成功且 system UID 可写?"}
|
||||
D -- "否" --> E["U盘导入和Map删除不可执行<br/>提示检查Map分区挂载权限"]
|
||||
D -- "是" --> F["主界面和工程菜单可使用地图功能"]
|
||||
|
||||
F --> G{"入口类型"}
|
||||
G -- "点击导航" --> H["执行导航入口流程"]
|
||||
G -- "进入工程模式" --> I["执行地图数据管理流程"]
|
||||
```
|
||||
|
||||
## 4. 导航入口流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A0["主界面加载功能图标"] --> A1{"车辆配置是否有记录仪?"}
|
||||
A1 -- "否" --> A2["MAIN_ICON3或MAIN_ICON4<br/>当前不显示导航图标"]
|
||||
A1 -- "是" --> A3["MAIN_ICON或MAIN_ICON2<br/>显示导航图标"]
|
||||
A3 --> A["用户点击主界面导航图标"]
|
||||
A --> B{"是否为 PX3 + 32G eMMC?"}
|
||||
|
||||
B -- "否" --> C{"/mnt/external_sd0/amapauto9 是否存在?"}
|
||||
C -- "是" --> D["启动高德导航"]
|
||||
C -- "否" --> E["提示插入含离线地图的 TF 卡"]
|
||||
|
||||
B -- "是" --> F{"当前是否有地图任务正在执行?"}
|
||||
F -- "是" --> G["进入地图初始化页<br/>恢复并显示后台任务状态"]
|
||||
F -- "否" --> H{"内部地图快速检查是否可用?"}
|
||||
H -- "是" --> D
|
||||
H -- "否" --> I["进入地图初始化页"]
|
||||
|
||||
I --> J{"/mnt/map/amapauto9.zip 是否存在且非空?"}
|
||||
J -- "否" --> K["提示地图数据不可用<br/>联系服务人员"]
|
||||
J -- "是" --> L["自动启动 Map 到 sdcard 解压任务"]
|
||||
L --> M["显示初始化提示、进度条和百分比"]
|
||||
M --> N{"任务结果"}
|
||||
N -- "成功" --> O["显示初始化完成<br/>本次不直接打开导航"]
|
||||
N -- "失败" --> P["显示失败原因<br/>允许重试或返回"]
|
||||
N -- "用户返回" --> Q["可选后台运行、停止任务或继续等待"]
|
||||
```
|
||||
|
||||
当前代码的 32G 判定流程:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["读取 /proc/partitions 中 mmcblk0 总块数"] --> B{"读取结果是否有效?"}
|
||||
B -- "是" --> C["块数乘1024,得到物理容量字节数"]
|
||||
B -- "否" --> D["读取 /sys/block/mmcblk0/size"]
|
||||
D --> E{"读取结果是否有效?"}
|
||||
E -- "是" --> F["扇区数乘512,得到物理容量字节数"]
|
||||
E -- "否" --> G["容量类型 UNKNOWN<br/>不进入32G内部地图流程"]
|
||||
C --> H{"容量是否在 24GiB 到 40GiB 之间?"}
|
||||
F --> H
|
||||
H -- "是" --> I["判定为 EMMC_32G"]
|
||||
H -- "否" --> J["继续判断8G范围或判定UNKNOWN"]
|
||||
I --> K{"Build.PRODUCT、DEVICE或MODEL 是否为 rkpx3?"}
|
||||
K -- "是" --> L["启用32G内部地图流程"]
|
||||
K -- "否" --> M["不启用内部地图流程"]
|
||||
```
|
||||
|
||||
物理容量首次读取成功后会缓存在进程内,后续判断不重复读取块设备节点。
|
||||
|
||||
内部地图快速检查条件:
|
||||
|
||||
1. 不存在 `.yaxon_map_copying` 未完成标记。
|
||||
2. `chn`、`voice` 目录存在。
|
||||
3. 核心文件 `chn/a0/m1.ans` 非空。
|
||||
4. `chn` 中存在区域目录,`voice` 中存在非空语音文件。
|
||||
5. Map 正式 ZIP 存在时,完成标记必须匹配 ZIP 的文件大小和修改时间。
|
||||
6. Map 正式 ZIP 不存在时,兼容旧设备已经存在的内部地图数据。
|
||||
|
||||
## 5. 工程模式入口流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["进入工程模式"] --> B{"是否为 PX3 + 32G eMMC?"}
|
||||
B -- "否" --> C["不显示 地图数据管理 入口"]
|
||||
B -- "是" --> D["显示 地图数据管理 入口"]
|
||||
D --> E["进入地图数据管理页"]
|
||||
E --> F["后台检测 eMMC、U盘、Map压缩包和内部地图状态"]
|
||||
F --> G{"选择操作"}
|
||||
|
||||
G --> H["从U盘导入到Map分区"]
|
||||
G --> I["删除Map分区地图"]
|
||||
G --> J["复制地图到sdcard目录"]
|
||||
G --> K["清除sdcard地图数据"]
|
||||
|
||||
H --> L["执行U盘导入流程"]
|
||||
I --> M["二次确认后删除正式ZIP和part文件"]
|
||||
J --> N["执行Map解压流程"]
|
||||
K --> O["二次确认后执行内部地图清理流程"]
|
||||
|
||||
L --> P["刷新页面状态"]
|
||||
M --> P
|
||||
N --> P
|
||||
O --> P
|
||||
```
|
||||
|
||||
工程页四项操作互相独立,不会自动串联。首次部署建议顺序为:
|
||||
|
||||
```text
|
||||
必要时删除Map分区旧地图
|
||||
-> 从U盘导入到Map分区
|
||||
-> 复制地图到sdcard目录
|
||||
```
|
||||
|
||||
## 6. 从 U 盘导入到 Map 分区
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["点击 从U盘导入到Map分区"] --> B{"设备是否为 PX3 + 32G?"}
|
||||
B -- "否" --> X1["提示仅支持32G设备"]
|
||||
B -- "是" --> C{"U盘是否已挂载?"}
|
||||
C -- "否" --> X2["提示先插入U盘"]
|
||||
C -- "是" --> D{"U盘根目录是否存在非空 amapauto9.zip?"}
|
||||
D -- "否" --> X3["提示未找到地图压缩包"]
|
||||
D -- "是" --> E{"Map正式ZIP或part是否已存在?"}
|
||||
E -- "是" --> X4["提示先删除Map分区旧数据"]
|
||||
E -- "否" --> F{"/mnt/map 是否为目录且可写?"}
|
||||
F -- "否" --> X5["提示Map分区不可写"]
|
||||
F -- "是" --> G["读取ZIP64中央目录"]
|
||||
|
||||
G --> H{"ZIP结构、白名单目录和核心文件是否合法?"}
|
||||
H -- "否" --> X6["提示地图压缩包无效"]
|
||||
H -- "是" --> I{"Map剩余空间 >= ZIP大小 + 32MiB?"}
|
||||
I -- "否" --> X7["提示Map分区存储空间不足"]
|
||||
I -- "是" --> J["流式复制到 /mnt/map/amapauto9.zip.part"]
|
||||
|
||||
J --> K["同步文件并校验源、目标大小"]
|
||||
K --> L["再次校验目标ZIP结构"]
|
||||
L --> M{"校验是否成功?"}
|
||||
M -- "否" --> N["删除part并返回失败"]
|
||||
M -- "是" --> O["同目录重命名为 /mnt/map/amapauto9.zip"]
|
||||
O --> P["显示导入成功"]
|
||||
|
||||
J -. "取消、拔出U盘或I/O异常" .-> N
|
||||
```
|
||||
|
||||
说明:`.part` 是正在复制的临时文件,校验成功后直接重命名为正式 ZIP,不会在 Map 分区长期保留两份完整压缩包。
|
||||
|
||||
## 7. Map 解压到 sdcard
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["导航页自动初始化<br/>或工程页点击复制地图到sdcard目录"] --> B["MapDataCopyService 接收任务"]
|
||||
B --> C{"是否已有地图任务运行?"}
|
||||
C -- "是" --> X1["拒绝重复启动并显示当前任务"]
|
||||
C -- "否" --> D["停止高德进程并等待文件释放"]
|
||||
D --> E{"高德是否已停止?"}
|
||||
E -- "否" --> X2["取消操作并提示失败"]
|
||||
E -- "是" --> F{"Map正式ZIP是否存在且非空?"}
|
||||
F -- "否" --> X3["提示Map地图源不存在"]
|
||||
F -- "是" --> G["读取ZIP64中央目录并生成白名单解压计划"]
|
||||
|
||||
G --> H{"压缩格式、路径和必需条目是否合法?"}
|
||||
H -- "否" --> X4["提示压缩包无效"]
|
||||
H -- "是" --> I["只处理 chn 和 voice 文件"]
|
||||
I --> J{"是否为未完成恢复或ZIP身份变化?"}
|
||||
J -- "是" --> K["受管文件全部重新解压"]
|
||||
J -- "否" --> L["目标文件大小相同则跳过<br/>缺失或大小不同则解压"]
|
||||
|
||||
K --> M["计算本次所需新增空间"]
|
||||
L --> M
|
||||
M --> N{"sdcard剩余空间 >= 新增空间 + 300MiB?"}
|
||||
N -- "否" --> X5["提示内部存储空间不足"]
|
||||
N -- "是" --> O["写入 .yaxon_map_copying 标记并同步"]
|
||||
|
||||
O --> P["按计划流式解压并实时校验条目大小和CRC"]
|
||||
P --> Q["每累计约512MiB执行批量sync"]
|
||||
Q --> R{"全部计划文件校验是否通过?"}
|
||||
R -- "否" --> X6["保留未完成状态<br/>返回失败或允许重试"]
|
||||
R -- "是" --> S["写入 .yaxon_map_complete 完成标记"]
|
||||
S --> T["删除 .yaxon_map_copying 并最终sync"]
|
||||
T --> U["任务进度置为100%并提示成功"]
|
||||
U --> V["后台重启高德进程<br/>使其重新初始化离线地图"]
|
||||
```
|
||||
|
||||
当前写入策略:
|
||||
|
||||
- 新增文件直接写正式目标,写入失败时删除不完整文件。
|
||||
- 覆盖已有文件时使用 `.yaxon_part` 临时文件,再重命名替换。
|
||||
- 解压过程边写边计算 CRC;完成前进度最高显示 `99.9%`,最终成功后显示 `100%`。
|
||||
- 当前差异计划以目标文件大小判断是否跳过;解压写入的文件会校验 ZIP 中记录的大小和 CRC。
|
||||
|
||||
## 8. 删除 Map 分区地图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["点击 删除Map分区地图"] --> B{"正式ZIP或part是否存在?"}
|
||||
B -- "否" --> C["提示Map分区无地图数据"]
|
||||
B -- "是" --> D["显示二次确认弹框"]
|
||||
D -- "取消" --> E["不做修改"]
|
||||
D -- "确认" --> F{"/mnt/map 是否可写?"}
|
||||
F -- "否" --> G["提示Map分区不可写"]
|
||||
F -- "是" --> H["删除 /mnt/map/amapauto9.zip"]
|
||||
H --> I["删除 /mnt/map/amapauto9.zip.part"]
|
||||
I --> J{"两个文件是否均已删除?"}
|
||||
J -- "是" --> K["提示删除成功"]
|
||||
J -- "否" --> L["提示删除失败"]
|
||||
```
|
||||
|
||||
该操作只删除地图正式 ZIP 和残留 `.part`,不会删除 `/mnt/map` 目录,也不会清理 Map 分区中的其他文件。
|
||||
|
||||
## 9. 清除 sdcard 地图数据
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["点击 清除sdcard地图数据"] --> B{"是否存在受管地图或语音数据?"}
|
||||
B -- "否" --> C["提示sdcard无地图数据"]
|
||||
B -- "是" --> D["显示慎重操作二次确认弹框"]
|
||||
D -- "取消" --> E["不做修改"]
|
||||
D -- "确认" --> F["停止高德进程并等待文件释放"]
|
||||
F --> G["写入未完成标记并同步"]
|
||||
G --> H["清空 chn 目录内容<br/>保留 chn 目录本身"]
|
||||
H --> I["清理 voice 中可重新导入的数据<br/>保留 voice 目录本身和指定配置"]
|
||||
I --> J["删除完成标记"]
|
||||
J --> K{"清理是否全部成功?"}
|
||||
K -- "否" --> L["保留未完成状态并提示失败"]
|
||||
K -- "是" --> M["删除未完成标记并最终sync"]
|
||||
M --> N["提示清理成功"]
|
||||
```
|
||||
|
||||
必须保留的语音内容:
|
||||
|
||||
```text
|
||||
/mnt/sdcard/amapauto9/data/voice/voice_conf
|
||||
/mnt/sdcard/amapauto9/data/voice/common.irf
|
||||
/mnt/sdcard/amapauto9/data/voice/isstts.cfg
|
||||
/mnt/sdcard/amapauto9/data/voice/xiaoyan.irf
|
||||
```
|
||||
|
||||
## 10. 后台任务和页面交互
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["Activity 发起地图操作"] --> B["绑定同进程 MapDataCopyService"]
|
||||
B --> C["Service 保证同一时刻只有一个地图任务"]
|
||||
C --> D["MapDataCopyManager 在工作线程执行文件操作"]
|
||||
D --> E["Service 保存操作类型、进度、字节数和结果快照"]
|
||||
E --> F{"用户操作"}
|
||||
|
||||
F -- "停留页面" --> G["页面持续刷新进度和提示"]
|
||||
F -- "按Home" --> H["Activity离开,Service继续后台执行"]
|
||||
F -- "再次进入" --> I["重新绑定Service并恢复当前快照"]
|
||||
F -- "按返回" --> J["弹框选择后台运行、停止任务或继续等待"]
|
||||
|
||||
D --> K{"任务完成时页面是否绑定?"}
|
||||
K -- "是" --> L["页面显示结果弹框并刷新状态"]
|
||||
K -- "否" --> M["Service 使用Toast提示后台结果"]
|
||||
```
|
||||
|
||||
页面进度回调按当前交互约定节流,最多约每 `500ms` 更新一次,减少主线程刷新开销。
|
||||
|
||||
## 11. 工程页状态显示
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A["Map分区状态"] --> A1["无数据<br/>正式ZIP和part均不存在"]
|
||||
A --> A2["数据不完整<br/>存在part或正式ZIP小于7GiB"]
|
||||
A --> A3["数据完整<br/>正式ZIP不小于7GiB且无part"]
|
||||
|
||||
B["内部地图状态"] --> B1["无数据<br/>chn和voice无受管数据"]
|
||||
B --> B2["数据不完整<br/>有未完成标记或受管数据小于10GiB"]
|
||||
B --> B3["数据完整<br/>无未完成标记且受管数据不小于10GiB"]
|
||||
```
|
||||
|
||||
以上三态用于工程页面快速展示,不替代实际导入、解压时的 ZIP 结构、空间、文件大小和 CRC 校验。
|
||||
|
||||
## 12. BSP 前置条件与验证边界
|
||||
|
||||
BSP 侧目标启动顺序:
|
||||
|
||||
```rc
|
||||
mount ext4 /dev/block/platform/emmc/by-name/tfcard /mnt/map wait noatime nodiratime nosuid nodev noexec noauto_da_alloc,discard
|
||||
chown system system /mnt/map
|
||||
chmod 0770 /mnt/map
|
||||
```
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["编译包含BSP修改的固件"] --> B["烧录boot或完整固件"]
|
||||
B --> C["重启设备"]
|
||||
C --> D["检查 /proc/mounts 中 /mnt/map 挂载来源和rw状态"]
|
||||
D --> E["检查 ls -ld /mnt/map 的属主和权限"]
|
||||
E --> F["使用系统应用执行U盘导入和删除"]
|
||||
F --> G["重启后再次复测,确认权限持续有效"]
|
||||
```
|
||||
|
||||
截至 2026-09-09,本次可访问的 BSP 文件
|
||||
`Z:\znzc\003_zhongqi\android4.4_rkpx3_zhongqi_pro\device\rockchip\rksdk\ZQ_PRO_32G\ZQ_PRO_32G_init.rc`
|
||||
仍保留两条 `/mnt/map` 挂载和 `start chmodmap`,尚未呈现上面的目标顺序。因此这里描述的是应用正常工作的前置要求,不表示该 BSP 修改已经进入源码或固件。
|
||||
|
||||
BSP 修改是否进入最终镜像、设备重启后 `/mnt/map` 是否仍可写,以及完整地图导入和解压结果,均必须以编译产物和真机日志为准。
|
||||
@@ -0,0 +1,117 @@
|
||||
# PX3 地图拷贝功能流程图(简化版)
|
||||
|
||||
## 一、关键路径
|
||||
|
||||
| 数据 | 路径 |
|
||||
|---|---|
|
||||
| U盘地图压缩包 | `/mnt/usb_storage/amapauto9.zip` |
|
||||
| Map分区地图压缩包 | `/mnt/map/amapauto9.zip` |
|
||||
| 内部地图 | `/mnt/sdcard/amapauto9/data/navi/compile_v2/chn` |
|
||||
| 内部语音 | `/mnt/sdcard/amapauto9/data/voice` |
|
||||
|
||||
适用规则:
|
||||
|
||||
- PX3 32G设备使用Map分区和内部存储流程。
|
||||
- 非32G设备保留原TF卡地图流程。
|
||||
- Map分区必须已正确挂载,并允许系统应用读写。
|
||||
|
||||
## 二、点击导航
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["点击导航"] --> B{"是否为PX3 32G设备?"}
|
||||
B -- "否" --> C{"TF卡是否有地图?"}
|
||||
C -- "是" --> D["启动高德导航"]
|
||||
C -- "否" --> E["提示插入含地图的TF卡"]
|
||||
|
||||
B -- "是" --> F{"sdcard地图是否可用?"}
|
||||
F -- "是" --> D
|
||||
F -- "否" --> G{"Map分区是否有amapauto9.zip?"}
|
||||
G -- "否" --> H["提示地图数据不可用"]
|
||||
G -- "是" --> I["进入地图初始化页面"]
|
||||
I --> J["自动解压地图并显示进度"]
|
||||
J --> K{"初始化结果"}
|
||||
K -- "成功" --> L["提示初始化完成"]
|
||||
K -- "失败" --> M["提示失败,可重新操作"]
|
||||
```
|
||||
|
||||
初始化成功后不直接进入导航,用户再次点击导航即可启动高德。
|
||||
|
||||
## 三、工程模式地图管理
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["进入工程模式"] --> B{"是否为PX3 32G设备?"}
|
||||
B -- "否" --> C["不显示地图数据管理"]
|
||||
B -- "是" --> D["显示地图数据管理"]
|
||||
D --> E{"选择操作"}
|
||||
|
||||
E --> F["从U盘导入到Map分区"]
|
||||
E --> G["删除Map分区地图"]
|
||||
E --> H["复制地图到sdcard目录"]
|
||||
E --> I["清除sdcard地图数据"]
|
||||
```
|
||||
|
||||
首次部署建议操作顺序:
|
||||
|
||||
```text
|
||||
如有旧数据,先删除Map分区地图
|
||||
-> 从U盘导入到Map分区
|
||||
-> 复制地图到sdcard目录
|
||||
```
|
||||
|
||||
## 四、从U盘导入到Map分区
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["U盘根目录放入amapauto9.zip"] --> B["点击从U盘导入到Map分区"]
|
||||
B --> C{"U盘和压缩包是否正常?"}
|
||||
C -- "否" --> D["提示插入U盘或检查压缩包"]
|
||||
C -- "是" --> E{"Map分区是否已有地图文件?"}
|
||||
E -- "是" --> F["提示先删除Map分区地图"]
|
||||
E -- "否" --> G{"Map分区是否可写且空间足够?"}
|
||||
G -- "否" --> H["提示权限或空间异常"]
|
||||
G -- "是" --> I["先复制为amapauto9.zip.part"]
|
||||
I --> J["复制完成后校验压缩包"]
|
||||
J --> K{"校验是否通过?"}
|
||||
K -- "否" --> L["删除临时文件并提示失败"]
|
||||
K -- "是" --> M["重命名为/mnt/map/amapauto9.zip"]
|
||||
M --> N["提示导入成功"]
|
||||
```
|
||||
|
||||
## 五、复制地图到sdcard目录
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["点击复制地图到sdcard目录<br/>或从导航进入初始化"] --> B{"Map压缩包是否有效?"}
|
||||
B -- "否" --> C["提示Map地图数据不可用"]
|
||||
B -- "是" --> D{"sdcard空间是否足够?"}
|
||||
D -- "否" --> E["提示内部存储空间不足"]
|
||||
D -- "是" --> F["解压地图和语音数据"]
|
||||
F --> G["显示初始化进度"]
|
||||
G --> H{"解压和校验是否成功?"}
|
||||
H -- "否" --> I["保留未完成状态,允许重试"]
|
||||
H -- "是" --> J["写入完成状态"]
|
||||
J --> K["后台重启高德进程"]
|
||||
K --> L["提示操作成功"]
|
||||
```
|
||||
|
||||
只解压地图 `chn` 和语音 `voice` 数据,不处理压缩包中的其他目录。
|
||||
|
||||
## 六、删除范围
|
||||
|
||||
| 操作 | 删除内容 | 保留内容 |
|
||||
|---|---|---|
|
||||
| 删除Map分区地图 | `/mnt/map/amapauto9.zip`及残留`.part` | `/mnt/map`目录和其他文件 |
|
||||
| 清除sdcard地图数据 | `chn`内地图数据和可重新导入的语音数据 | `chn`、`voice`目录本身及高德语音配置文件 |
|
||||
|
||||
清除sdcard数据时保留:
|
||||
|
||||
```text
|
||||
voice/voice_conf
|
||||
voice/common.irf
|
||||
voice/isstts.cfg
|
||||
voice/xiaoyan.irf
|
||||
```
|
||||
|
||||
地图任务执行期间按Home键可以后台继续;再次进入页面会恢复当前进度。同一时间只允许执行一个地图任务。
|
||||
@@ -0,0 +1,45 @@
|
||||
# PX3 地图拷贝操作手册
|
||||
|
||||
本手册供工厂人员给 **PX3 32G、无TF卡接口** 的设备导入地图使用。
|
||||
|
||||
## 一、准备U盘
|
||||
|
||||
1. 将U盘格式化为 **NTFS** 格式。
|
||||
2. 将地图压缩包放到U盘根目录。
|
||||
3. 地图压缩包不要解压,文件名必须为:
|
||||
|
||||
```text
|
||||
amapauto9.zip
|
||||
```
|
||||
|
||||
U盘中的文件应如下所示:
|
||||
|
||||
```text
|
||||
U盘根目录
|
||||
└── amapauto9.zip
|
||||
```
|
||||
|
||||
注意:不要修改文件名,也不要把 `amapauto9.zip` 放进其他文件夹。
|
||||
|
||||
## 二、导入地图
|
||||
|
||||
1. 将准备好的U盘插入设备,等待5至10秒。
|
||||
2. 依次进入:`设置` → `版本信息` → 点击 `硬件版本` → `工程模式` → `地图数据管理`。
|
||||
3. 确认页面上的 `U盘地图压缩包` 显示 `存在`。未显示时,点击 `重新检测`。
|
||||
4. 查看 `Map分区地图压缩包` 状态:
|
||||
- `无数据`:直接进行下一步。
|
||||
- `数据不完整`:点击 `删除Map分区地图`,删除成功后再进行下一步。
|
||||
- `数据完整`:不用重复导入,直接进行第7步。
|
||||
5. 点击 `从U盘导入到Map分区`。
|
||||
6. 等待导入完成,确认 `Map分区地图压缩包` 显示 `数据完整`。
|
||||
7. 点击 `复制地图到sdcard目录`。
|
||||
8. 等待处理完成,确认 `内部地图` 显示 `数据完整`。
|
||||
9. 返回主界面,点击 `导航`,确认离线地图能够正常显示。
|
||||
|
||||
## 三、操作注意事项
|
||||
|
||||
- 导入过程中不要拔出U盘。
|
||||
- 进度未完成前不要断电或重启设备。
|
||||
- 操作过程中不要重复点击按钮。
|
||||
- 提示失败时先重新操作一次;再次失败请记录设备编号并联系工程人员。
|
||||
- `Map分区地图压缩包` 和 `内部地图` 均显示 `数据完整`,且导航能正常显示离线地图,才算操作完成。
|
||||
@@ -0,0 +1,469 @@
|
||||
# PX3 地图资源拷贝业务流程
|
||||
|
||||
## 1. 文档定位
|
||||
|
||||
| 项目 | 内容 |
|
||||
| ---- | -------------------------- |
|
||||
| 项目 | 重汽 PX3 地图数据管理 |
|
||||
| 适用工程 | `YX_MainInterface_ZhongQi` |
|
||||
| 适用平台 | Android 4.4 PX3 车机 |
|
||||
| 当前阶段 | ZIP64 方案已编码,等待 PX3 真机联调 |
|
||||
| 更新日期 | 2026-08-12 |
|
||||
|
||||
本文档描述当前有效的 ZIP 压缩包方案。旧的“U盘展开目录复制到Map”“Map展开目录复制到sdcard”方案已废弃,不再作为开发和验收依据。
|
||||
|
||||
## 2. 背景和目标
|
||||
|
||||
PX3 存在两代地图存储方案:
|
||||
|
||||
| 设备类型 | 硬件能力 | 地图方案 |
|
||||
|---|---|---|
|
||||
| 新 PX3 32G 设备 | 不再预留外置 TF 卡接口 | Map 分区保存地图 ZIP,首次使用时解压到内部共享存储 |
|
||||
| 旧 PX3 设备 | 可以插入外置 TF 卡 | 保留原有 TF 卡导航流程 |
|
||||
|
||||
已确认所有无 TF 卡接口的新 PX3 设备均为 32G,当前代码以“PX3 + eMMC 32G”作为新流程开关。
|
||||
|
||||
本次改为 ZIP 的主要目标:
|
||||
|
||||
1. Map 分区只保存约 8.39GB 的压缩包,不再保存约 13.12GiB 的展开目录。
|
||||
2. 地图初始化时只解压高德需要的地图和语音资源。
|
||||
3. 不在 sdcard 创建完整临时地图副本。
|
||||
4. 保留后台执行、进度恢复、取消重试和差异补齐能力。
|
||||
5. 旧设备 TF 卡流程保持不变。
|
||||
|
||||
## 3. 固定路径和数据范围
|
||||
|
||||
### 3.1 路径表
|
||||
|
||||
| 用途 | 路径 |
|
||||
|---|---|
|
||||
| 旧设备 TF 卡地图 | `/mnt/external_sd0/amapauto9` |
|
||||
| U盘挂载点 | `/mnt/usb_storage` |
|
||||
| U盘地图压缩包 | `/mnt/usb_storage/amapauto9.zip` |
|
||||
| Map地图根目录 | `/mnt/map/amapauto9` |
|
||||
| Map地图压缩包 | `/mnt/map/amapauto9/amapauto9.zip` |
|
||||
| Map导入临时文件 | `/mnt/map/amapauto9/amapauto9.zip.part` |
|
||||
| 内部高德根目录 | `/mnt/sdcard/amapauto9` |
|
||||
| 内部地图目录 | `/mnt/sdcard/amapauto9/data/navi/compile_v2/chn` |
|
||||
| 内部语音目录 | `/mnt/sdcard/amapauto9/data/voice` |
|
||||
| 解压中标记 | `/mnt/sdcard/amapauto9/.yaxon_map_copying` |
|
||||
| 解压完成标记 | `/mnt/sdcard/amapauto9/.yaxon_map_complete` |
|
||||
|
||||
`/mnt/sdcard` 与 `/sdcard` 在当前设备上指向同一内部共享存储。本模块代码统一使用 `/mnt/sdcard`。
|
||||
|
||||
### 3.2 ZIP 内部结构
|
||||
|
||||
压缩包必须包含:
|
||||
|
||||
```text
|
||||
amapauto9/data/navi/compile_v2/chn/...
|
||||
amapauto9/data/voice/...
|
||||
```
|
||||
|
||||
只解压以下两个白名单前缀:
|
||||
|
||||
```text
|
||||
amapauto9/data/navi/compile_v2/chn/
|
||||
amapauto9/data/voice/
|
||||
```
|
||||
|
||||
解压时去掉首层 `amapauto9/`,最终写入:
|
||||
|
||||
```text
|
||||
/mnt/sdcard/amapauto9/data/navi/compile_v2/chn
|
||||
/mnt/sdcard/amapauto9/data/voice
|
||||
```
|
||||
|
||||
本期不解压:
|
||||
|
||||
- `amapauto9/detail_list`
|
||||
- `amapauto9/res/global.db`
|
||||
- ZIP 中除 `chn` 和 `voice` 外的其他内容
|
||||
|
||||
### 3.3 当前压缩包基线
|
||||
|
||||
| 项目 | 数值 |
|
||||
|---|---|
|
||||
| ZIP文件大小 | `8,387,521,520 bytes`,约 `7.81GiB` |
|
||||
| SHA-256 | `69B1448C2FB6BA981F14C7D4A0B5DCFF6F6A3130020DB1D52D47202D14BFF1CC` |
|
||||
| ZIP总条目 | 2245 |
|
||||
| 白名单文件 | 1866 |
|
||||
| 白名单解压后大小 | `14,088,198,086 bytes`,约 `13.12GiB` |
|
||||
| 最大单文件 | 约 121MB |
|
||||
|
||||
该文件中央目录使用 ZIP64,不能依赖 Android 4.4 自带 `java.util.zip.ZipFile`。代码使用 Apache Commons Compress 1.9 读取 ZIP64。
|
||||
|
||||
## 4. 新旧设备分流
|
||||
|
||||
```text
|
||||
用户点击导航
|
||||
-> 判断是否为 PX3 + eMMC 32G
|
||||
|
|
||||
+-- 否:保留历史TF卡流程
|
||||
| -> /mnt/external_sd0/amapauto9存在:启动高德
|
||||
| -> 不存在:提示插入含离线地图的TF卡
|
||||
|
|
||||
+-- 是:执行内部地图流程
|
||||
-> 内部地图检查通过:启动高德
|
||||
-> 检查不通过:进入地图初始化页面
|
||||
-> Map压缩包存在:自动解压到sdcard
|
||||
-> Map压缩包不存在:提示联系服务人员
|
||||
```
|
||||
|
||||
32G新设备不检查TF卡,也不在Map异常时回退TF流程。
|
||||
|
||||
## 5. 两个页面入口
|
||||
|
||||
### 5.1 普通导航入口
|
||||
|
||||
页面标题:`地图初始化`。
|
||||
|
||||
页面只显示:
|
||||
|
||||
- 当前初始化提示
|
||||
- 水平进度条
|
||||
- 一位小数进度值
|
||||
|
||||
进入页面后自动执行“Map ZIP 解压到 sdcard”,不显示U盘、删除和路径等工程操作。成功后只提示初始化完成,不自动启动导航;用户再次点击导航后进入高德。
|
||||
|
||||
### 5.2 工程模式入口
|
||||
|
||||
入口:工程菜单 -> `地图数据管理`。
|
||||
|
||||
三个独立操作:
|
||||
|
||||
1. `删除Map分区地图`
|
||||
2. `从U盘导入到Map分区`
|
||||
3. `复制地图到sdcard目录`
|
||||
|
||||
推荐恢复顺序:
|
||||
|
||||
```text
|
||||
删除Map分区地图
|
||||
-> 从U盘导入到Map分区
|
||||
-> 复制地图到sdcard目录
|
||||
```
|
||||
|
||||
三个操作不会自动串联。
|
||||
|
||||
## 6. 地图状态判断
|
||||
|
||||
### 6.1 U盘地图状态
|
||||
|
||||
同时满足以下条件时认为U盘地图存在:
|
||||
|
||||
1. `/mnt/usb_storage` 状态为 `MEDIA_MOUNTED`。
|
||||
2. `/mnt/usb_storage/amapauto9.zip` 是非空普通文件。
|
||||
|
||||
真正导入前还会读取 ZIP64 中央目录,确认地图、语音和核心文件存在。
|
||||
|
||||
### 6.2 Map源状态
|
||||
|
||||
`/mnt/map/amapauto9/amapauto9.zip` 是非空普通文件时,认为Map压缩包存在。
|
||||
|
||||
该快速状态只用于页面和入口判断。真正解压前仍会完整读取中央目录并执行白名单结构校验。
|
||||
|
||||
### 6.3 内部地图状态
|
||||
|
||||
快速检查顺序:
|
||||
|
||||
1. `.yaxon_map_copying` 存在时判定未完成。
|
||||
2. `chn/a0/m1.ans` 必须是非空文件。
|
||||
3. `chn` 至少有一个 `a+数字` 区域目录。
|
||||
4. `voice` 至少有一个非空文件。
|
||||
5. Map中存在ZIP时,`.yaxon_map_complete` 必须与当前ZIP的“文件大小 + 修改时间”一致。
|
||||
6. Map中没有ZIP时,允许兼容升级前已经存在的内部地图。
|
||||
|
||||
完成标记用于识别“内部地图是否由当前Map ZIP解压完成”,不替代解压过程中的逐文件校验。
|
||||
|
||||
## 7. 工程操作一:删除Map分区地图
|
||||
|
||||
删除范围:
|
||||
|
||||
```text
|
||||
清空 /mnt/map/amapauto9 内全部内容
|
||||
保留 /mnt/map/amapauto9 根目录
|
||||
```
|
||||
|
||||
流程:
|
||||
|
||||
```text
|
||||
检查32G设备
|
||||
-> 检查Map目录中是否有数据
|
||||
-> 显示确认弹框
|
||||
-> 检查根目录可写
|
||||
-> 清空目录内容
|
||||
-> 确认根目录存在且为空
|
||||
```
|
||||
|
||||
不会删除 `/mnt/sdcard/amapauto9`。删除没有回滚能力,权限失败时可能留下部分数据。
|
||||
|
||||
## 8. 工程操作二:从U盘导入到Map分区
|
||||
|
||||
### 8.1 固定路径
|
||||
|
||||
```text
|
||||
源:/mnt/usb_storage/amapauto9.zip
|
||||
临时:/mnt/map/amapauto9/amapauto9.zip.part
|
||||
正式:/mnt/map/amapauto9/amapauto9.zip
|
||||
```
|
||||
|
||||
### 8.2 U盘要求
|
||||
|
||||
ZIP单文件约8.39GB,FAT32不支持超过4GB的单文件。内部工程U盘统一使用NTFS,`amapauto9.zip`固定放在U盘根目录。
|
||||
|
||||
当前固件存在 `ntfs-3g` 和 `mkntfs`,但仍必须用真实U盘验证能够自动挂载到 `/mnt/usb_storage`。
|
||||
|
||||
### 8.3 前置条件
|
||||
|
||||
1. 设备为PX3+32G。
|
||||
2. U盘已挂载且根目录存在非空 `amapauto9.zip`。
|
||||
3. `/mnt/map/amapauto9` 已由系统预先创建并可写。
|
||||
4. Map目录中没有正式ZIP或旧展开地图数据。
|
||||
5. Map可用空间不少于ZIP大小加300MiB安全余量。
|
||||
6. ZIP中央目录能够读取,并包含 `chn`、`voice` 和 `chn/a0/m1.ans`。
|
||||
|
||||
当前真机Map分区约13.3G,旧地图仍占约8.0G时只剩5.3G,无法同时放入8.39GB ZIP,必须先执行删除操作。
|
||||
|
||||
### 8.4 执行流程
|
||||
|
||||
```text
|
||||
校验U盘ZIP64结构
|
||||
-> 清理上次残留的amapauto9.zip.part
|
||||
-> 检查Map空间
|
||||
-> 流式复制到amapauto9.zip.part
|
||||
-> fsync
|
||||
-> 校验源目标文件大小
|
||||
-> 再次校验目标ZIP64结构
|
||||
-> 同目录重命名为amapauto9.zip
|
||||
```
|
||||
|
||||
`.part`是当前正在复制的同一份数据,完成后直接重命名,不会同时占用两份8.39GB空间。
|
||||
|
||||
取消、U盘拔出或复制失败时清理`.part`。正式ZIP只有在完整校验成功后才生成。
|
||||
|
||||
## 9. 工程操作三及普通初始化:Map解压到sdcard
|
||||
|
||||
### 9.1 解压计划
|
||||
|
||||
使用ZIP64中央目录生成白名单文件计划:
|
||||
|
||||
- 目标不存在:解压。
|
||||
- 目标存在但大小不同:重新解压并覆盖。
|
||||
- 目标存在且大小相同:跳过。
|
||||
- 目标端白名单目录中的多余文件暂不删除。
|
||||
|
||||
计划同时统计:
|
||||
|
||||
- 地图、语音和核心文件是否齐全
|
||||
- 本次需要解压的文件数和字节数
|
||||
- 解压期间的峰值新增空间
|
||||
- 跳过文件数
|
||||
|
||||
### 9.2 路径安全
|
||||
|
||||
只接受两个固定白名单前缀。每个条目的规范化目标路径必须仍位于对应的 `chn` 或 `voice` 目录内,拒绝反斜杠、`../`和重复目标路径,防止ZIP路径穿越覆盖其他系统或高德文件。
|
||||
|
||||
### 9.3 空间检查
|
||||
|
||||
允许解压的条件:
|
||||
|
||||
```text
|
||||
sdcard可用空间 >= 解压过程峰值新增空间 + 300MiB
|
||||
```
|
||||
|
||||
覆盖文件时不会直接写正式文件。当前单个文件先写同目录临时文件,校验后再替换,因此空间计算包含当前临时文件的峰值占用。
|
||||
|
||||
### 9.4 单文件处理
|
||||
|
||||
```text
|
||||
从ZIP流式读取条目
|
||||
-> 写入同目录“文件名.yaxon_part”
|
||||
-> 更新真实解压字节进度
|
||||
-> fsync
|
||||
-> 校验解压后大小
|
||||
-> 校验CRC32
|
||||
-> 删除旧目标文件
|
||||
-> 重命名临时文件为正式文件
|
||||
```
|
||||
|
||||
最大临时文件约121MB,不创建完整13GB临时地图目录。
|
||||
|
||||
### 9.5 完整流程
|
||||
|
||||
```text
|
||||
打开Map中的amapauto9.zip
|
||||
-> 生成白名单差异计划
|
||||
-> 清理计划内残留.yaxon_part
|
||||
-> 检查空间 + 300MiB
|
||||
-> 创建或复用/sdcard/amapauto9
|
||||
-> 写入.yaxon_map_copying并fsync
|
||||
-> 逐个解压变化文件
|
||||
-> 校验全部白名单目标文件存在且大小一致
|
||||
-> 写入.yaxon_map_complete并fsync
|
||||
-> 删除.yaxon_map_copying
|
||||
-> 返回成功
|
||||
```
|
||||
|
||||
成功后Service仅在高德主进程已经运行时发送现有退出通知,让下次启动重新加载地图;高德未运行时不发送,不自动启动导航。
|
||||
|
||||
### 9.6 失败和恢复
|
||||
|
||||
- 不删除 `/mnt/sdcard/amapauto9` 根目录。
|
||||
- 不创建完整地图临时副本。
|
||||
- 已完成并校验的文件保留。
|
||||
- 当前失败文件的`.yaxon_part`会尽量清理。
|
||||
- `.yaxon_map_copying`在失败或中断后保留,导航判定未完成。
|
||||
- 下次进入重新读取ZIP目录并生成差异计划,大小一致文件跳过。
|
||||
- 全部成功后才更新完成标记和显示100%。
|
||||
|
||||
## 10. Service、进度和页面生命周期
|
||||
|
||||
- 三个地图操作统一由同进程 `MapDataCopyService` 持有。
|
||||
- 同一时间只允许一个地图任务。
|
||||
- Home后Activity解绑,Service继续执行。
|
||||
- 重新进入页面恢复任务类型、累计字节和进度,不重新启动任务。
|
||||
- 返回时可选择“后台运行”“停止任务”“继续等待”。
|
||||
- Service为 `START_NOT_STICKY`,Launcher进程被杀或断电时任务终止,依靠标记和差异计划恢复。
|
||||
- ZIP检查和计划生成阶段显示准备状态。
|
||||
- U盘导入进度按压缩包复制字节计算。
|
||||
- 内部初始化进度按本次实际解压字节计算。
|
||||
- 进度回调最多每500ms一次,页面显示一位小数。
|
||||
- 完整校验成功前最高显示99.9%,最终成功才显示100%。
|
||||
|
||||
## 11. 结果码和提示
|
||||
|
||||
| 结果码 | 典型原因 | 页面处理 |
|
||||
|---|---|---|
|
||||
| `SUCCESS` | 导入、解压及校验成功 | 显示成功提示 |
|
||||
| `SOURCE_NOT_FOUND` | U盘ZIP或Map ZIP不存在 | 提示源数据不可用 |
|
||||
| `TARGET_ALREADY_EXISTS` | Map目录已有正式数据 | 提示先删除Map数据 |
|
||||
| `TARGET_PARENT_NOT_FOUND` | sdcard父目录不存在 | 提示目标准备失败 |
|
||||
| `STORAGE_NOT_WRITABLE` | 目标不可写 | 提示检查存储或权限 |
|
||||
| `NO_ENOUGH_SPACE` | 可用空间不足 | 提示空间不足 |
|
||||
| `CREATE_TARGET_FAILED` | 目标目录无法创建 | 提示目标准备失败 |
|
||||
| `INVALID_ARCHIVE` | ZIP64打不开、结构错误或缺少必要条目 | 提示压缩包无效或不完整 |
|
||||
| `COPY_FAILED` | ZIP复制或解压读写异常 | 提示重新操作 |
|
||||
| `VERIFY_FAILED` | 文件大小、CRC或完成标记异常 | 提示校验失败 |
|
||||
| `DELETE_FAILED` | Map内容没有完全删除 | 提示删除失败 |
|
||||
| `CANCELLED` | 用户停止任务 | 不显示失败弹框 |
|
||||
|
||||
普通导航入口仍将“Map ZIP缺失或不可访问”统一提示为:
|
||||
|
||||
```text
|
||||
地图数据不可用,请联系服务人员
|
||||
```
|
||||
|
||||
## 12. 权限前提
|
||||
|
||||
应用是平台签名system UID,但仍受Linux文件权限约束。最低要求:
|
||||
|
||||
1. `/mnt/map` 对system UID可读、可执行。
|
||||
2. `/mnt/map/amapauto9` 对system UID可读、可写、可执行。
|
||||
3. 权限在每次开机挂载完成后稳定生效。
|
||||
4. `/mnt/sdcard/amapauto9`及其目标子目录可写。
|
||||
|
||||
历史真机曾出现重启后 `/mnt/map` 模式为`000`。该问题会导致ZIP被误判为不存在,仍是量产前P0验证项。临时验证命令:
|
||||
|
||||
```bash
|
||||
adb shell chmod 0755 /mnt/map
|
||||
```
|
||||
|
||||
永久方案应由底层在Map分区挂载完成后设置正确权限。
|
||||
|
||||
## 13. 已验证结论
|
||||
|
||||
### 13.1 已通过
|
||||
|
||||
- eMMC容量判断可将真机识别为32G。
|
||||
- 新旧设备导航分流代码已保留。
|
||||
- PC端真实ZIP64中央目录读取成功:2245个条目。
|
||||
- 白名单识别成功:1866个文件,解压后`14,088,198,086 bytes`。
|
||||
- ZIP中地图、语音和核心文件路径均存在。
|
||||
- JDK 8执行Java编译成功。
|
||||
- JDK 8执行Debug APK完整构建成功,新增库已通过重复类检查、DEX和打包。
|
||||
|
||||
### 13.2 尚未验证
|
||||
|
||||
- NTFS U盘能否在当前PX3固件自动挂载。
|
||||
- PX3 Android 4.4运行时能否使用Commons Compress完整读取该ZIP64。
|
||||
- 1866个文件的真机完整解压、CRC和耗时。
|
||||
- U盘中途拔出、取消、杀进程和断电恢复。
|
||||
- 解压时高德已经运行是否稳定。
|
||||
- 重启后Map权限是否持续正确。
|
||||
- 实际空间只剩边界余量时的处理。
|
||||
|
||||
## 14. 真机验收步骤
|
||||
|
||||
### 14.1 U盘和Map导入
|
||||
|
||||
1. 将U盘格式化为NTFS。
|
||||
2. 将`amapauto9.zip`放在U盘根目录。
|
||||
3. 插入PX3,确认`/mnt/usb_storage`状态为mounted。
|
||||
4. 确认ZIP文件大小为`8,387,521,520`。
|
||||
5. 先删除Map中的旧展开数据,确认Map剩余空间足够。
|
||||
6. 执行“从U盘导入到Map分区”。
|
||||
7. 确认正式ZIP生成且`.part`不存在。
|
||||
8. 拔U盘、取消任务各验证一次,确认不会生成残缺正式ZIP。
|
||||
|
||||
建议检查命令:
|
||||
|
||||
```bash
|
||||
adb shell "cat /proc/mounts | grep usb_storage"
|
||||
adb shell "ls -l /mnt/usb_storage/amapauto9.zip"
|
||||
adb shell "ls -l /mnt/map/amapauto9"
|
||||
adb shell df
|
||||
```
|
||||
|
||||
### 14.2 Map解压到sdcard
|
||||
|
||||
1. 清理内部`chn`和`voice`测试数据,不删除高德根目录其他数据。
|
||||
2. 从导航入口进入,确认自动开始初始化。
|
||||
3. 检查进度连续刷新且Home后任务继续。
|
||||
4. 中途停止后重新进入,确认已完成文件被跳过。
|
||||
5. 完成后确认`.yaxon_map_copying`消失、`.yaxon_map_complete`存在。
|
||||
6. 抽查文件数量、大小和语音文件。
|
||||
7. 再次点击导航,确认高德能加载离线地图和语音。
|
||||
8. 分别验证高德未运行和已运行两种情况。
|
||||
|
||||
### 14.3 旧设备兼容
|
||||
|
||||
1. 带TF卡旧设备仍检查`/mnt/external_sd0/amapauto9`。
|
||||
2. 有目录时启动高德。
|
||||
3. 无目录时仍提示插入离线地图TF卡。
|
||||
4. 不进入32G地图初始化页面。
|
||||
|
||||
## 15. 代码位置
|
||||
|
||||
以下路径均位于 `YX_MainInterface_ZhongQi/src/main/`:
|
||||
|
||||
| 职责 | 文件 |
|
||||
|---|---|
|
||||
| eMMC容量识别 | `java/com/yaxon/base/system/mapdata/EmmcSizeDetector.java` |
|
||||
| PX3+32G策略 | `java/com/yaxon/base/system/mapdata/MapDataDevicePolicy.java` |
|
||||
| ZIP校验、导入、白名单解压和删除 | `java/com/yaxon/base/system/mapdata/MapDataCopyManager.java` |
|
||||
| 后台任务和高德重载 | `java/com/yaxon/base/system/mapdata/MapDataCopyService.java` |
|
||||
| 页面状态和交互 | `java/com/yaxon/base/system/mapdata/MapDataCopyActivity.java` |
|
||||
| 新旧导航分流 | `java/com/yaxon/until/ProgramLoader.java` |
|
||||
| 页面文案 | `res/values/strings.xml` |
|
||||
| ZIP64依赖 | `libs/commons-compress-1.9.jar` |
|
||||
|
||||
## 16. 当前优先级
|
||||
|
||||
| 优先级 | 工作项 | 完成标准 |
|
||||
|---|---|---|
|
||||
| P0 | PX3真机ZIP64只读验证 | 能打开ZIP、遍历2245个条目并读取末尾条目 |
|
||||
| P0 | 修复/确认Map重启权限 | 连续重启后system UID均可读取和写入Map目录 |
|
||||
| P1 | NTFS U盘挂载与8.39GB导入 | 自动挂载、完整复制、校验、重命名成功 |
|
||||
| P1 | 13.12GiB完整解压 | 1866个文件完成大小和CRC校验,高德可加载 |
|
||||
| P1 | 取消、拔盘、断电恢复 | 不产生残缺正式ZIP,可继续补齐内部地图 |
|
||||
| P1 | 高德运行态验证 | 解压过程不损坏地图,完成后能重新加载 |
|
||||
| P2 | 恢复工程模式10次点击门槛 | 功能验收完成后恢复正式入口限制 |
|
||||
|
||||
## 17. 本次更新记录
|
||||
|
||||
- 2026-08-12:按用户确认直接修改、不新增备份。
|
||||
- 将U盘展开目录导入改为根目录单个`amapauto9.zip`导入。
|
||||
- 将Map展开目录差异复制改为ZIP64白名单差异解压。
|
||||
- 增加ZIP路径安全、单文件临时写入、大小和CRC校验、解压完成标记。
|
||||
- 增加NTFS U盘约束、真实压缩包基线和真机验收矩阵。
|
||||
@@ -0,0 +1,41 @@
|
||||
# PX3 现有升级流程
|
||||
|
||||
## MPU
|
||||
|
||||
```text
|
||||
扫描 MPU 升级文件
|
||||
↓
|
||||
是否存在 update_mpu.zip?
|
||||
├── 是:解压并验签内部 update.img
|
||||
│ ├── 验签失败:终止升级
|
||||
│ └── 验签成功:Recovery 升级
|
||||
│
|
||||
└── 否:检查裸 update.img
|
||||
├── 不存在:结束
|
||||
└── 存在:Recovery 升级
|
||||
```
|
||||
|
||||
## MCU
|
||||
|
||||
```text
|
||||
扫描 MCU 升级文件
|
||||
↓
|
||||
是否存在 update_mcu.zip?
|
||||
├── 是:根据 MCU 版本选择 bin
|
||||
│ ↓
|
||||
│ 解压并验签目标 bin
|
||||
│ ├── 验签失败:终止升级
|
||||
│ └── 验签成功:进入 MCU 协议升级
|
||||
│
|
||||
└── 否:检查 m3/ 目录中的旧版裸 bin
|
||||
├── 不存在:结束
|
||||
└── 存在:进入 MCU 协议升级
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- 签名 ZIP 优先于旧版裸文件。
|
||||
- 签名校验失败时,不允许回退旧版裸文件。
|
||||
- 验签用于确认文件来源可信且内容未被修改。
|
||||
- MPU 本地不处理 `update.zip`。
|
||||
- `110px02m3`、`110rv01m3` 使用 `cortex-m3.bin`,其他版本使用 `cortex-gdm4.bin`。
|
||||
@@ -0,0 +1,101 @@
|
||||
# 重汽 MPU/MCU 签名升级兼容验证报告
|
||||
|
||||
## 1. 验证结论
|
||||
|
||||
本轮验证覆盖了 MPU 与 MCU 在签名包、不签名包、升级、降级、组合升级、单独升级等场景下的兼容性。
|
||||
|
||||
结论:
|
||||
|
||||
- MPU/系统 027 与 035 之间使用不签名 MPU/MCU 包可正常升级和降级。
|
||||
- 具备签名能力的 027/035 版本可正常识别并安装带签名 MPU/MCU 包。
|
||||
- 具备签名能力的版本仍兼容不签名 MPU/MCU 包。
|
||||
- MPU 与 MCU 组合升级场景验证通过。
|
||||
- MCU 单独升级场景中,不签名包与带签名包均验证通过。
|
||||
- MPU 单独升级场景中,不签名包与带签名包均验证通过。
|
||||
|
||||
## 2. 验证环境
|
||||
|
||||
| 项目 | 内容 |
|
||||
|---|---|
|
||||
| 项目 | 重汽升级兼容验证 |
|
||||
| 涉及对象 | MPU / MCU |
|
||||
| MPU/系统版本 | 旧版本 027 / 新版本 035 |
|
||||
| MCU 版本 | 旧版本 005 / 新版本 006 |
|
||||
| 包格式 | 不签名旧格式 / 带签名新格式 |
|
||||
| 升级介质 | U 盘 |
|
||||
| 验证日期 | 2026-06-12 |
|
||||
|
||||
## 3. 版本对应关系
|
||||
|
||||
| 对象 | 旧版本 | 新版本 |
|
||||
|---|---|---|
|
||||
| MPU/系统 | 027 | 035 |
|
||||
| MCU | 005 | 006 |
|
||||
|
||||
升级/降级组合说明:
|
||||
|
||||
- 旧版本组合:MPU 027 + MCU 005
|
||||
- 新版本组合:MPU 035 + MCU 006
|
||||
|
||||
## 4. 包格式说明
|
||||
|
||||
| 升级对象 | 不签名旧格式 | 带签名新格式 |
|
||||
|---|---|---|
|
||||
| MPU | U 盘根目录放 `update.zip`,直接 OTA 包 | U 盘根目录放 `update.zip`,外层签名包,内部包含真实 `update.zip` 与 `ValidationFile.ini` |
|
||||
| MCU | U 盘根目录放 `cortex-gdm4.bin` | U 盘根目录放 `update_mcu.zip`,内部包含 `cortex-gdm4.bin` 与 `ValidationFile.ini` |
|
||||
|
||||
## 5. 验证记录
|
||||
|
||||
| 编号 | 当前版本 | 目标版本 | 当前版本能力 | MPU 包 | MCU 包 | 验证结果 |
|
||||
|---:|---|---|---|---|---|---|
|
||||
| 1 | MPU 027 / MCU 005 | MPU 035 / MCU 006 | 不要求 | 不签名 | 不签名 | 通过 |
|
||||
| 2 | MPU 035 / MCU 006 | MPU 027 / MCU 005 | 不要求 | 不签名 | 不签名 | 通过 |
|
||||
| 3 | MPU 035 / MCU 006 | MPU 027 / MCU 005 | 带签名能力 | 带签名 | 带签名 | 通过 |
|
||||
| 4 | MPU 027 / MCU 005 | MPU 035 / MCU 006 | 带签名能力 | 带签名 | 带签名 | 通过 |
|
||||
| 5 | MPU 035 / MCU 006 | MPU 027 / MCU 005 | 带签名能力 | 不签名 | 不签名 | 通过 |
|
||||
| 6 | MPU 027 / MCU 005 | MPU 035 / MCU 006 | 带签名能力 | 不签名 | 不签名 | 通过 |
|
||||
| 7 | MPU 035 / MCU 006 | MPU 027 / MCU 005 | 带签名能力 | 带签名 | 不签名 | 通过 |
|
||||
| 8 | MPU 027 / MCU 005 | MPU 035 / MCU 006 | 带签名能力 | 不签名 | 带签名 | 通过 |
|
||||
| 9 | MPU 035 / MCU 006 | - | 带签名能力 | 不放 | 不签名 | 通过 |
|
||||
| 10 | MPU 035 / MCU 006 | - | 带签名能力 | 不放 | 带签名 | 通过 |
|
||||
| 11 | MPU 035 / MCU 006 | MPU 027 | 带签名能力 | 不签名 | 不放 | 通过 |
|
||||
| 12 | MPU 027 / MCU 005 | MPU 035 | 带签名能力 | 带签名 | 不放 | 通过 |
|
||||
|
||||
## 6. 关键场景覆盖情况
|
||||
|
||||
| 场景 | 覆盖情况 | 对应编号 |
|
||||
|---|---|---|
|
||||
| 不签名包升级 | 已覆盖 | 1、6 |
|
||||
| 不签名包降级 | 已覆盖 | 2、5 |
|
||||
| 带签名包升级 | 已覆盖 | 4、8、12 |
|
||||
| 带签名包降级 | 已覆盖 | 3、7 |
|
||||
| MPU + MCU 同时升级 | 已覆盖 | 1-8 |
|
||||
| 单独 MCU 不签名升级 | 已覆盖 | 9 |
|
||||
| 单独 MCU 带签名升级 | 已覆盖 | 10 |
|
||||
| 单独 MPU 不签名升级 | 已覆盖 | 11 |
|
||||
| 单独 MPU 带签名升级 | 已覆盖 | 12 |
|
||||
| 带签名能力版本兼容旧格式 | 已覆盖 | 5、6、9、11 |
|
||||
| 带签名能力版本支持新格式 | 已覆盖 | 3、4、7、8、10、12 |
|
||||
|
||||
## 7. 耗时记录
|
||||
|
||||
| 项目 | 结果 |
|
||||
| --------- | -------------------- |
|
||||
| 验签 + 解压耗时 | 约 55 秒 |
|
||||
| 影响说明 | 确认升级后,进入正式安装前存在较长等待 |
|
||||
| 当前判断 | 功能可用,建议关注界面提示和用户等待体验 |
|
||||
|
||||
## 8. 残留风险与建议
|
||||
|
||||
1. 验签与解压耗时约 55 秒,建议确认等待期间界面有明确提示,避免用户误判为卡死。
|
||||
2. 当前验证均为正常包场景,未覆盖签名错误、缺少 `ValidationFile.ini`、缺少内部升级文件等异常包场景。
|
||||
3. 如果进入正式交付,建议后续补充异常包验证,确认失败路径不会误安装或异常重启。
|
||||
4. 如果 U 盘同时放置 `update_mcu.zip` 与 `cortex-gdm4.bin`,建议补充一次优先级验证,确认系统优先使用 `update_mcu.zip`。
|
||||
|
||||
## 9. 最终结论
|
||||
|
||||
本轮 12 项升级验证均通过。当前 027/035 在具备签名能力后,可以支持 MPU/MCU 带签名升级包,同时保持对不签名旧格式升级包的兼容能力,升级与降级路径均验证通过。
|
||||
|
||||
版本对应关系为:旧版本组合 MPU 027 + MCU 005,新版本组合 MPU 035 + MCU 006。
|
||||
|
||||
20260612
|
||||
@@ -0,0 +1,189 @@
|
||||
|
||||
## 1. 系统升级流程
|
||||
|
||||
当 U 盘中存在 `update.zip` 时,执行以下流程:
|
||||
|
||||
```text
|
||||
update.zip
|
||||
↓
|
||||
读取压缩包内容(不解压)
|
||||
↓
|
||||
判断根目录是否存在 ValidationFile.ini
|
||||
├── 存在
|
||||
│ ↓
|
||||
│ 按新版签名包处理
|
||||
│ ↓
|
||||
│ 解压
|
||||
│ ↓
|
||||
│ 校验内层 update.zip 与 ValidationFile.ini
|
||||
│ ↓
|
||||
│ 校验通过后升级内层 update.zip
|
||||
│
|
||||
└── 不存在
|
||||
↓
|
||||
按旧版标准 升级包处理
|
||||
↓
|
||||
直接解析并升级原始 update.zip
|
||||
```
|
||||
|
||||
### 说明
|
||||
|
||||
- `update.zip` 为系统升级包;
|
||||
|
||||
- 使用 Java `ZipFile` 接口读取压缩包内容,不进行解压;
|
||||
|
||||
- 判断压缩包内部是否包含 `ValidationFile.ini`;
|
||||
|
||||
- 若存在 `ValidationFile.ini`:
|
||||
|
||||
- 认为该文件是新版签名升级包;
|
||||
|
||||
- 解压升级包;
|
||||
|
||||
- 对解压后的内层 `update.zip` 和 `ValidationFile.ini` 执行签名/完整性校验;
|
||||
|
||||
- 校验通过后开始升级内层 `update.zip`;
|
||||
|
||||
- 校验失败时升级失败,不得回退到旧版直接升级流程;
|
||||
|
||||
- 若不存在 `ValidationFile.ini`:
|
||||
|
||||
- 认为该文件是旧版标准 升级包;
|
||||
|
||||
- 不解压、不执行新增签名校验;
|
||||
|
||||
- 直接解析原始 `update.zip` 并执行系统升级基础校验;
|
||||
|
||||
- 基础校验通过后开始升级。
|
||||
|
||||
### 系统升级包结构
|
||||
|
||||
旧版标准 升级包:
|
||||
|
||||
```text
|
||||
U盘/update.zip
|
||||
├── payload.bin
|
||||
├── payload_properties.txt
|
||||
└── META-INF/com/android/metadata
|
||||
```
|
||||
|
||||
新版签名升级包:
|
||||
|
||||
```text
|
||||
U盘/update.zip
|
||||
├── update.zip
|
||||
└── ValidationFile.ini
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 2. MCU 升级流程
|
||||
|
||||
### 2.1 update_mcu.zip 升级
|
||||
|
||||
当 U 盘中存在 `update_mcu.zip` 时,执行以下流程:
|
||||
|
||||
```text
|
||||
update_mcu.zip
|
||||
↓
|
||||
解压
|
||||
↓
|
||||
校验
|
||||
↓
|
||||
升级
|
||||
```
|
||||
|
||||
### 说明
|
||||
|
||||
- `update_mcu.zip` 为 MCU 压缩升级包;
|
||||
|
||||
- 解压后执行校验;
|
||||
|
||||
- 校验通过后开始 MCU 升级。
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 2.2 cortex-gdm4.bin 升级
|
||||
|
||||
当 U 盘中存在 `cortex-gdm4.bin` 时,执行以下流程:
|
||||
|
||||
```text
|
||||
cortex-gdm4.bin
|
||||
↓
|
||||
直接升级
|
||||
```
|
||||
|
||||
### 说明
|
||||
|
||||
- `cortex-gdm4.bin` 为 MCU 二进制升级文件;
|
||||
|
||||
- 不进行解压及校验;
|
||||
|
||||
- 直接执行 MCU 升级。
|
||||
|
||||
### 2.3 MCU 文件优先级
|
||||
|
||||
当同一个 U 盘中同时存在 `update_mcu.zip` 和 `cortex-gdm4.bin` 时:
|
||||
|
||||
```text
|
||||
优先使用 update_mcu.zip
|
||||
```
|
||||
|
||||
### 说明
|
||||
|
||||
- `update_mcu.zip` 带签名/完整性校验,安全性更高;
|
||||
|
||||
- `cortex-gdm4.bin` 仅用于兼容旧版 MCU 升级方式;
|
||||
|
||||
- 若两者同时存在,默认按新版 `update_mcu.zip` 流程处理。
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 3. MCU 文件识别规则
|
||||
|
||||
|文件名称|处理方式|
|
||||
|---|---|
|
||||
|update_mcu.zip|解压 → 校验 → 升级|
|
||||
|cortex-gdm4.bin|直接升级|
|
||||
|其它文件|不处理|
|
||||
|
||||
---
|
||||
|
||||
## 4. 整体流程汇总
|
||||
|
||||
```text
|
||||
系统升级:
|
||||
|
||||
update.zip
|
||||
↓
|
||||
读取 ZIP 内容(不解压)
|
||||
↓
|
||||
根目录是否存在 ValidationFile.ini?
|
||||
├── 是 → 新版签名包 → 解压 → 校验内层 update.zip → 升级内层 update.zip
|
||||
└── 否 → 旧版标准 升级 包 → 直接解析并升级原始 update.zip
|
||||
|
||||
|
||||
MCU升级:
|
||||
|
||||
① update_mcu.zip
|
||||
↓
|
||||
解压
|
||||
↓
|
||||
校验
|
||||
↓
|
||||
升级
|
||||
|
||||
② cortex-gdm4.bin
|
||||
↓
|
||||
直接升级
|
||||
|
||||
说明:
|
||||
|
||||
- 系统升级中,只要检测到 `ValidationFile.ini`,就必须完成签名校验;
|
||||
- 签名校验失败时,不允许回退为旧版直接升级;
|
||||
- MCU 升级中,`update_mcu.zip` 优先级高于 `cortex-gdm4.bin`;
|
||||
- `cortex-gdm4.bin` 仅作为旧版 MCU 升级兼容路径保留。
|
||||
```
|
||||
Reference in new issue
Block a user