fix(fw): M51 刷机前批次 — 5 组二进制从最新 main 重编 + 钉值回写 + 语义指纹自证

本轮终结「二进制与源码两条轨道各走各的」:M23/M43/M47/M49/M50 只交源码,产物统一由本单
从 main 5a06a8c 一次重编。重编后 md5 全变(旧钉值来自另一代工具链/另一份源码),语义由
scripts/build/verify_fingerprints.sh 逐条自证。

- meow_bootmenu     157108 → 158836  8bce6558  (源码与 884d4c4 一致,变化全部来自工具链代差)
- meow_netmgrd      212740 → 222068  e62e7512  (M49 蓝牙控制面 + WiFi 连接修复,+9328 全为源码)
- meow_audiod       153484 →  68604  9f58b219  (musl 静态 → glibc-2.22 动态,链 libasound.so.2;M50)
- meow_audio         88888 →  88888  3909c8d2  (与钉值逐字节一致,重编即复现)
- meow_launcherd    894940 → 901020  e21450ff  (M47 蓝牙/WiFi 三态开关 +6592)

fw_content.conf:上述 6 行(netmgrd 双路径)md5 回写;desc 改为中性描述(文件是什么/什么形态),
不再写未进产物的功能版本号(M48 查出 bootmenu/netmgrd/audiod 三处 desc 撑谎)。
30/30 行 md5 与磁盘一致、全部 4 字段。

新增 scripts/build/rebuild_binaries.sh:干净 checkout / worktree 里的重编驱动(兼容 HOME +
.tools/meow_ui.a 兜底,不改各组件 build_*.sh 的本机硬编码路径)。
新增 scripts/build/verify_fingerprints.sh:字符串/动态段/4263 反汇编判据逐条断言。
This commit is contained in:
AskaEth committed 2026-11-11 20:29:21 +08:00
1 parent 5a06a8cc1a
commit 31d4c22806
8 files changed
+194 -6

No files matched your search

+97
View File
@@ -0,0 +1,97 @@
#!/bin/bash
# rebuild_binaries.sh — 重编「进固件的那批组件」,产物就地写回 patch_v2/<组件>/(M51 批次)。
#
# 为什么需要它:各组件自己的 build_*.sh 里仍散落着本机布局的默认路径
# (`$HOME/Project/R3ProII/.tools/...`、`$HOME/.tools/mipsel-linux-muslsf-cross/...`),
# 在干净 checkout / git worktree 里直接跑会「找不到编译器」。本脚本不去改那些脚本,
# 而是**在调用侧**把这些路径用环境变量与一个兼容 HOME 补齐:
#
# $COMPAT_HOME/Project/R3ProII -> 本仓库根(脚本里的历史硬编码路径落到当前 checkout)
# $COMPAT_HOME/.tools -> 真 .tools(zig-mipsel-cc / muslsf 交叉 sysroot)
#
# 所有路径都可被环境变量覆盖:
# ZIGCC mipsel-musl 交叉编译器包装(默认 $HOME/.tools/zig-mipsel-cc)
# ZIG 裸 zig(audiod 守护目标用它做 glibc-2.22 动态链接;默认 PATH 里的 zig)
# MEOW_UI_A_SRC launcherd 需要的 SDK 静态库来源(默认主 checkout 的 patch_v2/sdk/meow_ui.a)
#
# 用法:
# bash scripts/build/rebuild_binaries.sh # 全部 5 组
# bash scripts/build/rebuild_binaries.sh bootmenu # 只编一个(可多个)
# 组件名:bootmenu netmgrd audiod audio launcherd
#
# 前置:meow_audiod 守护目标需要设备 libasound.so.2 副本(build_audiod.sh 自动从
# devdocs/fw-baseline/ 或主 checkout 取);worktree 里没有这些未入库目录时,
# 不需要额外指定——build_audiod.sh 用 git-common-dir 回退到主 checkout 取固件树。
set -e
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
ZIGCC="${ZIGCC:-$HOME/.tools/zig-mipsel-cc}"
ZIG="${ZIG:-$(command -v zig || true)}"
MEOW_UI_A_SRC="${MEOW_UI_A_SRC:-}"
[ -x "$ZIGCC" ] || { echo "!! ZIGCC 不可执行: $ZIGCC(用 ZIGCC=/path 覆盖)" >&2; exit 1; }
[ -n "$ZIG" ] && [ -x "$ZIG" ] || { echo "!! 找不到 zig(用 ZIG=/path 覆盖)" >&2; exit 1; }
# launcherd 链的 SDK 静态库被 .gitignore 忽略,worktree 里没有 → 从主 checkout 取。
ensure_ui_a() {
local dst="$ROOT/patch_v2/sdk/meow_ui.a"
[ -f "$dst" ] && { echo " meow_ui.a: $dst ($(md5sum "$dst" | cut -d' ' -f1))"; return 0; }
local src="$MEOW_UI_A_SRC"
if [ -z "$src" ]; then
local main
main="$(git -C "$ROOT" rev-parse --git-common-dir 2>/dev/null || true)"
[ -n "$main" ] && main="$(cd "$ROOT/$(dirname "$main")/.." 2>/dev/null && pwd)/patch_v2/sdk/meow_ui.a"
src="$main"
fi
[ -n "$src" ] && [ -f "$src" ] || {
echo "!! 缺 patch_v2/sdk/meow_ui.a,且找不到来源;用 MEOW_UI_A_SRC=/path 指定" >&2
echo " (它由 patch_v2/sdk/build_sdk.sh 产出,被 .gitignore 忽略,不入库)" >&2
exit 1; }
cp "$src" "$dst"
echo " meow_ui.a: 复制 $src → $dst ($(md5sum "$dst" | cut -d' ' -f1))"
}
# 兼容 HOME:历史脚本按 $HOME 拼路径,这里让那些路径解析到当前 checkout 与真工具链。
COMPAT_HOME="${COMPAT_HOME:-${TMPDIR:-$HOME/tmp}/meow-build-home}"
mkdir -p "$COMPAT_HOME/Project"
ln -sfn "$ROOT" "$COMPAT_HOME/Project/R3ProII"
ln -sfn "$HOME/.tools" "$COMPAT_HOME/.tools"
run() { # run <组件> <工作目录> <命令...>
local name="$1" dir="$2"; shift 2
echo "==> [$name] $*"
( cd "$ROOT/$dir" && HOME="$COMPAT_HOME" ZIGCC="$ZIGCC" ZIG="$ZIG" \
ZIG_GLOBAL_CACHE_DIR="$HOME/.cache/zig" "$@" )
}
report() { # report <产物路径>
local f="$ROOT/$1"
printf ' %-44s %8s B %s\n' "$1" "$(stat -c%s "$f")" "$(md5sum "$f" | cut -d' ' -f1)"
}
do_bootmenu=0; do_netmgrd=0; do_audiod=0; do_audio=0; do_launcherd=0
if [ $# -eq 0 ]; then do_bootmenu=1; do_netmgrd=1; do_audiod=1; do_audio=1; do_launcherd=1; fi
for a in "$@"; do
case "$a" in
bootmenu) do_bootmenu=1 ;;
netmgrd) do_netmgrd=1 ;;
audiod) do_audiod=1 ;;
audio) do_audio=1 ;;
launcherd) do_launcherd=1 ;;
*) echo "!! 未知组件: $a(bootmenu netmgrd audiod audio launcherd)" >&2; exit 1 ;;
esac
done
echo "==> 重编批次(ROOT=$ROOT)"
echo " ZIGCC=$ZIGCC"
echo " ZIG=$ZIG ($("$ZIG" version 2>/dev/null || echo '?'))"
[ "$do_bootmenu" = 1 ] && { run bootmenu patch_v2/bootmenu bash build_bootmenu.sh; report patch_v2/bootmenu/meow_bootmenu; }
[ "$do_netmgrd" = 1 ] && { run netmgrd patch_v2/meow_netmgrd bash build_netmgrd.sh; report patch_v2/meow_netmgrd/meow_netmgrd; }
# audiod 守护:glibc-2.22 动态链接(链设备 libasound.so.2);**不链 meow_time32.c**(见 build_audiod.sh 头注)。
# meow_audio CLI:musl 静态 + meow_time32.c。
[ "$do_audiod" = 1 ] && { run audiod patch_v2/meow_audiod bash build_audiod.sh; report patch_v2/meow_audiod/meow_audiod; }
[ "$do_audio" = 1 ] && { run audio patch_v2/meow_audiod bash build_audiod.sh cli; report patch_v2/meow_audiod/meow_audio; }
[ "$do_launcherd" = 1 ] && { ensure_ui_a; run launcherd patch_v2/meow_launcherd bash build_launcher.sh; report patch_v2/meow_launcherd/meow_launcherd; }
echo "==> 完成。产物自证:bash scripts/build/verify_fingerprints.sh"