| import subprocess | |
| import re | |
| import threading | |
| ATRACE_PATH="/android/catapult/systrace/systrace/systrace.py" | |
| class AdbError(RuntimeError): | |
| def __init__(self, arg): | |
| self.args = arg | |
| def am(serial, cmd, args): | |
| if not isinstance(args, list): | |
| args = [args] | |
| full_args = ["am"] + [cmd] + args | |
| __call_adb(serial, full_args, False) | |
| def pm(serial, cmd, args): | |
| if not isinstance(args, list): | |
| args = [args] | |
| full_args = ["pm"] + [cmd] + args | |
| __call_adb(serial, full_args, False) | |
| def dumpsys(serial, topic): | |
| return __call_adb(serial, ["dumpsys"] + [topic], True) | |
| def trace(serial, | |
| tags = ["gfx", "sched", "view", "freq", "am", "wm", "power", "load", "memreclaim"], | |
| time = "10"): | |
| args = [ATRACE_PATH, "-e", serial, "-t" + time, "-b32768"] + tags | |
| subprocess.call(args) | |
| def wake(serial): | |
| output = dumpsys(serial, "power") | |
| wakefulness = re.search('mWakefulness=([a-zA-Z]+)', output) | |
| if wakefulness.group(1) != "Awake": | |
| __call_adb(serial, ["input", "keyevent", "KEYCODE_POWER"], False) | |
| def root(serial): | |
| subprocess.call(["adb", "-s", serial, "root"]) | |
| def pull(serial, path, dest): | |
| subprocess.call(["adb", "-s", serial, "wait-for-device", "pull"] + [path] + [dest]) | |
| def shell(serial, cmd): | |
| __call_adb(serial, cmd, False) | |
| def track_logcat(serial, awaited_string, callback): | |
| threading.Thread(target=__track_logcat, name=serial + "-waiter", args=(serial, awaited_string, callback)).start() | |
| def __call_adb(serial, args, block): | |
| full_args = ["adb", "-s", serial, "wait-for-device", "shell"] + args | |
| print full_args | |
| output = None | |
| try: | |
| if block: | |
| output = subprocess.check_output(full_args) | |
| else: | |
| subprocess.call(full_args) | |
| except subprocess.CalledProcessError: | |
| raise AdbError("Error calling " + " ".join(args)) | |
| return output |