#!/usr/bin/env python3 """可靠主进程监控 v2: 主进程 = cmdline 精确等于包名 (排除 :sub 子进程). 事实来源: adb /proc//cmdline + pidof. 绝不使用 frida enumerate 判断存活. 用法: python3 watch_proc_v2.py [label] """ import subprocess, sys, time ADB = ["adb", "-s", "127.0.0.1:5555"] PACKAGE = "com.duowan.kiwi" def adb(*a): return subprocess.run(ADB + list(a), capture_output=True, text=True) def main_pid(): """返回主进程 pid (cmdline==PACKAGE), 无则 None.""" r = adb("shell", "pidof", PACKAGE) pids = r.stdout.strip().split() for p in pids: r2 = adb("shell", "cat", f"/proc/{p}/cmdline") cmd = r2.stdout.strip("\x00").strip() if cmd == PACKAGE: return int(p) return None def main(): seconds = int(sys.argv[1]) if len(sys.argv) > 1 else 60 label = sys.argv[2] if len(sys.argv) > 2 else "" t0 = time.time() last_alive = 0.0 died_at = None pid_history = {} print(f"[watch:{label}] {seconds}s 起点 main_pid={main_pid()}", flush=True) while time.time() - t0 < seconds: p = main_pid() now = time.time() - t0 if p is not None: pid_history.setdefault(p, now) last_alive = now died_at = None elif died_at is None: died_at = now print(f" +{now:5.1f}s DEAD (main) [存活到 +{last_alive:.1f}s]", flush=True) time.sleep(1.5) dur = time.time() - t0 p = main_pid() print(f"[watch:{label}] END: alive={p is not None} pid={p} 最后存活时间=+{last_alive:.1f}s " f"死亡时刻={round(died_at,1) if died_at else '未死'} pids_seen={list(pid_history.keys())} 总={dur:.1f}s", flush=True) if __name__ == "__main__": main()