Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Side by Side Diff: build/android/pylib/android_commands.py

Issue 16360003: Android: allows using adb from a chromium checkout without envsetup.sh (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: inline constant Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « build/android/pylib/__init__.py ('k') | build/android/pylib/constants.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Provides an interface to communicate with the device via the adb command. 5 """Provides an interface to communicate with the device via the adb command.
6 6
7 Assumes adb binary is currently on system path. 7 Assumes adb binary is currently on system path.
8 """ 8 """
9 9
10 import collections 10 import collections
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 Both devices starting with 'emulator' will be returned in below output: 71 Both devices starting with 'emulator' will be returned in below output:
72 72
73 * daemon not running. starting it now on port 5037 * 73 * daemon not running. starting it now on port 5037 *
74 * daemon started successfully * 74 * daemon started successfully *
75 List of devices attached 75 List of devices attached
76 027c10494100b4d7 device 76 027c10494100b4d7 device
77 emulator-5554 offline 77 emulator-5554 offline
78 emulator-5558 device 78 emulator-5558 device
79 """ 79 """
80 re_device = re.compile('^emulator-[0-9]+', re.MULTILINE) 80 re_device = re.compile('^emulator-[0-9]+', re.MULTILINE)
81 devices = re_device.findall(cmd_helper.GetCmdOutput(['adb', 'devices'])) 81 devices = re_device.findall(cmd_helper.GetCmdOutput([constants.ADB_PATH,
82 'devices']))
82 return devices 83 return devices
83 84
84 85
85 def GetAVDs(): 86 def GetAVDs():
86 """Returns a list of AVDs.""" 87 """Returns a list of AVDs."""
87 re_avd = re.compile('^[ ]+Name: ([a-zA-Z0-9_:.-]+)', re.MULTILINE) 88 re_avd = re.compile('^[ ]+Name: ([a-zA-Z0-9_:.-]+)', re.MULTILINE)
88 avds = re_avd.findall(cmd_helper.GetCmdOutput(['android', 'list', 'avd'])) 89 avds = re_avd.findall(cmd_helper.GetCmdOutput(['android', 'list', 'avd']))
89 return avds 90 return avds
90 91
91 92
92 def GetAttachedDevices(): 93 def GetAttachedDevices():
93 """Returns a list of attached, online android devices. 94 """Returns a list of attached, online android devices.
94 95
95 If a preferred device has been set with ANDROID_SERIAL, it will be first in 96 If a preferred device has been set with ANDROID_SERIAL, it will be first in
96 the returned list. 97 the returned list.
97 98
98 Example output: 99 Example output:
99 100
100 * daemon not running. starting it now on port 5037 * 101 * daemon not running. starting it now on port 5037 *
101 * daemon started successfully * 102 * daemon started successfully *
102 List of devices attached 103 List of devices attached
103 027c10494100b4d7 device 104 027c10494100b4d7 device
104 emulator-5554 offline 105 emulator-5554 offline
105 """ 106 """
106 re_device = re.compile('^([a-zA-Z0-9_:.-]+)\tdevice$', re.MULTILINE) 107 re_device = re.compile('^([a-zA-Z0-9_:.-]+)\tdevice$', re.MULTILINE)
107 devices = re_device.findall(cmd_helper.GetCmdOutput(['adb', 'devices'])) 108 devices = re_device.findall(cmd_helper.GetCmdOutput([constants.ADB_PATH,
109 'devices']))
108 preferred_device = os.environ.get('ANDROID_SERIAL') 110 preferred_device = os.environ.get('ANDROID_SERIAL')
109 if preferred_device in devices: 111 if preferred_device in devices:
110 devices.remove(preferred_device) 112 devices.remove(preferred_device)
111 devices.insert(0, preferred_device) 113 devices.insert(0, preferred_device)
112 return devices 114 return devices
113 115
114 116
115 def IsDeviceAttached(device): 117 def IsDeviceAttached(device):
116 return device in GetAttachedDevices() 118 return device in GetAttachedDevices()
117 119
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 200
199 class AndroidCommands(object): 201 class AndroidCommands(object):
200 """Helper class for communicating with Android device via adb. 202 """Helper class for communicating with Android device via adb.
201 203
202 Args: 204 Args:
203 device: If given, adb commands are only send to the device of this ID. 205 device: If given, adb commands are only send to the device of this ID.
204 Otherwise commands are sent to all attached devices. 206 Otherwise commands are sent to all attached devices.
205 """ 207 """
206 208
207 def __init__(self, device=None): 209 def __init__(self, device=None):
210 adb_dir = os.path.dirname(constants.ADB_PATH)
211 if adb_dir and adb_dir not in os.environ['PATH'].split(os.pathsep):
212 # Required by third_party/android_testrunner to call directly 'adb'.
213 os.environ['PATH'] += os.pathsep + adb_dir
208 self._adb = adb_interface.AdbInterface() 214 self._adb = adb_interface.AdbInterface()
209 if device: 215 if device:
210 self._adb.SetTargetSerial(device) 216 self._adb.SetTargetSerial(device)
211 self._device = device 217 self._device = device
212 self._logcat = None 218 self._logcat = None
213 self.logcat_process = None 219 self.logcat_process = None
214 self._logcat_tmpoutfile = None 220 self._logcat_tmpoutfile = None
215 self._pushed_files = [] 221 self._pushed_files = []
216 self._device_utc_offset = self.RunShellCommand('date +%z')[0] 222 self._device_utc_offset = self.RunShellCommand('date +%z')[0]
217 self._md5sum_build_dir = '' 223 self._md5sum_build_dir = ''
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 if out.strip() != 'remount succeeded': 408 if out.strip() != 'remount succeeded':
403 raise errors.MsgException('Remount failed: %s' % out) 409 raise errors.MsgException('Remount failed: %s' % out)
404 410
405 def RestartAdbServer(self): 411 def RestartAdbServer(self):
406 """Restart the adb server.""" 412 """Restart the adb server."""
407 self.KillAdbServer() 413 self.KillAdbServer()
408 self.StartAdbServer() 414 self.StartAdbServer()
409 415
410 def KillAdbServer(self): 416 def KillAdbServer(self):
411 """Kill adb server.""" 417 """Kill adb server."""
412 adb_cmd = ['adb', 'kill-server'] 418 adb_cmd = [constants.ADB_PATH, 'kill-server']
413 return cmd_helper.RunCmd(adb_cmd) 419 return cmd_helper.RunCmd(adb_cmd)
414 420
415 def StartAdbServer(self): 421 def StartAdbServer(self):
416 """Start adb server.""" 422 """Start adb server."""
417 adb_cmd = ['adb', 'start-server'] 423 adb_cmd = [constants.ADB_PATH, 'start-server']
418 return cmd_helper.RunCmd(adb_cmd) 424 return cmd_helper.RunCmd(adb_cmd)
419 425
420 def WaitForSystemBootCompleted(self, wait_time): 426 def WaitForSystemBootCompleted(self, wait_time):
421 """Waits for targeted system's boot_completed flag to be set. 427 """Waits for targeted system's boot_completed flag to be set.
422 428
423 Args: 429 Args:
424 wait_time: time in seconds to wait 430 wait_time: time in seconds to wait
425 431
426 Raises: 432 Raises:
427 WaitForResponseTimedOutError if wait_time elapses and flag still not 433 WaitForResponseTimedOutError if wait_time elapses and flag still not
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 if filters: 921 if filters:
916 args.extend(filters) 922 args.extend(filters)
917 else: 923 else:
918 args.append('*:v') 924 args.append('*:v')
919 925
920 if logfile: 926 if logfile:
921 logfile = NewLineNormalizer(logfile) 927 logfile = NewLineNormalizer(logfile)
922 928
923 # Spawn logcat and syncronize with it. 929 # Spawn logcat and syncronize with it.
924 for _ in range(4): 930 for _ in range(4):
925 self._logcat = pexpect.spawn('adb', args, timeout=10, logfile=logfile) 931 self._logcat = pexpect.spawn(constants.ADB_PATH, args, timeout=10,
932 logfile=logfile)
926 self.RunShellCommand('log startup_sync') 933 self.RunShellCommand('log startup_sync')
927 if self._logcat.expect(['startup_sync', pexpect.EOF, 934 if self._logcat.expect(['startup_sync', pexpect.EOF,
928 pexpect.TIMEOUT]) == 0: 935 pexpect.TIMEOUT]) == 0:
929 break 936 break
930 self._logcat.close(force=True) 937 self._logcat.close(force=True)
931 else: 938 else:
932 logging.critical('Error reading from logcat: ' + str(self._logcat.match)) 939 logging.critical('Error reading from logcat: ' + str(self._logcat.match))
933 sys.exit(1) 940 sys.exit(1)
934 941
935 def GetMonitoredLogCat(self): 942 def GetMonitoredLogCat(self):
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
984 'to debug)' % 991 'to debug)' %
985 (timeout, success_re.pattern)) 992 (timeout, success_re.pattern))
986 except pexpect.EOF: 993 except pexpect.EOF:
987 # It seems that sometimes logcat can end unexpectedly. This seems 994 # It seems that sometimes logcat can end unexpectedly. This seems
988 # to happen during Chrome startup after a reboot followed by a cache 995 # to happen during Chrome startup after a reboot followed by a cache
989 # clean. I don't understand why this happens, but this code deals with 996 # clean. I don't understand why this happens, but this code deals with
990 # getting EOF in logcat. 997 # getting EOF in logcat.
991 logging.critical('Found EOF in adb logcat. Restarting...') 998 logging.critical('Found EOF in adb logcat. Restarting...')
992 # Rerun spawn with original arguments. Note that self._logcat.args[0] is 999 # Rerun spawn with original arguments. Note that self._logcat.args[0] is
993 # the path of adb, so we don't want it in the arguments. 1000 # the path of adb, so we don't want it in the arguments.
994 self._logcat = pexpect.spawn('adb', 1001 self._logcat = pexpect.spawn(constants.ADB_PATH,
995 self._logcat.args[1:], 1002 self._logcat.args[1:],
996 timeout=self._logcat.timeout, 1003 timeout=self._logcat.timeout,
997 logfile=self._logcat.logfile) 1004 logfile=self._logcat.logfile)
998 1005
999 def StartRecordingLogcat(self, clear=True, filters=['*:v']): 1006 def StartRecordingLogcat(self, clear=True, filters=['*:v']):
1000 """Starts recording logcat output to eventually be saved as a string. 1007 """Starts recording logcat output to eventually be saved as a string.
1001 1008
1002 This call should come before some series of tests are run, with either 1009 This call should come before some series of tests are run, with either
1003 StopRecordingLogcat or SearchLogcatRecord following the tests. 1010 StopRecordingLogcat or SearchLogcatRecord following the tests.
1004 1011
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 """ 1337 """
1331 def __init__(self, output): 1338 def __init__(self, output):
1332 self._output = output 1339 self._output = output
1333 1340
1334 def write(self, data): 1341 def write(self, data):
1335 data = data.replace('\r\r\n', '\n') 1342 data = data.replace('\r\r\n', '\n')
1336 self._output.write(data) 1343 self._output.write(data)
1337 1344
1338 def flush(self): 1345 def flush(self):
1339 self._output.flush() 1346 self._output.flush()
OLDNEW
« no previous file with comments | « build/android/pylib/__init__.py ('k') | build/android/pylib/constants.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698