_adb.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. # Copyright 2016 Google Inc.
  2. #
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. from __future__ import print_function
  6. import re
  7. import time
  8. import subprocess
  9. import sys
  10. class Adb:
  11. def __init__(self, device_serial=None, adb_binary=None, echo=False):
  12. self.__invocation = [adb_binary]
  13. if device_serial:
  14. self.__invocation.extend(['-s', device_serial])
  15. self.__echo = echo
  16. self.__is_root = None
  17. def shell(self, cmd):
  18. if self.__echo:
  19. self.__echo_shell_cmd(cmd)
  20. self.__invoke('shell', cmd)
  21. def check(self, cmd):
  22. if self.__echo:
  23. self.__echo_shell_cmd(cmd)
  24. result = subprocess.check_output(self.__invocation + ['shell', cmd])
  25. if self.__echo:
  26. print(result, file=sys.stderr)
  27. return result
  28. def root(self):
  29. if not self.is_root():
  30. self.__invoke('root')
  31. self.__invoke('wait-for-device')
  32. self.__is_root = None
  33. return self.is_root()
  34. def is_root(self):
  35. if self.__is_root is None:
  36. self.__is_root = ('root' == self.check('whoami').strip())
  37. return self.__is_root
  38. def remount(self):
  39. self.__invoke('remount')
  40. def reboot(self):
  41. self.__is_root = None
  42. self.shell('reboot')
  43. self.__invoke('wait-for-device')
  44. while '1' != self.check('getprop sys.boot_completed').strip():
  45. time.sleep(1)
  46. def __echo_shell_cmd(self, cmd):
  47. escaped = [re.sub(r'([^a-zA-Z0-9])', r'\\\1', x)
  48. for x in cmd.strip().splitlines()]
  49. self.__invoke('shell', 'echo', '$(whoami)@$(getprop ro.serialno)$',
  50. " '\n>' ".join(escaped))
  51. def __invoke(self, *args):
  52. subprocess.call(self.__invocation + list(args), stdout=sys.stderr)