Merge branch 'feat/tuku-one-click-pack-with-signing'

This commit is contained in:
AskaEth committed 2026-11-05 17:40:57 +08:00
commit 73a9603ef0
2 files changed
+128 -9

No files matched your search

+41
View File
@@ -0,0 +1,41 @@
# tuku(os.meow.picbrowser)打包与签名
图库 App(系统包名 `os.meow.picbrowser`)。构建与打包:
```sh
./build_tuku.sh # 交叉编译 picbrowser(MIPS32r2 静态)
./pack_tuku.sh # 打包 → os.meow.picbrowser.mpk(根布局;未签名)
```
## 一键签名出包
```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`)。
+87 -9
View File
@@ -1,14 +1,92 @@
#!/bin/bash
# pack_tuku.sh — 出包 os.meow.picbrowser.mpk(tar.gz,根目录 os.meow.picbrowser/,含 app.json + picbrowser)。
# .mpk 文件名茎 = app.json.package = 安装目录名(os.meow.picbrowser)。
#!/usr/bin/env bash
# pack_tuku.sh — 一键出包 os.meow.picbrowser.mpk(根布局 tar.gz,可选内联签名)。
#
# 布局:mpk 内的条目直接是 app.json + picbrowser(无 <pkg>/ 前缀、无 ./ 前缀),
# 与安装端「.mpk 内容在 tar 根」的解包口径一致。
#
# 一键签名(推荐;os.meow.* 无签名设备会拒装):
# MEOW_SIGN_KEY=/path/to/signing.key ./pack_tuku.sh
#
# 环境变量:
# MEOW_SIGN 指定 meow_sign 可执行文件;未设时依次找 PATH 里的 meow_sign、
# 再回退 $HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign。
# MEOW_SIGN_KEY 私钥路径。未设 → 警告并产出未签名包(退出码 0);
# 设了但找不到工具/密钥或签名失败 → 报错退出(不静默交付未签名包)。
# 若同目录存在 <key>.pub,签名后自动 verify。
#
# 注意:签名是往 tar.gz 尾部追加 footer。签名后的 mpk **不要**再跑 tar/gzip 类命令
# (gzip 会报 "trailing garbage ignored",属预期,不是包损坏)。因此根布局断言
# 必须在签名前用 tar -tzf 做。
set -e
cd "$(dirname "$0")"
PKG=os.meow.picbrowser
MPK="$PKG.mpk"
STAGE="build/$PKG"
[ -x picbrowser ] || ./build_tuku.sh
rm -rf build/os.meow.picbrowser
mkdir -p build/os.meow.picbrowser
cp app.json picbrowser build/os.meow.picbrowser/
rm -rf "$STAGE"
mkdir -p "$STAGE"
cp app.json picbrowser "$STAGE/"
rm -f os.meow.picbrowser.mpk
( cd build && tar czf ../os.meow.picbrowser.mpk os.meow.picbrowser )
ls -la os.meow.picbrowser.mpk
rm -f "$MPK"
tar -C "$STAGE" -czf "$MPK" app.json picbrowser
# 根布局断言(签名前):第一层有 app.json,且不带 <pkg>/ 或 ./ 前缀。
listing="$(tar -C "$STAGE" -tzf "$MPK")"
printf '%s\n' "$listing"
if ! printf '%s\n' "$listing" | grep -qx 'app.json'; then
echo "错误:$MPK 根层缺少 app.json(布局不是根布局)" >&2
exit 1
fi
if printf '%s\n' "$listing" | grep -q "^\(\./\)\?$PKG/"; then
echo "错误:$MPK 仍带 $PKG/ 前缀(嵌套布局)" >&2
exit 1
fi
find_sign_tool() {
if [ -n "${MEOW_SIGN:-}" ]; then
printf '%s\n' "$MEOW_SIGN"
elif command -v meow_sign >/dev/null 2>&1; then
command -v meow_sign
elif [ -x "$HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign" ]; then
printf '%s\n' "$HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign"
else
return 1
fi
}
if [ -z "${MEOW_SIGN_KEY:-}" ]; then
echo "警告:未签名(未设置 MEOW_SIGN_KEY),已产出未签名包 $MPK" >&2
echo " 设 MEOW_SIGN_KEY=<私钥> 后重跑,或手动 sign;os.meow.* 未签名设备拒装。" >&2
else
if [ ! -f "$MEOW_SIGN_KEY" ]; then
echo "错误:MEOW_SIGN_KEY=$MEOW_SIGN_KEY 不存在" >&2
exit 1
fi
if ! SIGN_TOOL="$(find_sign_tool)"; then
echo "错误:找不到 meow_sign(可用 MEOW_SIGN=/path/to/meow_sign 指定);$MPK 未签名" >&2
exit 1
fi
if [ ! -x "$SIGN_TOOL" ]; then
echo "错误:$SIGN_TOOL 不可执行(可用 MEOW_SIGN 指定可执行的 meow_sign);$MPK 未签名" >&2
exit 1
fi
if ! "$SIGN_TOOL" sign "$MPK" "$MEOW_SIGN_KEY"; then
echo "错误:meow_sign sign 失败,$MPK 仍是未签名包" >&2
echo " 若提示 cannot execute / required file not found,多半是该二进制与本机不兼容,用 MEOW_SIGN 指定可执行版本。" >&2
exit 1
fi
if [ -f "$MEOW_SIGN_KEY.pub" ]; then
if ! "$SIGN_TOOL" verify "$MPK" "$MEOW_SIGN_KEY.pub"; then
echo "错误:meow_sign verify 失败,$MPK 签名无效" >&2
exit 1
fi
else
echo "提示:未找到 $MEOW_SIGN_KEY.pub,跳过 verify"
fi
# 签名后不要再 tar -t/-z:footer 在 gzip 流外,gzip 会报 trailing garbage(预期)。
fi
ls -la "$MPK"