fix(build): M56 r1 评审三条 P2 + 一条观察(脚本权限/可复现口径注释/watchdog 参数去内联+入门禁/REPACK 显式失败)

- P2-1 repack_repro.sh 提交为 100755(scripts/build/ 下唯一非 755 的 .sh,而头注释就让人直接执行)
- P2-2 注释与事实对齐:写明 squashfs/分片/ota_update.in 可复现,但 .upt 仍有 93 字节
  Rock Ridge TF backup date 差异(genisoimage 无覆盖开关),验收口径仍是 体积+unpack 0 diff+进包 md5
- P2-3 watchdog 参数不再内联复制:build_watchdog.sh 认 ZIGCC(照 build_netmgrd.sh 口径),
  rebuild_binaries.sh 改成调它;meow_watchdog 加入 test_time32_abi.sh 的 BUILD_TARGETS(11 个)。
  改后重编仍逐字节 25f769509a43d0f66287efd456c64281 / 100116,与内联那版一致
- 观察1:REPACK 显式指定但不存在 -> exit 1(此前会静默回退到不可复现的旧 repack.sh)
This commit is contained in:
tower committed 2026-11-12 08:44:27 +08:00
1 parent d34406ac22
commit 28fbc6094a
5 files changed
+36 -16

No files matched your search

+4 -1
View File
@@ -7,7 +7,10 @@
set -e set -e
cd "$(dirname "$0")" cd "$(dirname "$0")"
ROOT=../.. ROOT=../..
CC="$ROOT/.tools/zig-mipsel-cc" # 交叉编译器:ZIGCC env 优先(与 build_netmgrd.sh 同口径;干净 worktree 里 <root>/.tools
# 这个符号链接通常不存在,重编驱动会直接传 ZIGCC 进来),其次 <root>/.tools/,最后 $HOME/.tools/
CC="${ZIGCC:-$ROOT/.tools/zig-mipsel-cc}"
[ -x "$CC" ] || CC="$HOME/.tools/zig-mipsel-cc"
INC="$ROOT/patch_v2/meow_launcherd" # meow_ipc.h(音量收编 v2:MSG_AUDIO_VOLUME/MSG_ACK) INC="$ROOT/patch_v2/meow_launcherd" # meow_ipc.h(音量收编 v2:MSG_AUDIO_VOLUME/MSG_ACK)
if [ "$1" = "host" ]; then if [ "$1" = "host" ]; then
+3 -2
View File
@@ -20,7 +20,7 @@
# 缺陷版(4263 的 a1 直接指向调用方 8 字节缓冲、无宽度转换)两条都不成立。 # 缺陷版(4263 的 a1 直接指向调用方 8 字节缓冲、无宽度转换)两条都不成立。
# #
# 用法(任意目录): # 用法(任意目录):
# bash patch_v2/sdk/test_time32_abi.sh # 只跑构建门禁(10 个组件) # bash patch_v2/sdk/test_time32_abi.sh # 只跑构建门禁(11 个组件)
# bash patch_v2/sdk/test_time32_abi.sh <mipsel-bin> ... # 构建门禁 + 二进制检查 # bash patch_v2/sdk/test_time32_abi.sh <mipsel-bin> ... # 构建门禁 + 二进制检查
# bash patch_v2/sdk/test_time32_abi.sh --no-builds <bin> ... # 只跑二进制检查(旧用法) # bash patch_v2/sdk/test_time32_abi.sh --no-builds <bin> ... # 只跑二进制检查(旧用法)
# 可用 OBJDUMP=<path> 指定 objdump(默认 llvm-objdump)。 # 可用 OBJDUMP=<path> 指定 objdump(默认 llvm-objdump)。
@@ -34,7 +34,7 @@ OD="${OBJDUMP:-llvm-objdump}"
usage() { usage() {
echo "用法: $0 [--builds|--no-builds] [mipsel-binary ...]" >&2 echo "用法: $0 [--builds|--no-builds] [mipsel-binary ...]" >&2
echo " 无参数 / --builds 只跑构建门禁(10 个 M43 组件)" >&2 echo " 无参数 / --builds 只跑构建门禁(11 个 M43 组件 + meow_watchdog)" >&2
echo " <binary> ... 构建门禁 + 二进制检查" >&2 echo " <binary> ... 构建门禁 + 二进制检查" >&2
echo " --no-builds <binary> 只跑二进制检查" >&2 echo " --no-builds <binary> 只跑二进制检查" >&2
} }
@@ -52,6 +52,7 @@ meow_svc_perf|patch_v2/meow_svc_perf/build_svc_perf.sh
meow_powermgr|patch_v2/meow_powermgr/build_powermgr.sh meow_powermgr|patch_v2/meow_powermgr/build_powermgr.sh
meowpanel|patch_v2/meowpanel/build_meowpanel.sh meowpanel|patch_v2/meowpanel/build_meowpanel.sh
meow_audio|patch_v2/meow_audiod/build_audiod.sh meow_audio|patch_v2/meow_audiod/build_audiod.sh
meow_watchdog|patch_v2/meow_watchdog/build_watchdog.sh
' '
# 语义断言:要求 16 字节写回与「被调函数填的 8 字节 ts32 缓冲」存在数据依赖。 # 语义断言:要求 16 字节写回与「被调函数填的 8 字节 ts32 缓冲」存在数据依赖。
+13 -4
View File
@@ -173,12 +173,21 @@ fi
echo "==> repack" echo "==> repack"
# 优先用可复现打包器(scripts/build/repack_repro.sh:mksquashfs -repro-time + # 优先用可复现打包器(scripts/build/repack_repro.sh:mksquashfs -repro-time +
# genisoimage -creation-date + mtime 归一化,同一输入两次打包逐字节相同)。 # genisoimage -creation-date + mtime 归一化)。可复现口径**到 squashfs/元数据为止**:
# 它不在时退回历史 repack.sh(产物布局相同,只是时间戳随墙钟)。 # rootfs.squashfs / 分片 / ota_update.in 两次打包逐字节相同;`.upt` 本身仍差约 93 字节
# (genisoimage 写的 Rock Ridge TF backup date,无覆盖开关),故 .upt 验收仍是
# 「体积 + unpack 0 diff + 进包 md5」。
# 未设 REPACK 时才回退历史 repack.sh(产物布局相同,时间戳全随墙钟);
# **显式指定了却不存在 → 直接失败**,免得「以为用了可复现打包器、其实悄悄退回旧路径」。
# 两者都按 bash 显式执行:repack.sh 的 #!/usr/bin/env bash 在 Android 上无 /usr/bin/env, # 两者都按 bash 显式执行:repack.sh 的 #!/usr/bin/env bash 在 Android 上无 /usr/bin/env,
# 且经 su 跑时 termux-exec 的 LD_PRELOAD 被丢弃 → bad interpreter(M13 实测)。 # 且经 su 跑时 termux-exec 的 LD_PRELOAD 被丢弃 → bad interpreter(M13 实测)。
REPACK="${REPACK:-$ROOT/scripts/build/repack_repro.sh}" if [ -n "${REPACK:-}" ]; then
[ -f "$REPACK" ] || REPACK="$ROOT/hiby_os_crack/scripts/repack.sh" [ -f "$REPACK" ] || { echo "!!! REPACK 显式指定但不存在: $REPACK"; exit 1; }
else
REPACK="$ROOT/scripts/build/repack_repro.sh"
[ -f "$REPACK" ] || REPACK="$ROOT/hiby_os_crack/scripts/repack.sh"
fi
echo " repack = $REPACK"
# 内核镜像(unpacked_v14/xImage)未入库:干净 checkout / git worktree 里没有它, # 内核镜像(unpacked_v14/xImage)未入库:干净 checkout / git worktree 里没有它,
# 用 XIMAGE 指到主 checkout 的那份(普通 checkout 下默认值即可)。 # 用 XIMAGE 指到主 checkout 的那份(普通 checkout 下默认值即可)。
XIMAGE="${XIMAGE:-$ROOT/unpacked_v14/xImage}" XIMAGE="${XIMAGE:-$ROOT/unpacked_v14/xImage}"
+4 -5
View File
@@ -144,11 +144,10 @@ echo " ZIG=$ZIG ($("$ZIG" version 2>/dev/null || echo '?'))"
[ "$do_audiod" = 1 ] && { run audiod patch_v2/meow_audiod bash build_audiod.sh; report patch_v2/meow_audiod/meow_audiod; } [ "$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_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; } [ "$do_launcherd" = 1 ] && { ensure_ui_a; run launcherd patch_v2/meow_launcherd bash build_launcher.sh; report patch_v2/meow_launcherd/meow_launcherd; }
# watchdog:不走 build_watchdog.sh —— 它按自身位置推 ROOT=../.. 再取 <root>/.tools/zig-mipsel-cc, # watchdog:走它自己的 build_watchdog.sh(编译参数只有一份,改脚本即改批次)。
# 该符号链接只在主 checkout 里(worktree 没有),直接跑会「找不到编译器」。这里按它的同一组参数 # 该脚本的 CC 认 ZIGCC env(M56 r1 起的口径),所以 worktree 里 <root>/.tools 不存在也能编;
# (-Os -Wall -Wextra -static + MEOW_TIME32_LIBC_OVERRIDES + ../sdk/meow_time32.c)显式调用 $ZIGCC。 # 这里显式传 ZIGCC=,与其余组件同一个编译器,不再内联复制参数。
[ "$do_watchdog" = 1 ] && { run watchdog patch_v2/meow_watchdog "$ZIGCC" -Os -Wall -Wextra -static \ [ "$do_watchdog" = 1 ] && { run watchdog patch_v2/meow_watchdog env ZIGCC="$ZIGCC" bash build_watchdog.sh
-I../meow_launcherd -DMEOW_TIME32_LIBC_OVERRIDES meow_watchdog.c ../sdk/meow_time32.c -o meow_watchdog
report patch_v2/meow_watchdog/meow_watchdog; } report patch_v2/meow_watchdog/meow_watchdog; }
echo "==> 完成。产物自证:bash scripts/build/verify_fingerprints.sh" echo "==> 完成。产物自证:bash scripts/build/verify_fingerprints.sh"
Regular → Executable
+12 -4
View File
@@ -1,11 +1,19 @@
#!/bin/bash #!/bin/bash
# ============================================================================ # ============================================================================
# repack_repro.sh — .upt 打包(mksquashfs + 分片 md5 链 + ISO),**时间戳可复现** # repack_repro.sh — .upt 打包(mksquashfs + 分片 md5 链 + ISO),时间戳尽量可复现
# #
# 与 hiby_os_crack/scripts/repack.sh 的产物布局逐字节等价(ota_update.in / ota_v0.ok / # 与 hiby_os_crack/scripts/repack.sh 的产物布局逐字节等价(ota_update.in / ota_v0.ok /
# ota_config.in / rootfs.squashfs.NNNN.<prev-md5> / ota_md5_rootfs.squashfs.<md5>), # ota_config.in / rootfs.squashfs.NNNN.<prev-md5> / ota_md5_rootfs.squashfs.<md5>),
# 只是把「墙钟时间」从产物里拿掉,使同一输入**连续打包两次逐字节相同**: # 只把墙钟时间从「squashfs + 元数据」里拿掉。**可复现到什么程度(实测口径,别夸大)**:
# ✅ bytes-reproducible:rootfs.squashfs、ota_md5_rootfs.squashfs.*、ota_update.in、
# 分片文件名与内容、xImage 侧 —— 同一输入连续两次打包全部相同。
# ❌ not bytes-reproducible:`.upt`(ISO)本身。genisoimage 会给 Rock Ridge `TF`
# 记录写 **backup date**(TF flag=0x1a,第三个 7 字节字段),该字段取墙钟且**没有
# 覆盖开关**(`-creation-date` 只定卷的创建/修改时间)。M56 实测两次打包 `cmp -l`
# 恰好 93 字节不同,全在该字段(分钟字节),载荷 0 差异。
# 因此 `.upt` 的验收口径仍是:**体积 + unpack 0 diff + 进包 md5**。
# #
# 时间戳处理:
# 1) squashfs:`-repro-time <epoch>`(= -mkfs-time + -inode-time;mksquashfs 4.7 起)。 # 1) squashfs:`-repro-time <epoch>`(= -mkfs-time + -inode-time;mksquashfs 4.7 起)。
# 只加 -all-time 不够 —— 超级块的 mkfs_time 仍是墙钟(M60 实测)。本脚本按 # 只加 -all-time 不够 —— 超级块的 mkfs_time 仍是墙钟(M60 实测)。本脚本按
# `mksquashfs -help-all` 能力探测,依次尝试: # `mksquashfs -help-all` 能力探测,依次尝试:
@@ -13,8 +21,8 @@
# -mkfs-time <t> -inode-time <t> (4.6) # -mkfs-time <t> -inode-time <t> (4.6)
# -mkfs-time <t> -all-time <t> (老版本) # -mkfs-time <t> -all-time <t> (老版本)
# 都没有 → 告警并按旧口径(体积 + unpack 0 diff + 进包 md5)出货。 # 都没有 → 告警并按旧口径(体积 + unpack 0 diff + 进包 md5)出货。
# 2) ISO:genisoimage 的卷创建时间用 `-creation-date <YYYYMMDDhhmmsscc>` 固定, # 2) ISO:卷创建时间用 `-creation-date <秒数>` 固定,并把暂存目录里所有文件/目录的
# 并把暂存目录里所有文件/目录的 mtime touch 到同一 epoch(ISO 目录记录取文件 mtime)。 # mtime touch 到同一 epoch(ISO 目录记录取文件 mtime)。backup date 无解,见上。
# #
# 用法: # 用法:
# repack_repro.sh -i <squashfs-root> -k <xImage> -o <out.upt> # repack_repro.sh -i <squashfs-root> -k <xImage> -o <out.upt>