""" 同步 rebuilt_app 到 Ubuntu,执行 scripts/ubuntu_gps_pipeline.sh(编译 + 可选 adb 安装/拉原版 APK)。 环境变量: FL_SSH_PASS;或 fl_ssh_pass.txt(单行) """ import os import subprocess import sys import paramiko from _gps_ssh_auth import ssh_password HOST = "192.168.2.179" USER = "eric" GPS_ROOT = os.path.dirname(os.path.abspath(__file__)) REBUILT = os.path.join(GPS_ROOT, "rebuilt_app") TGZ = os.path.join(GPS_ROOT, "rebuilt_sync.tgz") REMOTE_TGZ = "/home/eric/rebuilt_sync.tgz" REMOTE_PROJ = "/home/eric/codex_apk_recovery/rebuilt_app" _JADX_EXPORT = "" if os.environ.get("FL_GPS_JADX", "").strip().lower() in ("1", "true", "yes", "on"): _JADX_EXPORT = "export GPS_JADX_REFERENCE=1\n" REMOTE = f"""set -e {_JADX_EXPORT}cd /tmp rm -rf rebuilt_app tar xzf {REMOTE_TGZ} rm -rf {REMOTE_PROJ} mv rebuilt_app {REMOTE_PROJ} chmod +x {REMOTE_PROJ}/gradlew chmod +x {REMOTE_PROJ}/scripts/ubuntu_gps_pipeline.sh chmod +x {REMOTE_PROJ}/scripts/adb_device_autosetup.sh bash {REMOTE_PROJ}/scripts/ubuntu_gps_pipeline.sh """ def main(): if hasattr(sys.stdout, "reconfigure"): try: sys.stdout.reconfigure(encoding="utf-8", errors="replace") except Exception: pass password = ssh_password(GPS_ROOT) if not password: print("Set FL_SSH_PASS or create fl_ssh_pass.txt in", GPS_ROOT, file=sys.stderr) sys.exit(2) if not os.path.isdir(REBUILT): print("Missing rebuilt_app", file=sys.stderr) sys.exit(2) subprocess.run( [ "tar", "-czf", TGZ, "--exclude=rebuilt_app/.gradle", "--exclude=rebuilt_app/app/build", "--exclude=rebuilt_app/build", "--exclude=rebuilt_app/fl_xposed/build", "rebuilt_app", ], cwd=GPS_ROOT, check=True, ) t = paramiko.Transport((HOST, 22)) t.connect(username=USER, password=password) sftp = paramiko.SFTPClient.from_transport(t) sftp.put(TGZ, REMOTE_TGZ) sftp.close() client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(HOST, username=USER, password=password, timeout=45) stdin, stdout, stderr = client.exec_command(REMOTE, get_pty=True, timeout=900) for line in stdout: sys.stdout.write(line) err = stderr.read().decode() if err: sys.stderr.write(err) code = stdout.channel.recv_exit_status() client.close() t.close() sys.exit(code) if __name__ == "__main__": main()