图库: 打包改根布局并接入 meow_sign 一键签名(M16)

This commit is contained in:
AskaEth committed 2026-11-05 17:37:50 +08:00
1 parent e6a9e53ae9
commit 94eeabd789
2 files changed
+128 -9

No files matched your search

+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"