1*d57664e9SAndroid Build Coastguard Workerimport subprocess 2*d57664e9SAndroid Build Coastguard Workerimport re 3*d57664e9SAndroid Build Coastguard Workerimport threading 4*d57664e9SAndroid Build Coastguard Worker 5*d57664e9SAndroid Build Coastguard WorkerATRACE_PATH="/android/catapult/systrace/systrace/systrace.py" 6*d57664e9SAndroid Build Coastguard Worker 7*d57664e9SAndroid Build Coastguard Workerclass AdbError(RuntimeError): 8*d57664e9SAndroid Build Coastguard Worker def __init__(self, arg): 9*d57664e9SAndroid Build Coastguard Worker self.args = arg 10*d57664e9SAndroid Build Coastguard Worker 11*d57664e9SAndroid Build Coastguard Workerdef am(serial, cmd, args): 12*d57664e9SAndroid Build Coastguard Worker if not isinstance(args, list): 13*d57664e9SAndroid Build Coastguard Worker args = [args] 14*d57664e9SAndroid Build Coastguard Worker full_args = ["am"] + [cmd] + args 15*d57664e9SAndroid Build Coastguard Worker __call_adb(serial, full_args, False) 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Workerdef pm(serial, cmd, args): 18*d57664e9SAndroid Build Coastguard Worker if not isinstance(args, list): 19*d57664e9SAndroid Build Coastguard Worker args = [args] 20*d57664e9SAndroid Build Coastguard Worker full_args = ["pm"] + [cmd] + args 21*d57664e9SAndroid Build Coastguard Worker __call_adb(serial, full_args, False) 22*d57664e9SAndroid Build Coastguard Worker 23*d57664e9SAndroid Build Coastguard Workerdef dumpsys(serial, topic): 24*d57664e9SAndroid Build Coastguard Worker return __call_adb(serial, ["dumpsys"] + [topic], True) 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Workerdef trace(serial, 27*d57664e9SAndroid Build Coastguard Worker tags = ["gfx", "sched", "view", "freq", "am", "wm", "power", "load", "memreclaim"], 28*d57664e9SAndroid Build Coastguard Worker time = "10"): 29*d57664e9SAndroid Build Coastguard Worker args = [ATRACE_PATH, "-e", serial, "-t" + time, "-b32768"] + tags 30*d57664e9SAndroid Build Coastguard Worker subprocess.call(args) 31*d57664e9SAndroid Build Coastguard Worker 32*d57664e9SAndroid Build Coastguard Workerdef wake(serial): 33*d57664e9SAndroid Build Coastguard Worker output = dumpsys(serial, "power") 34*d57664e9SAndroid Build Coastguard Worker wakefulness = re.search('mWakefulness=([a-zA-Z]+)', output) 35*d57664e9SAndroid Build Coastguard Worker if wakefulness.group(1) != "Awake": 36*d57664e9SAndroid Build Coastguard Worker __call_adb(serial, ["input", "keyevent", "KEYCODE_POWER"], False) 37*d57664e9SAndroid Build Coastguard Worker 38*d57664e9SAndroid Build Coastguard Workerdef root(serial): 39*d57664e9SAndroid Build Coastguard Worker subprocess.call(["adb", "-s", serial, "root"]) 40*d57664e9SAndroid Build Coastguard Worker 41*d57664e9SAndroid Build Coastguard Workerdef pull(serial, path, dest): 42*d57664e9SAndroid Build Coastguard Worker subprocess.call(["adb", "-s", serial, "wait-for-device", "pull"] + [path] + [dest]) 43*d57664e9SAndroid Build Coastguard Worker 44*d57664e9SAndroid Build Coastguard Workerdef shell(serial, cmd): 45*d57664e9SAndroid Build Coastguard Worker __call_adb(serial, cmd, False) 46*d57664e9SAndroid Build Coastguard Worker 47*d57664e9SAndroid Build Coastguard Workerdef track_logcat(serial, awaited_string, callback): 48*d57664e9SAndroid Build Coastguard Worker threading.Thread(target=__track_logcat, name=serial + "-waiter", args=(serial, awaited_string, callback)).start() 49*d57664e9SAndroid Build Coastguard Worker 50*d57664e9SAndroid Build Coastguard Workerdef __call_adb(serial, args, block): 51*d57664e9SAndroid Build Coastguard Worker full_args = ["adb", "-s", serial, "wait-for-device", "shell"] + args 52*d57664e9SAndroid Build Coastguard Worker print full_args 53*d57664e9SAndroid Build Coastguard Worker output = None 54*d57664e9SAndroid Build Coastguard Worker try: 55*d57664e9SAndroid Build Coastguard Worker if block: 56*d57664e9SAndroid Build Coastguard Worker output = subprocess.check_output(full_args) 57*d57664e9SAndroid Build Coastguard Worker else: 58*d57664e9SAndroid Build Coastguard Worker subprocess.call(full_args) 59*d57664e9SAndroid Build Coastguard Worker except subprocess.CalledProcessError: 60*d57664e9SAndroid Build Coastguard Worker raise AdbError("Error calling " + " ".join(args)) 61*d57664e9SAndroid Build Coastguard Worker 62*d57664e9SAndroid Build Coastguard Worker return output 63