P1-1(会静默开错图):取消「书库从列表推导图片下标」。 - 新增 mr_reader_open_dir_at_name(dir, name):阅读器打开目录册后,在**自己刚枚举出的 全量目录册**(mr_dir_book,与翻页同一份枚举)里按 basename 定位起始页(先精确, 再大小写不敏感兜底;找不到退回续读/首页)。书库点击只传文件名。 - 删除 mr_library_image_index(不再有跨枚举的隐式契约)。 - 截断提示文案改为「仅显示前 2000 项(图片可在阅读器中翻到)」。 - 修复前(cb02722 探针,2100 张 4 位名夹具):rows=2000/truncated=1/ library_images=2000/reader_pages=2100/**mismatched=590**(首行 p1412 → 打开 p1411); 评审夹具为 1995/2000。修复后:2000 个可见图片行按名定位 **0 mismatch**, 2100 页全量可翻;26 次真实 UI 点开(首尾各 3 + 20 个确定性伪随机)逐张命中。 连带处理(评审 r1): 1. 删掉 reader_page_enter 的 c->view 死写(reopen 判定用 activity active/depth); 顺手删掉 library_page_create 里同款死写。 2. 阅读器册间衔接根锁定:新增 mr_path_within_root + mr_book_adjacent_rooted, book_switch 用浏览根(默认 MR_ROOT_DIR,测试可注入)钳制相邻册; 根外的兄弟册按「没有相邻册」处理。test_cont_adjacent A7 验证「明文 _ex 会越根、 rooted 拒绝、根内翻册不受影响」;test_mode_switch_host H6 验证条漫末页不越根。 3. test_reader_perf 不再依赖顶栏 tap 命中时序:模式切换改走测试钩子 mr_reader_test_toggle_mode()(与顶栏动作同一个 mode_set),负载下稳定。 4. page_cache 注释去掉「缩略图缓存/缩略图线程」过时描述(只改文字)。 回归:run_tests.sh(library 81 / nav 74 / lazy 57 / perf 25 / … / open_book 含 2100 用例) 与 run_webtoon_tests.sh(含 A7/H6)全 PASS;交叉构建零警告。
57 lines
2.9 KiB
Markdown
57 lines
2.9 KiB
Markdown
# tuku(os.meow.picbrowser)打包与签名
|
||
|
||
图库 App(系统包名 `os.meow.picbrowser`)。构建与打包:
|
||
|
||
```sh
|
||
./build_tuku.sh # 交叉编译 picbrowser(MIPS32r2 静态)
|
||
./pack_tuku.sh # 打包 → os.meow.picbrowser.mpk(根布局;未签名)
|
||
```
|
||
|
||
## 浏览交互(文件管理器模型,M18)
|
||
|
||
- 列表 = 当前目录一层的**子目录 + 受支持图片(png/jpg/jpeg/bmp)+ 档案册(.cbz/.zip)**;
|
||
目录优先,组内自然序(大小写不敏感,同键按原始字节兜底,`A.jpg`/`a.jpg` 不抖动)。
|
||
- 点目录 = 进入(空目录也进);点图片 = 从该图开始读(按**文件名**交给阅读器,
|
||
由阅读器的全量目录册定位起始页——列表被 `MR_LIB_SCAN_MAX` 截断时也不会点错图);
|
||
点档案册 = 打开档案册(第 1 页/续读)。
|
||
- 单目录超过 2000 项时列表只显示前 2000 项并给出「已截断」提示行;图片仍可进入阅读器翻到。
|
||
- 缩略图功能已关闭:行内只有类型图标 + 文件名 + 类型·大小;首帧只做单层
|
||
`opendir/readdir + lstat`,滚动/点击路径不解码、不访问文件、不重排字符串。
|
||
- 浏览根锁定 TF 卡根(`/usr/data/mnt/sd_0`):根目录不显示返回箭头,左缘返回 = 退出 App;
|
||
**不允许上溯到 SD 卡的上级目录**。
|
||
- 根目录不可访问(未插卡/挂载失败)→ 友好空态「未检测到 SD 卡」;点顶栏刷新或重进页面即重扫,
|
||
不弹错、不崩溃。
|
||
|
||
## 一键签名出包
|
||
|
||
```sh
|
||
MEOW_SIGN_KEY=/path/to/signing.key ./pack_tuku.sh
|
||
```
|
||
|
||
- 工具查找顺序:`$MEOW_SIGN` → `PATH` 里的 `meow_sign` → `$HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign`。
|
||
- 私钥:`$MEOW_SIGN_KEY`。未设置时脚本**警告并仍产出未签名包**(退出码 0);但 `os.meow.*` 系统包无签名会被设备拒装。
|
||
- 有工具 + 密钥时执行 `meow_sign sign <mpk> <key>`;若存在 `<key>.pub` 再执行 `meow_sign verify <mpk> <key>.pub`。
|
||
- 私钥**不入库、不随包分发**;本仓不包含任何密钥材料。
|
||
|
||
## mpk 布局
|
||
|
||
`.mpk` = tar.gz,条目直接在根层:
|
||
|
||
```
|
||
os.meow.picbrowser.mpk
|
||
├── app.json
|
||
├── picbrowser
|
||
└── <signature footer> # 仅签名包有(Ed25519,尾部追加)
|
||
```
|
||
|
||
即 `tar -C build/os.meow.picbrowser -czf os.meow.picbrowser.mpk app.json picbrowser`——
|
||
不带 `os.meow.picbrowser/` 目录前缀,也不带 `./` 前缀。脚本在签名前用 `tar -tzf` 断言这一点。
|
||
|
||
签名是往 tar.gz 尾部**追加** footer,签名后的 mpk 不要再跑 `tar -t` / `gzip` 之类的命令:
|
||
gzip 会报 `trailing garbage ignored`,属预期现象,不是包损坏。要检查布局请在签名前做。
|
||
|
||
## 安装
|
||
|
||
把 `.mpk` 放到设备 TF 卡,执行 `nyai install os.meow.picbrowser.mpk`;
|
||
`os.meow.*` 包必须验签通过(footer.package == 文件名茎 == `app.json.package`)。
|