def init_devicd(): # process = os.popen("adb connect 127.0.0.1:62001") # process.read() # process.close() for d in adb.device_list(): print(d.serial) deviceId = adb.device_list()[0].serial d = u2.connect('192.168.56.103:5555') d.screen_on() return d
def switch_to_tcpip(port: int = 5555): logger.info("Checking for connected devices") try: output = execute_adb(["wait-for-local-device"], timeout=1) logger.info("[ADB] %s", output) network_device = next(filter(lambda d: ":" in d.serial, adb.device_list())) if network_device is not None: logger.info("Found connected device: %s", network_device) return network_device except subprocess.TimeoutExpired: logger.warning("No networked device found.") pass logger.info("Switching to tcpip for USB connected device") logger.info("Waiting for device") output = execute_adb(["wait-for-usb-device"]) logger.info("[ADB] %s", output) ip = adb.device().wlan_ip() logger.info(f"Trying to connect to {ip}:{port}") output = execute_adb(["-d", "tcpip", f"{port}"]) logger.info("[ADB] %s", output) try: output = execute_adb(["disconnect", f"{ip}:{port}"]) except subprocess.CalledProcessError as e: logger.warning("[ADB] %s", e) logger.info("[ADB] %s", output) output = adb.connect(f"{ip}:{port}") logger.info("[ADB] %s", output) output = execute_adb(["wait-for-local-device"]) logger.info("[ADB] %s", output) logger.info("Please remove the USB device") return adb.device(f"{ip}:{port}")
def download(): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ download click """ d.click(250, 1680)
def share(): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ share click """ d.click(980, 1440)
def reset(): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ reset click """ d.click(270, 300)
def bingo(): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ select click """ d.click(150, 250)
def select_first(): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ select first video click """ d.click(250, 600)
def search(): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ search click """ d.click(1000, 100)
def uninstall(pkg_name: str = None): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ Example: pkg_name: com.ss.android.ugc.aweme """ d.uninstall(pkg_name)
def install(pkg_path: str = None): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ Example: pkg_path: C:/Users/huhai/Downloads/aweme_aweGW_v1015_130401_becf_1604488554.apk """ d.install(pkg_path, True)
def __init__(self): # 设备列表 self.__unused_devices = adb.device_list() #type: List[AdbDevice] # 设备总数 self.__devices_total = len(self.__unused_devices) # type: int # 空闲设备队列 self.__unused_queue = self.__init_queue() # type: Queue # 已使用的设备 self.__used_devices = {} # type: Dict[str, AdbDevice]
def stop(pkg_name: str = 'com.ss.android.ugc.aweme'): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ Example: pkg_name: com.ss.android.ugc.aweme """ d.app_stop(pkg_name)
def start(pkg_name: str = 'com.ss.android.ugc.aweme', activity: str = '.main.MainActivity'): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ Example: pkg_name: com.ss.android.ugc.aweme activity: .main.MainActivity """ d.app_start(pkg_name, activity)
def input_text(key: str = 'faded'): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ Example: search key: faded """ print('execute formally', key) charsb64 = str(base64.b64encode(key.encode('utf-8')))[1:] d.shell("am broadcast -a ADB_INPUT_B64 --es msg %s" % charsb64)
def swipe(sx: int, sy: int, dx: int, dy: int, duration: float): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ swipe from start point to end point Args: sx, sy: start point(x, y) dx, dy: end point(x, y) Example: For 540 × 960, (sx, sy) = (200, 600) (dx, dy) = (200, 200) """ d.swipe(sx, sy, dx, dy, duration)
def pull(): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] """ Pull file from device:src to local:dst Returns: file size """ files = d.sync.list(src_dir) files = list(filter(lambda x: x.name.find("mp4") != -1, files)) name = files[0].name src = src_dir + name print(src) dest = dest_dir + name size = d.sync.pull(src, dest) print("pull size", size) return name, "mp4", dest, size, src
def execute(key: str = None): adb.connect(remote_addr) ds = adb.device_list() d = ds[0] print('search......') search() time.sleep(2) print('input......') input_text(key) time.sleep(2) bingo() select_video() time.sleep(2) select_first() time.sleep(2) n = 0 try: while n < 20: share() time.sleep(2) download() time.sleep(10) files = d.sync.list(src_dir) files = list(filter(lambda x: x.name.find("mp4") != -1, files)) print(len(files)) if len(files): name, format, storage_path, size, src = pull() d.remove(src) id = repo.storage(name, format, storage_path, size) c.notify(id, key, storage_path) time.sleep(3) else: reset() swipe(200, 1400, 200, 500, 0.5) n = n + 1 time.sleep(2) except KeyboardInterrupt: adb.run('kill-server')
{Fore.MAGENTA}├help {Fore.MAGENTA}└exit {Fore.WHITE}Built with {Fore.LIGHTGREEN_EX}\U0001F40D{Fore.WHITE} and https://github.com/openatx/adbutils {random.choice(tips)} """) while True: print(rainbowtext.text(f"""{os.getlogin()}# """), end='') cmd = input() if cmd == "connect": try: device = adb.device() os.system('cls || clear') for d in adb.device_list(): print( rainbowtext.text(f""" Connected! Serial key: {device.serial} Operating system: {device.prop.name} Device: {device.prop.device} Model: {device.prop.model} """)) except: print("No device(s) connected!") elif cmd == "recovery": try: print( Fore.MAGENTA +
def main(): parser = argparse.ArgumentParser() # formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("-s", "--serial", help="device serial number") parser.add_argument("-V", "--server-version", action="store_true", help="show adb server version") parser.add_argument("-l", "--list", action="store_true", help="list devices") parser.add_argument("-i", "--install", help="install from local apk or url") parser.add_argument( "--install-confirm", action="store_true", help="auto confirm when install (based on uiautomator2)") parser.add_argument("-u", "--uninstall", help="uninstall apk") parser.add_argument("-L", "--launch", action="store_true", help="launch after install") parser.add_argument("--qrcode", help="show qrcode of the specified file") parser.add_argument("--clear", action="store_true", help="clear all data when uninstall") parser.add_argument("--list-packages", action="store_true", help="list packages installed") parser.add_argument("-p", "--package", help="show package info in json format") parser.add_argument("--grep", help="filter matched package names") parser.add_argument("--connect", type=str, help="connect remote device") parser.add_argument("--shell", action="store_true", help="run shell command") parser.add_argument("--minicap", action="store_true", help="install minicap and minitouch to device") parser.add_argument("--screenshot", type=str, help="take screenshot") parser.add_argument("-b", "--browser", help="open browser in device") parser.add_argument( "--push", help= "push local to remote, arg is colon seperated, eg some.txt:/sdcard/s.txt" ) parser.add_argument( "--pull", help="push local to remote, arg is colon seperated, eg /sdcard/some.txt" ) parser.add_argument("--dump-info", action="store_true", help="dump info for developer") parser.add_argument("--track", action="store_true", help="trace device status") parser.add_argument("args", nargs="*", help="arguments") args = parser.parse_args() if args.connect: adbclient.connect(args.connect) return if args.server_version: print("ADB Server version: {}".format(adbclient.server_version())) return if args.list: rows = [] for d in adbclient.device_list(): rows.append([d.serial, d.shell("getprop ro.product.model")]) lens = [] for col in zip(*rows): lens.append(max([len(v) for v in col])) format = " ".join(["{:<" + str(l) + "}" for l in lens]) for row in rows: print(format.format(*row)) return if args.qrcode: from http.server import ThreadingHTTPServer from http.server import SimpleHTTPRequestHandler filename = args.qrcode port = 8000 url = "http://%s:%d/%s" % (current_ip(), port, filename) print("File URL:", url) try: import qrcode qr = qrcode.QRCode(border=2) qr.add_data(url) qr.print_ascii(tty=True) except ImportError: print( "In order to show QRCode, you need install with: pip3 install qrcode" ) httpd = ThreadingHTTPServer(('', port), SimpleHTTPRequestHandler) httpd.serve_forever() return if args.dump_info: print("==== ADB Info ====") print("Path:", adbutils.adb_path()) print("Server version:", adbclient.server_version()) print("") print(">> List of devices attached") for d in adbclient.device_list(): print("-", d.serial, d.prop.name, d.prop.model) return if args.track: for event in adbclient.track_devices(): asctime = datetime.datetime.now().strftime("%H:%M:%S.%f") print("{} {} -> {}".format(asctime[:-3], event.serial, event.status)) return ## Device operation d = adbclient.device(args.serial) if args.shell: output = d.shell(args.args) print(output) return if args.install: if re.match(r"^https?://", args.install): resp = requests.get(args.install, stream=True) resp.raise_for_status() length = int(resp.headers.get("Content-Length", 0)) r = ReadProgress(resp.raw, length) print("tmpfile path:", r.filepath()) else: length = os.stat(args.install).st_size fd = open(args.install, "rb") r = ReadProgress(fd, length, source_path=args.install) dst = "/data/local/tmp/tmp-%d.apk" % (int(time.time() * 1000)) print("push to %s" % dst) start = time.time() d.sync.push(r, dst) # parse apk package-name apk = apkutils2.APK(r.filepath()) package_name = apk.manifest.package_name main_activity = apk.manifest.main_activity version_name = apk.manifest.version_name print("packageName:", package_name) print("mainActivity:", main_activity) print("apkVersion: {}".format(version_name)) print("success pushed, time used %d seconds" % (time.time() - start)) new_dst = "/data/local/tmp/{}-{}.apk".format(package_name, version_name) d.shell(["mv", dst, new_dst]) dst = new_dst info = d.sync.stat(dst) print("verify pushed apk, md5: %s, size: %s" % (r._hash, humanize(info.size))) assert info.size == r.copied print("install to android system ...") if args.install_confirm: # Beta import uiautomator2 as u2 ud = u2.connect(args.serial) ud.press("home") ud.watcher.when("继续安装").click() ud.watcher.when("允许").click() ud.watcher.when("安装").click() ud.watcher.start(2.0) try: start = time.time() d.install_remote(dst, clean=True) print("Success installed, time used %d seconds" % (time.time() - start)) if args.launch: print("Launch app: %s/%s" % (package_name, main_activity)) d.shell( ['am', 'start', '-n', package_name + "/" + main_activity]) except AdbInstallError as e: if e.reason in [ "INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE", "INSTALL_FAILED_UPDATE_INCOMPATIBLE", "INSTALL_FAILED_VERSION_DOWNGRADE" ]: print("uninstall %s because %s" % (package_name, e.reason)) d.uninstall(package_name) d.install_remote(dst, clean=True) print("Success installed, time used %d seconds" % (time.time() - start)) elif e.reason == "INSTALL_FAILED_CANCELLED_BY_USER": print("Catch error %s, reinstall" % e.reason) d.install_remote(dst, clean=True) print("Success installed, time used %d seconds" % (time.time() - start)) else: sys.exit( "Failure " + e.reason + "\n" + "Remote apk is not removed. Manually install command:\n\t" + "adb shell pm install -r -t " + dst) elif args.uninstall: d.shell(["pm", "uninstall", args.uninstall]) elif args.list_packages: patten = re.compile(args.grep or ".*") for p in d.list_packages(): if patten.search(p): print(p) elif args.screenshot: if args.minicap: def adb_shell(cmd: list): print("Run:", " ".join(["adb", "shell"] + cmd)) return d.shell(cmd).strip() json_output = adb_shell([ "LD_LIBRARY_PATH=/data/local/tmp", "/data/local/tmp/minicap", "-i", "2&>/dev/null" ]) if not json_output.startswith("{"): raise RuntimeError("Invalid json format", json_output) data = json.loads(json_output) w, h, r = data["width"], data["height"], data["rotation"] d.shell([ "LD_LIBRARY_PATH=/data/local/tmp", "/data/local/tmp/minicap", "-P", "{0}x{1}@{0}x{1}/{2}".format(w, h, r), "-s", ">/sdcard/minicap.jpg" ]) d.sync.pull("/sdcard/minicap.jpg", args.screenshot) else: remote_tmp_path = "/data/local/tmp/screenshot.png" d.shell(["rm", remote_tmp_path]) d.shell(["screencap", "-p", remote_tmp_path]) d.sync.pull(remote_tmp_path, args.screenshot) elif args.minicap: # without args.screenshot _setup_minicap(d) elif args.push: local, remote = args.push.split(":", 1) length = os.stat(local).st_size with open(local, "rb") as fd: r = ReadProgress(fd, length) d.sync.push(r, remote, filesize=length) elif args.pull: remote_path = args.pull target_path = os.path.basename(remote_path) finfo = d.sync.stat(args.pull) if finfo.mode == 0 and finfo.size == 0: sys.exit(f"remote file '{remote_path}' does not exist") bytes_so_far = 0 for chunk in d.sync.iter_content(remote_path): bytes_so_far += len(chunk) percent = bytes_so_far / finfo.size * 100 if finfo.size != 0 else 100.0 print( f"\rDownload to {target_path} ... [{bytes_so_far} / {finfo.size}] %.1f %%" % percent, end="", flush=True) print(f"{remote_path} pulled to {target_path}") elif args.browser: d.open_browser(args.browser) elif args.package: info = d.package_info(args.package) print(json.dumps(info, indent=4))
def main(): parser = argparse.ArgumentParser() # formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("-s", "--serial", help="device serial number") parser.add_argument("-V", "--server-version", action="store_true", help="show adb server version") parser.add_argument("-l", "--list", action="store_true", help="list devices") parser.add_argument("-i", "--install", help="install from local apk or url") parser.add_argument( "--install-confirm", action="store_true", help="auto confirm when install (based on uiautomator2)") parser.add_argument("-u", "--uninstall", help="uninstall apk") parser.add_argument("-L", "--launch", action="store_true", help="launch after install") parser.add_argument("--qrcode", help="show qrcode of the specified file") parser.add_argument("--clear", action="store_true", help="clear all data when uninstall") parser.add_argument("--list-packages", action="store_true", help="list packages installed") parser.add_argument("--current", action="store_true", help="show current package info") parser.add_argument("-p", "--package", help="show package info in json format") parser.add_argument("--grep", help="filter matched package names") parser.add_argument("--connect", type=str, help="connect remote device") parser.add_argument("--shell", action="store_true", help="run shell command") parser.add_argument("--minicap", action="store_true", help="install minicap and minitouch to device") parser.add_argument("--screenshot", type=str, help="take screenshot") parser.add_argument("-b", "--browser", help="open browser in device") parser.add_argument( "--push", help= "push local to remote, arg is colon seperated, eg some.txt:/sdcard/s.txt" ) parser.add_argument( "--pull", help="push local to remote, arg is colon seperated, eg /sdcard/some.txt" ) parser.add_argument("--dump-info", action="store_true", help="dump info for developer") parser.add_argument("--track", action="store_true", help="trace device status") parser.add_argument("args", nargs="*", help="arguments") args = parser.parse_args() if args.connect: adbclient.connect(args.connect) return if args.server_version: print("ADB Server version: {}".format(adbclient.server_version())) return if args.list: rows = [] for d in adbclient.device_list(): rows.append([d.serial, d.shell("getprop ro.product.model")]) lens = [] for col in zip(*rows): lens.append(max([len(v) for v in col])) format = " ".join(["{:<" + str(l) + "}" for l in lens]) for row in rows: print(format.format(*row)) return if args.qrcode: from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer filename = args.qrcode port = 8000 url = "http://%s:%d/%s" % (current_ip(), port, filename) print("File URL:", url) try: import qrcode qr = qrcode.QRCode(border=2) qr.add_data(url) qr.print_ascii(tty=True) except ImportError: print( "In order to show QRCode, you need install with: pip3 install qrcode" ) httpd = ThreadingHTTPServer(('', port), SimpleHTTPRequestHandler) httpd.serve_forever() return if args.dump_info: print("==== ADB Info ====") print("Path:", adbutils.adb_path()) print("Server version:", adbclient.server_version()) print("") print(">> List of devices attached") for d in adbclient.device_list(): print("-", d.serial, d.prop.name, d.prop.model) return if args.track: for event in adbclient.track_devices(): asctime = datetime.datetime.now().strftime("%H:%M:%S.%f") print("{} {} -> {}".format(asctime[:-3], event.serial, event.status)) return ## Device operation d = adbclient.device(args.serial) if args.shell: output = d.shell(args.args) print(output) return if args.install: def _callback(event_name: str, ud): name = "_INSTALL_" if event_name == "BEFORE_INSTALL": print("== Enable popup window watcher") ud.press("home") ud.watcher(name).when("允许").click() ud.watcher(name).when("继续安装").click() ud.watcher(name).when("安装").click() ud.watcher.start() elif event_name == "FINALLY": print("== Stop popup window watcher") ud.watcher.remove(name) ud.watcher.stop() if args.install_confirm: import uiautomator2 as u2 ud = u2.connect(args.serial) _callback = functools.partial(_callback, ud=ud) else: _callback = None d.install(args.install, uninstall=True, callback=_callback) elif args.uninstall: d.uninstall(args.uninstall) elif args.list_packages: patten = re.compile(args.grep or ".*") for p in d.list_packages(): if patten.search(p): print(p) elif args.screenshot: if args.minicap: def adb_shell(cmd: list): print("Run:", " ".join(["adb", "shell"] + cmd)) return d.shell(cmd).strip() json_output = adb_shell([ "LD_LIBRARY_PATH=/data/local/tmp", "/data/local/tmp/minicap", "-i", "2&>/dev/null" ]) if not json_output.startswith("{"): raise RuntimeError("Invalid json format", json_output) data = json.loads(json_output) w, h, r = data["width"], data["height"], data["rotation"] d.shell([ "LD_LIBRARY_PATH=/data/local/tmp", "/data/local/tmp/minicap", "-P", "{0}x{1}@{0}x{1}/{2}".format(w, h, r), "-s", ">/sdcard/minicap.jpg" ]) d.sync.pull("/sdcard/minicap.jpg", args.screenshot) else: remote_tmp_path = "/data/local/tmp/screenshot.png" d.shell(["rm", remote_tmp_path]) d.shell(["screencap", "-p", remote_tmp_path]) d.sync.pull(remote_tmp_path, args.screenshot) elif args.minicap: # without args.screenshot _setup_minicap(d) elif args.push: local, remote = args.push.split(":", 1) length = os.stat(local).st_size with open(local, "rb") as fd: r = ReadProgress(fd, length) d.sync.push(r, remote, filesize=length) elif args.pull: remote_path = args.pull target_path = os.path.basename(remote_path) finfo = d.sync.stat(args.pull) if finfo.mode == 0 and finfo.size == 0: sys.exit(f"remote file '{remote_path}' does not exist") bytes_so_far = 0 for chunk in d.sync.iter_content(remote_path): bytes_so_far += len(chunk) percent = bytes_so_far / finfo.size * 100 if finfo.size != 0 else 100.0 print( f"\rDownload to {target_path} ... [{bytes_so_far} / {finfo.size}] %.1f %%" % percent, end="", flush=True) print(f"{remote_path} pulled to {target_path}") elif args.browser: d.open_browser(args.browser) elif args.current: package_name = d.current_app()['package'] info = d.package_info(package_name) print(json.dumps(info, indent=4, default=str)) elif args.package: info = d.package_info(args.package) print(json.dumps(info, indent=4, default=str))