From 210fc5bded565c196605a0b50d5a775783a5927c Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sun, 5 Jun 2022 02:15:16 +0800 Subject: [PATCH] Fix: *_nc screenshot method failed because of bugs in `adb reverse` https://issuetracker.google.com/issues/37066218 --- module/device/connection.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/module/device/connection.py b/module/device/connection.py index 675fcc79d..7997a4196 100644 --- a/module/device/connection.py +++ b/module/device/connection.py @@ -138,6 +138,9 @@ class Connection: logger.attr('PackageName', self.package) logger.attr('Server', self.config.SERVER) + self._nc_server_host = '127.0.0.1' + self._nc_server_port = self.config.REVERSE_SERVER_PORT + @staticmethod def find_bluestacks4_hyperv(serial): """ @@ -270,10 +273,11 @@ class Connection: This will bypass adb shell and be faster. """ server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self._server_port = self.adb_reverse(f'tcp:{self.config.REVERSE_SERVER_PORT}') - server.bind(('127.0.0.1', self._server_port)) + self._nc_server_host = socket.gethostbyname(socket.gethostname()) + self._nc_server_port = random_port(self.config.FORWARD_PORT_RANGE) + logger.info(f'Reverse server listening on {self._nc_server_host}:{self._nc_server_port}') + server.bind((self._nc_server_host, self._nc_server_port)) server.listen(5) - logger.info(f'Reverse server listening on {self._server_port}') return server def adb_shell_nc(self, cmd, timeout=5, chunk_size=262144): @@ -286,18 +290,19 @@ class Connection: Returns: bytes: """ - # | nc 127.0.0.1 {port} - cmd += ['|', 'nc', '127.0.0.1', self.config.REVERSE_SERVER_PORT] - # Server start listening server = self.reverse_server server.settimeout(timeout) # Client send data, waiting for server accept - _ = self.adb_shell(cmd, stream=True) + # | nc 127.0.0.1 {port} + cmd += ['|', 'nc', self._nc_server_host, self._nc_server_port] + stream = self.adb_shell(cmd, stream=True) try: # Server accept connection conn, conn_port = server.accept() except socket.timeout: + output = recv_all(stream, chunk_size=chunk_size) + logger.warning(str(output)) raise AdbTimeout('reverse server accept timeout') # Server receive data