| 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 |