Files
MeowOS-For-R3P2/scripts/build/verify_fingerprints.sh
T
AskaEth 31d4c22806 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 反汇编判据逐条断言。
2026-11-11 20:29:21 +08:00

90 lines
4.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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"