fix(nyai): 导出 exec 绝对路径相对化 + gzip stderr 重定向 (agent-签名产签链路)

- cmd_export 原先对 app.json 的 exec(绝对路径,如 /usr/data/mnt/sd_0/MeowAPPs/<pkg>/<bin>)
  误用 sanitize_member 剥前导 '/' 拼到包目录下,导致 access(<src>/usr/data/...) 必然失败,
  所有真实 app 导出被拒(exec 文件不存在或不可执行),卡死「导出→产签」链路。
  新增 exec_rel_to_pkg(): 按 ①src/ 前缀 ②/MeowAPPs/<pkg>/ 段(根路径不一致的沙箱/CI)
  ③相对路径 ④绝对但定位不到包目录→拒, 正确相对化 exec。
- install/upgrade 解包命令把 2>/dev/null 只绑到 tar,gzip stderr(footer trailing garbage /
  损坏 crc error)会漏到用户输出;改 gzip 也重定向。
- 同链验证: 宿主 meow_sign/meow_verify_host/qemu-mipsel 验签矩阵通过; 真机(10.78.193.50)
  无签 os.meow.*拒装/已签安装OK+.mpk.src/篡改拒装/降级拒装 全过; 装后已卸并恢复原状。
  (devdocs 本地不入库; 产签实走记录+README 见 patch_v2/meow_sign/README.md §8)
This commit is contained in:
MeowOS committed 2026-08-31 19:30:32 +08:00
1 parent 92086129c5
commit 5fac5e380d
4 files changed
+47 -4

No files matched your search

+13
View File
@@ -130,3 +130,16 @@ static const uint8_t g_meow_pub[MEOW_PUB_KEY_COUNT][32] = {
| `../meow_verify/meow_signing_pub.h` | **固件内嵌公钥数组**(仅公钥,可入库) |
| `../meow_verify/meow_sig.h` | 签名块格式 + 被签消息构造(verifier/signer 共用) |
| `.keys/` | 私钥目录(**已 gitignore,绝不入库**) |
## 8. 端到端实走(真机已验证,2026-08-31)
> 完整「产签→验签→真机安装→导出保留签名」的可复现步骤、逐命令预期输出、6 个失败矩阵项、常见错误速查与本次修复,见
> `devdocs/plan/MPK_SIGNATURE_DESIGN.md` 的「产签实走记录 / 操作步骤(端到端)」节。此处只记三个**最容易踩的坑**:
1. **`.mpk` 文件内文件须在 tar 根**:`app.json`/`meow`/资源须并列于 tar 根(**无** `<pkg>/` 顶层包裹目录)。
打包用 `tar -C <pkg> .`(导出生成本就是 `tar -C src .`),否则设备安装报 `解压/校验 app.json 失败`。
2. **包名 = 文件名茎**:`meow_sign sign` 从 `<pkg>.mpk` 文件名茎推导包名并写入 footer;`<pkg>.mpk` 必须 == `app.json.package`。
改文件名/包名 → 验签 `package mismatch`。
3. **`exec` 可为绝对路径,导出须相对化**:真实 app 的 `app.json.exec` 是绝对路径(`launcher` 直接 `execve`)。
`nyai export` 须把 `exec` 相对化到包目录(已修 `nyai.c` 的 `exec_rel_to_pkg`)再存在性检查/白名单打包;
否则所有真实 app 导出报「exec 文件 … 不存在或不可执行」。