#!/bin/bash # verify_meow_m22.sh — R3 Pro II MeowOS 常驻主界面 + 系统拔营(挂卡/联网)真机验证编排 # # 前提:设备已在 MeowOS 模式(播放器已死)且联网可 SSH;或先在此脚本内确认无播放器。 # 场景(用户实测 M2.1 三现象 + 拔营): # - 现象3:启动即显示应用列表(非播放器死帧/启动图卡屏)→ `shot m22_start` # - 现象1:BACK TO PLAYER 显示「重启后返回播放器」提示并留下 → `--sim-exit-tap` # - 现象2:无播放器时不备份/不冻结/不 SIGCONT、不恢复死帧 → 全程 logmsg 确认 # - 拔营:TF 卡自动挂载(ensure_card_mounted)、WiFi 自动联网(ensure_wifi) # # 用法:./verify_meow_m22.sh <设备IP> [ssh私钥] # ./verify_meow_m22.sh # # 纪律:不 killall(仅已知 pid SIGTERM);禁 SIGUSR1;禁经 hiby_player.sh; # 启动前 rm -f /data/recovery_all;本脚本不刷机。 set -u DEV="${1:-}" KEY="${2:-$HOME/Project/R3ProII/ssh_keys/}" ROOT="$HOME/Project/R3ProII" LAUNCHER="$ROOT/patch_v2/meow_launcherd/meow_launcherd" SSH="ssh -i $KEY -o StrictHostKeyChecking=accept-new -o ConnectTimeout=8" SCP="scp -i $KEY -o StrictHostKeyChecking=accept-new" s() { timeout 60 $SSH root@"$DEV" "$1"; } sbg() { timeout 60 $SSH root@"$DEV" "$1" >"$ROOT/device_test/$2.raw" 2>/dev/null; } shot() { # 抓取当前 fb0 显示帧(buffer0, 480*720*2)并起名 s 'dd if=/dev/fb0 of=/data/_m22.raw bs=691200 count=1 2>/dev/null' >/dev/null local name="${1:-m22_shot}" sbg 'cat /data/_m22.raw' "$name" local sz=$(stat -c%s "$ROOT/device_test/$name.raw") if [ "$sz" = "691200" ]; then python3 "$ROOT/device_test/fb2png.py" "$ROOT/device_test/$name.raw" "$ROOT/device_test/$name.png" >/dev/null 2>&1 python3 "$ROOT/device_test/ascii_fb.py" "$ROOT/device_test/$name.raw" 96 40 > "$ROOT/device_test/$name.txt" echo "saved device_test/$name.png/.txt (raw $sz)" else echo "!! unexpected raw size $sz (期望 691200); 可能 fb0 非 RGB565 或 dd 失败" fi } echo "==> 连接 $DEV ..." s 'echo OK' >/dev/null || { echo "!! SSH 失败(设备可能在 MeowOS 未联网,或未开机)"; exit 1; } echo "==> 红线:清 /data/recovery_all" s 'rm -f /data/recovery_all; ls /data/recovery_all 2>/dev/null && echo FLAG || echo no_flag' echo "==> 当前播放器状态(MeowOS 模式应无)" s 'pidof hiby_player && echo PLAYER_ALIVE || echo NO_PLAYER' PLAYER_PID=$(s 'pidof hiby_player' | tr -d ' ') echo "==> 推送新 launcher 到 /data(不覆盖系统二进制)" $SCP "$LAUNCHER" root@"$DEV":/data/meow_launcherd_m22 s 'chmod 755 /data/meow_launcherd_m22; md5sum /data/meow_launcherd_m22' if [ -n "$PLAYER_PID" ]; then echo "==> 有播放器在跑(HibyOS 覆盖语境)。若要测 MeowOS 常驻需先杀之(已知 pid SIGTERM):" echo " 请确认后手动:$SSH root@$DEV 'kill $PLAYER_PID; sleep 2; pidof hiby_player || echo DEAD'" echo " (本脚本不代杀,避免误触 watchodog;走 MeowOS 启动路径最干净)" exit 2 fi echo "==> 前端后台拉起新 launcher(MeowOS 常驻): " echo " --sim-exit-tap 6000 —— 6s 点 BACK TO PLAYER 行(应 toast「REBOOT TO RETURN TO PLAYER」并留下)" s 'rm -f /tmp/meow_boot.log; kill $(cat /usr/data/meow_launcherd.pid 2>/dev/null) 2>/dev/null; \ nohup /data/meow_launcherd_m22 --sim-exit-tap 6000 >/tmp/meow_boot.log 2>&1 & echo "launcher pid $!"' sleep 3 shot m22_start # 现象3:启动即应用列表(非死帧) sleep 3 shot m22_back_toast # 现象1:BACK TO PLAYER toast echo "==> 日志(确认不备份/不冻结/不恢复死帧 + 挂卡/联网拔营)" s 'grep -E "meow mode|sd_0 mounted|wifi not up|menu close|BACK TO PLAYER|card ready" /tmp/meow_boot.log | head -30' echo "==> 清理:SIGTERM 已知 pid,结束恢复干净" LPID=$(s 'cat /usr/data/meow_launcherd.pid 2>/dev/null') [ -n "$LPID" ] && s "kill $LPID 2>/dev/null" || true s 'sleep 1; kill $(pidof meow_launcherd_m22) 2>/dev/null; rm -f /data/_m22.raw /data/recovery_all; \ grep sd_0 /proc/mounts >/dev/null && echo SD_STILL_MOUNTED || echo SD_UMOUNTED; echo done' echo "==> 完成。物理交互(热键开关/触摸/按键/音频)留用户真机确认。"