1.9.10 将 xwwqazamx 重命名为 vhvlnqgy,Login 闪退为 vhvlnqgy.bd:16;Xposed 双包名解析并 short-circuit R/bl、拦截 bd 异常。Zygisk 扩展 non-promon SEGV pc+4 与 ABRT/TRAP 一律 pc+4,修复 Login 稳定;注册页 stack_chk abort 待续攻。
111 lines
3.1 KiB
Python
111 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Automate TNG login/register tap test and report crashes."""
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
import time
|
|
|
|
PKG = "my.com.tngdigital.ewallet"
|
|
TAGS = re.compile(
|
|
r"FATAL EXCEPTION|AndroidRuntime.*Process: " + PKG
|
|
+ r"|has died|exited due to signal|vhvlnqgy\.bd|blocked killProcess|blocked System\.exit"
|
|
+ r"|UserRegistration|UserOtp|UserLogin|Displayed.*tngdigital|ACT on(Create|Resume)"
|
|
+ r"|TngExitGuard.*ABRT|TngRoot hooked 6 vhvlnqgy\.R",
|
|
re.I,
|
|
)
|
|
|
|
TAPS = [
|
|
("register_continue", 540, 959, 8),
|
|
("maybe_otp_continue", 540, 959, 6),
|
|
("back_to_login", None, None, 2),
|
|
("login_tab", 540, 1168, 5),
|
|
]
|
|
|
|
|
|
def adb(*args, timeout=30):
|
|
cmd = ["adb"] + list(args)
|
|
r = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
|
|
out = (r.stdout or "") + (r.stderr or "")
|
|
return r.returncode, out.strip()
|
|
|
|
|
|
def pid_alive():
|
|
code, out = adb("shell", "pidof", PKG)
|
|
return code == 0 and out.strip().split()
|
|
|
|
|
|
def top_activity():
|
|
code, out = adb("shell", "dumpsys", "activity", "activities")
|
|
if code != 0:
|
|
return "?"
|
|
for line in out.splitlines():
|
|
if "topResumedActivity=" in line:
|
|
m = re.search(r"/([^/]+)$", line.strip())
|
|
if m:
|
|
return m.group(1).rstrip("}")
|
|
return line.strip()
|
|
return "?"
|
|
|
|
|
|
def logcat_since(start):
|
|
code, out = adb("shell", "logcat", "-d", "-t", start)
|
|
hits = []
|
|
if code == 0:
|
|
for line in out.splitlines():
|
|
if TAGS.search(line):
|
|
hits.append(line)
|
|
return hits
|
|
|
|
|
|
def main():
|
|
adb("logcat", "-c")
|
|
adb("shell", "am", "force-stop", PKG)
|
|
time.sleep(1)
|
|
adb("shell", "am", "start", "-n", f"{PKG}/.ui.SplashActivity")
|
|
time.sleep(12)
|
|
print("=== after cold start ===")
|
|
print("pids:", pid_alive())
|
|
print("activity:", top_activity())
|
|
|
|
# dismiss country picker if open
|
|
adb("shell", "input", "keyevent", "KEYCODE_BACK")
|
|
time.sleep(1)
|
|
|
|
results = []
|
|
for name, x, y, wait_s in TAPS:
|
|
if x is not None:
|
|
adb("shell", "input", "tap", str(x), str(y))
|
|
print(f"\n=== tap {name} ({x},{y}) ===")
|
|
else:
|
|
adb("shell", "input", "keyevent", "KEYCODE_BACK")
|
|
print(f"\n=== {name} ===")
|
|
time.sleep(wait_s)
|
|
pids = pid_alive()
|
|
act = top_activity()
|
|
crash_buf = adb("shell", "logcat", "-d", "-b", "crash", "-t", "50")[1]
|
|
fatal = [l for l in crash_buf.splitlines() if PKG in l or "vhvlnqgy" in l]
|
|
results.append((name, pids, act, fatal))
|
|
print("pids:", pids or "DEAD")
|
|
print("activity:", act)
|
|
if fatal:
|
|
print("CRASH:", fatal[-3:])
|
|
|
|
print("\n=== summary ===")
|
|
ok = True
|
|
for name, pids, act, fatal in results:
|
|
status = "OK" if pids and not fatal else "FAIL"
|
|
if status == "FAIL":
|
|
ok = False
|
|
print(f"{status} {name}: pids={pids} activity={act} crash_lines={len(fatal)}")
|
|
|
|
hits = logcat_since("2000")
|
|
print(f"\n=== key log lines ({len(hits)}) ===")
|
|
for line in hits[-40:]:
|
|
print(line)
|
|
|
|
return 0 if ok else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|