예제 #1
0
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
예제 #2
0
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}")
예제 #3
0
def download():
    adb.connect(remote_addr)
    ds = adb.device_list()
    d = ds[0]
    """
    download click
    """
    d.click(250, 1680)
예제 #4
0
def share():
    adb.connect(remote_addr)
    ds = adb.device_list()
    d = ds[0]
    """
    share click
    """
    d.click(980, 1440)
예제 #5
0
def reset():
    adb.connect(remote_addr)
    ds = adb.device_list()
    d = ds[0]
    """
    reset click
    """
    d.click(270, 300)
예제 #6
0
def bingo():
    adb.connect(remote_addr)
    ds = adb.device_list()
    d = ds[0]
    """
    select click
    """
    d.click(150, 250)
예제 #7
0
def select_first():
    adb.connect(remote_addr)
    ds = adb.device_list()
    d = ds[0]
    """
    select first video click
    """
    d.click(250, 600)
예제 #8
0
def search():
    adb.connect(remote_addr)
    ds = adb.device_list()
    d = ds[0]
    """
    search click
    """
    d.click(1000, 100)
예제 #9
0
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)
예제 #10
0
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)
예제 #11
0
 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]
예제 #12
0
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)
예제 #13
0
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)
예제 #14
0
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)
예제 #15
0
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)
예제 #16
0
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
예제 #17
0
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')
예제 #18
0
   {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 +
예제 #19
0
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))
예제 #20
0
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))