import reimport timefrom functools import wrapsfrom adbutils.errors import AdbErrorfrom module.device.connection import Connectionfrom module.device.method.utils import (PackageNotInstalled, RETRY_TRIES, handle_adb_error, handle_unknown_host_service,retry_sleep)from module.exception import RequestHumanTakeoverfrom module.logger import loggerdef retry(func):@wraps(func)def retry_wrapper(self, *args, **kwargs):"""Args:self (Adb):"""init = Nonefor _ in range(RETRY_TRIES):try:if callable(init):time.sleep(retry_sleep(_))init()return func(self, *args, **kwargs)# Can't handleexcept RequestHumanTakeover:break# When adb server was killedexcept ConnectionResetError as e:logger.error(e)def init():self.adb_reconnect()# AdbErrorexcept AdbError as e:if handle_adb_error(e):def init():self.adb_reconnect()elif handle_unknown_host_service(e):def init():self.adb_start_server()self.adb_reconnect()else:break# Package not installedexcept PackageNotInstalled as e:logger.error(e)def init():self.detect_package()# Unknown, probably a trucked imageexcept Exception as e:logger.exception(e)def init():passlogger.critical(f'Retry {func.__name__}() failed')raise RequestHumanTakeoverreturn retry_wrapperclass WSA(Connection):@retrydef app_current_wsa(self):"""Returns:str: Package name.Raises:OSError"""# try: adb shell dumpsys activity top_activityRE = re.compile(r'ACTIVITY (?P<package>[^\s]+)/(?P<activity>[^/\s]+) \w+ pid=(?P<pid>\d+)')output = self.adb_shell(['dumpsys', 'activity', 'top'])ms = _activityRE.finditer(output)ret = Nonefor m in ms:ret = m.group('package')if ret == self.package:return retif ret: # get last resultreturn retraise OSError("Couldn't get focused app")@retrydef app_start_wsa(self, package_name=None, display=0):"""Args:package_name (str):display (int):Returns:bool: If success to start"""if not package_name:package_name = self.packageself.adb_shell(['svc', 'power', 'stayon', 'true'])activity_name = self.get_main_activity_name(package_name=package_name)result = self.adb_shell(['am', 'start', '--display', display, f'{package_name}/{activity_name}'])if 'Activity not started' in result or 'does not exist' in result:# Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] pkg=xxx }# Error: Activity not started, unable to resolve Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=xxx }# Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.bilibili.azurlane/xxx }# Error type 3# Error: Activity class {com.bilibili.azurlane/com.manjuu.azurlane.MainAct} does not exist.logger.error(result)raise PackageNotInstalled(package_name)else:# Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.bilibili.azurlane/com.manjuu.azurlane.MainActivity }return True@retrydef get_main_activity_name(self, package_name=None):if not package_name:package_name = self.packagetry:output = self.adb_shell(['dumpsys', 'package', package_name])_activityRE = re.compile(r'\w+ ' + package_name + r'/(?P<activity>[^/\s]+) filter')ms = _activityRE.finditer(output)ret = next(ms).group('activity')return retexcept StopIteration:raise PackageNotInstalled(package_name)@retrydef get_display_id(self):"""Returns:0: Could not findint: Display id of the game"""try:get_dump_sys_display = str(self.adb_shell(['dumpsys', 'display']))display_id_list = re.findall(r'systemapp:' + self.package + ':' + '(.+?)', get_dump_sys_display, re.S)display_id = int(display_id_list[0])return display_idexcept IndexError:return 0 # When game running on display 0, its display id could not be found@retrydef display_resize_wsa(self, display):logger.warning('display ' + str(display) + ' should be resized')self.adb_shell(['wm', 'size', '1280x720', '-d', str(display)])
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。