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

+89
View File
@@ -0,0 +1,89 @@
#!/bin/bash
# verify_fingerprints.sh — 语义指纹自证(M51 批次产物)。
#
# 背景:仓内钉值的 md5 来自旧工具链时代,重编后**必然全变**,md5 不再是「产物含哪些源码改动」
# 的证据。能证明产物语义的只有两样东西:二进制里的字符串/动态段(功能存在),以及反汇编里的
# time32 系统调用形态(4263 + 16 字节布局写回,见 patch_v2/sdk/test_time32_abi.sh)。
# 本脚本把这些判据固化下来,重编后跑一遍即可。
#
# 用法:bash scripts/build/verify_fingerprints.sh
# 退出码:全部命中 0;任一条不命中最 1。
#
# 注意:中文串用 `grep -a -o -F` 直接数二进制里的字节序列,**不能**用 strings ——
# strings 只输出可打印 ASCII 串,UTF-8 中文(每字节 ≥0x80)整段被跳过。
set -u
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BM="$ROOT/patch_v2/bootmenu/meow_bootmenu"
NM="$ROOT/patch_v2/meow_netmgrd/meow_netmgrd"
AD="$ROOT/patch_v2/meow_audiod/meow_audiod"
AU="$ROOT/patch_v2/meow_audiod/meow_audio"
LC="$ROOT/patch_v2/meow_launcherd/meow_launcherd"
PASS=0; FAIL=0
ok() { PASS=$((PASS+1)); printf ' PASS %s\n' "$1"; }
bad() { FAIL=$((FAIL+1)); printf ' FAIL %s\n' "$1"; }
# cnt <file> <literal>:二进制里该字面量的出现次数
cnt() { grep -a -o -F -- "$2" "$1" 2>/dev/null | wc -l; }
# eq <name> <file> <literal> <期望次数>
eq() {
local got; got=$(cnt "$2" "$3")
if [ "$got" -eq "$4" ]; then ok "$1: '$3' = $got"; else bad "$1: '$3' = $got(期望 $4)"; fi
}
# ge <name> <file> <literal> <最少次数>
ge() {
local got; got=$(cnt "$2" "$3")
if [ "$got" -ge "$4" ]; then ok "$1: '$3' = $got (>= $4)"; else bad "$1: '$3' = $got(期望 >= $4)"; fi
}
echo "==> meow_bootmenu(亮度单一权威源 + time32)"
eq bootmenu "$BM" 'display.brightness_min' 1
eq bootmenu "$BM" '0.1.0-m2.30-bri-src' 1
echo "==> meow_netmgrd(蓝牙控制面 / WiFi 连接修复 + time32)"
ge netmgrd "$NM" 'paired-devices' 1
ge netmgrd "$NM" 'hcitool con' 1
ge netmgrd "$NM" 'list-pcms' 1
ge netmgrd "$NM" 'A2DP none' 1
ge netmgrd "$NM" 'bt scan on' 1
eq netmgrd "$NM" 'connected=%d' 4
eq netmgrd "$NM" 'bt cmd:' 0 # 旧「一条命令行」形态已删
eq netmgrd "$NM" 'a2dp list' 0 # 旧的整段 dump 形态已删
echo "==> meow_audiod(蓝牙 A2DP 输出端到端;glibc-dynamic 链 libasound)"
ge audiod "$AD" 'audio.output_bt' 1
ge audiod "$AD" 'bluealsa:DEV=%s,PROFILE=a2dp,CODEC=%s' 1
ge audiod "$AD" 'btdev=' 1
ge audiod "$AD" 'btcodec=' 1
ge audiod "$AD" 'btacodec=' 1
eq audiod "$AD" 'pcm.bluealsa' 0 # 打开名改走 bluealsa:DEV=... 内联参数
eq audiod "$AD" '/usr/data/alsa.conf' 0 # 不再读写 HiBy 播放器的非法 alsa.conf
if readelf -d "$AD" 2>/dev/null | grep -q 'libasound.so.2'; then ok "audiod: readelf -d NEEDED libasound.so.2"
else bad "audiod: readelf -d 缺 libasound.so.2"; fi
if readelf -l "$AD" 2>/dev/null | grep -q 'interpreter: /lib/ld.so.1'; then ok "audiod: interpreter = /lib/ld.so.1"
else bad "audiod: interpreter 不是 /lib/ld.so.1"; fi
echo "==> meow_audio(CLI,musl 静态 + time32)"
ge audio "$AU" 'S24' 1
ge audio "$AU" 'S32' 1
echo "==> meow_launcherd(装包委托 nyai + 开关三态)"
ge launcherd "$LC" 'pkg_install: nyai unavailable at %s' 1
ge launcherd "$LC" 'pkg_install: rejected path: %s' 1
ge launcherd "$LC" 'pkg_install: ok' 1
ge launcherd "$LC" '--pkg-install' 1
ge launcherd "$LC" '/usr/bin/nyai' 1
for s in '正在%s…(等待设备确认)' '无法确认当前状态(上次已知:%s)' '切换未生效:当前仍为%s' \
'蓝牙状态未知' 'WiFi 开关状态未知' '无法读取开关状态(服务/控制器无响应)' \
'无法读取射频状态(rfkill/网卡无响应)'; do
ge launcherd "$LC" "$s" 1
done
echo "==> time32 二进制判据(4263 + 16B 布局写回;audiod 守护例外见 build_audiod.sh)"
bash "$ROOT/patch_v2/sdk/test_time32_abi.sh" --no-builds "$BM" "$NM" "$AU" "$LC"
echo "==> 汇总:fingerprints PASS=$PASS FAIL=$FAIL"
[ "$FAIL" -eq 0 ] || exit 1
echo " ALL PASS"