Merge branch 'feat/tuku-one-click-pack-with-signing'
This commit is contained in:
commit
73a9603ef0
2 files changed
+128
-9
No files matched your search
@@ -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
@@ -1,14 +1,92 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
# pack_tuku.sh — 出包 os.meow.picbrowser.mpk(tar.gz,根目录 os.meow.picbrowser/,含 app.json + picbrowser)。
|
# pack_tuku.sh — 一键出包 os.meow.picbrowser.mpk(根布局 tar.gz,可选内联签名)。
|
||||||
# .mpk 文件名茎 = app.json.package = 安装目录名(os.meow.picbrowser)。
|
#
|
||||||
|
# 布局: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
|
set -e
|
||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
PKG=os.meow.picbrowser
|
||||||
|
MPK="$PKG.mpk"
|
||||||
|
STAGE="build/$PKG"
|
||||||
|
|
||||||
[ -x picbrowser ] || ./build_tuku.sh
|
[ -x picbrowser ] || ./build_tuku.sh
|
||||||
|
|
||||||
rm -rf build/os.meow.picbrowser
|
rm -rf "$STAGE"
|
||||||
mkdir -p build/os.meow.picbrowser
|
mkdir -p "$STAGE"
|
||||||
cp app.json picbrowser build/os.meow.picbrowser/
|
cp app.json picbrowser "$STAGE/"
|
||||||
|
|
||||||
rm -f os.meow.picbrowser.mpk
|
rm -f "$MPK"
|
||||||
( cd build && tar czf ../os.meow.picbrowser.mpk os.meow.picbrowser )
|
tar -C "$STAGE" -czf "$MPK" app.json picbrowser
|
||||||
ls -la os.meow.picbrowser.mpk
|
|
||||||
|
# 根布局断言(签名前):第一层有 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"
|
||||||
Reference in new issue
Block a user