From 28fbc6094acb647684b4cbf6ac2dfe9df3fc08a8 Mon Sep 17 00:00:00 2001 From: tower Date: Thu, 12 Nov 2026 08:44:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(build):=20M56=20r1=20=E8=AF=84=E5=AE=A1?= =?UTF-8?q?=E4=B8=89=E6=9D=A1=20P2=20+=20=E4=B8=80=E6=9D=A1=E8=A7=82?= =?UTF-8?q?=E5=AF=9F=EF=BC=88=E8=84=9A=E6=9C=AC=E6=9D=83=E9=99=90/?= =?UTF-8?q?=E5=8F=AF=E5=A4=8D=E7=8E=B0=E5=8F=A3=E5=BE=84=E6=B3=A8=E9=87=8A?= =?UTF-8?q?/watchdog=20=E5=8F=82=E6=95=B0=E5=8E=BB=E5=86=85=E8=81=94+?= =?UTF-8?q?=E5=85=A5=E9=97=A8=E7=A6=81/REPACK=20=E6=98=BE=E5=BC=8F?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- patch_v2/meow_watchdog/build_watchdog.sh | 5 ++++- patch_v2/sdk/test_time32_abi.sh | 5 +++-- scripts/build/build_fw_apps.sh | 17 +++++++++++++---- scripts/build/rebuild_binaries.sh | 9 ++++----- scripts/build/repack_repro.sh | 16 ++++++++++++---- 5 files changed, 36 insertions(+), 16 deletions(-) mode change 100644 => 100755 scripts/build/repack_repro.sh diff --git a/patch_v2/meow_watchdog/build_watchdog.sh b/patch_v2/meow_watchdog/build_watchdog.sh index 5259142..657fa86 100755 --- a/patch_v2/meow_watchdog/build_watchdog.sh +++ b/patch_v2/meow_watchdog/build_watchdog.sh @@ -7,7 +7,10 @@ set -e cd "$(dirname "$0")" ROOT=../.. -CC="$ROOT/.tools/zig-mipsel-cc" +# 交叉编译器:ZIGCC env 优先(与 build_netmgrd.sh 同口径;干净 worktree 里 /.tools +# 这个符号链接通常不存在,重编驱动会直接传 ZIGCC 进来),其次 /.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) if [ "$1" = "host" ]; then diff --git a/patch_v2/sdk/test_time32_abi.sh b/patch_v2/sdk/test_time32_abi.sh index 7499881..6cd09ad 100755 --- a/patch_v2/sdk/test_time32_abi.sh +++ b/patch_v2/sdk/test_time32_abi.sh @@ -20,7 +20,7 @@ # 缺陷版(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 ... # 构建门禁 + 二进制检查 # bash patch_v2/sdk/test_time32_abi.sh --no-builds ... # 只跑二进制检查(旧用法) # 可用 OBJDUMP= 指定 objdump(默认 llvm-objdump)。 @@ -34,7 +34,7 @@ OD="${OBJDUMP:-llvm-objdump}" usage() { echo "用法: $0 [--builds|--no-builds] [mipsel-binary ...]" >&2 - echo " 无参数 / --builds 只跑构建门禁(10 个 M43 组件)" >&2 + echo " 无参数 / --builds 只跑构建门禁(11 个 M43 组件 + meow_watchdog)" >&2 echo " ... 构建门禁 + 二进制检查" >&2 echo " --no-builds 只跑二进制检查" >&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 meowpanel|patch_v2/meowpanel/build_meowpanel.sh meow_audio|patch_v2/meow_audiod/build_audiod.sh +meow_watchdog|patch_v2/meow_watchdog/build_watchdog.sh ' # 语义断言:要求 16 字节写回与「被调函数填的 8 字节 ts32 缓冲」存在数据依赖。 diff --git a/scripts/build/build_fw_apps.sh b/scripts/build/build_fw_apps.sh index 1652ad1..a76f359 100755 --- a/scripts/build/build_fw_apps.sh +++ b/scripts/build/build_fw_apps.sh @@ -173,12 +173,21 @@ fi echo "==> repack" # 优先用可复现打包器(scripts/build/repack_repro.sh:mksquashfs -repro-time + -# genisoimage -creation-date + mtime 归一化,同一输入两次打包逐字节相同)。 -# 它不在时退回历史 repack.sh(产物布局相同,只是时间戳随墙钟)。 +# genisoimage -creation-date + mtime 归一化)。可复现口径**到 squashfs/元数据为止**: +# 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, # 且经 su 跑时 termux-exec 的 LD_PRELOAD 被丢弃 → bad interpreter(M13 实测)。 -REPACK="${REPACK:-$ROOT/scripts/build/repack_repro.sh}" -[ -f "$REPACK" ] || REPACK="$ROOT/hiby_os_crack/scripts/repack.sh" +if [ -n "${REPACK:-}" ]; then + [ -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 里没有它, # 用 XIMAGE 指到主 checkout 的那份(普通 checkout 下默认值即可)。 XIMAGE="${XIMAGE:-$ROOT/unpacked_v14/xImage}" diff --git a/scripts/build/rebuild_binaries.sh b/scripts/build/rebuild_binaries.sh index 6cb1ea5..440005a 100755 --- a/scripts/build/rebuild_binaries.sh +++ b/scripts/build/rebuild_binaries.sh @@ -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_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; } -# watchdog:不走 build_watchdog.sh —— 它按自身位置推 ROOT=../.. 再取 /.tools/zig-mipsel-cc, -# 该符号链接只在主 checkout 里(worktree 没有),直接跑会「找不到编译器」。这里按它的同一组参数 -# (-Os -Wall -Wextra -static + MEOW_TIME32_LIBC_OVERRIDES + ../sdk/meow_time32.c)显式调用 $ZIGCC。 -[ "$do_watchdog" = 1 ] && { run watchdog patch_v2/meow_watchdog "$ZIGCC" -Os -Wall -Wextra -static \ - -I../meow_launcherd -DMEOW_TIME32_LIBC_OVERRIDES meow_watchdog.c ../sdk/meow_time32.c -o meow_watchdog +# watchdog:走它自己的 build_watchdog.sh(编译参数只有一份,改脚本即改批次)。 +# 该脚本的 CC 认 ZIGCC env(M56 r1 起的口径),所以 worktree 里 /.tools 不存在也能编; +# 这里显式传 ZIGCC=,与其余组件同一个编译器,不再内联复制参数。 +[ "$do_watchdog" = 1 ] && { run watchdog patch_v2/meow_watchdog env ZIGCC="$ZIGCC" bash build_watchdog.sh report patch_v2/meow_watchdog/meow_watchdog; } echo "==> 完成。产物自证:bash scripts/build/verify_fingerprints.sh" diff --git a/scripts/build/repack_repro.sh b/scripts/build/repack_repro.sh old mode 100644 new mode 100755 index 378c8a5..290df45 --- a/scripts/build/repack_repro.sh +++ b/scripts/build/repack_repro.sh @@ -1,11 +1,19 @@ #!/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 / # ota_config.in / rootfs.squashfs.NNNN. / ota_md5_rootfs.squashfs.), -# 只是把「墙钟时间」从产物里拿掉,使同一输入**连续打包两次逐字节相同**: +# 只把墙钟时间从「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 `(= -mkfs-time + -inode-time;mksquashfs 4.7 起)。 # 只加 -all-time 不够 —— 超级块的 mkfs_time 仍是墙钟(M60 实测)。本脚本按 # `mksquashfs -help-all` 能力探测,依次尝试: @@ -13,8 +21,8 @@ # -mkfs-time -inode-time (4.6) # -mkfs-time -all-time (老版本) # 都没有 → 告警并按旧口径(体积 + unpack 0 diff + 进包 md5)出货。 -# 2) ISO:genisoimage 的卷创建时间用 `-creation-date ` 固定, -# 并把暂存目录里所有文件/目录的 mtime touch 到同一 epoch(ISO 目录记录取文件 mtime)。 +# 2) ISO:卷创建时间用 `-creation-date <秒数>` 固定,并把暂存目录里所有文件/目录的 +# mtime touch 到同一 epoch(ISO 目录记录取文件 mtime)。backup date 无解,见上。 # # 用法: # repack_repro.sh -i -k -o