adb_wrapper.py revision 116680a4aac90f2aa7413d9095a592090648e557
1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved. 2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# found in the LICENSE file. 4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)"""This module wraps Android's adb tool. 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)This is a thin wrapper around the adb interface. Any additional complexity 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)should be delegated to a higher level (ex. DeviceUtils). 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)""" 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import errno 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import os 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)from pylib import cmd_helper 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)from pylib.device import decorators 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)from pylib.device import device_errors 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)_DEFAULT_TIMEOUT = 30 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)_DEFAULT_RETRIES = 2 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)def _VerifyLocalFileExists(path): 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Verifies a local file exists. 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) path: Path to the local file. 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Raises: 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IOError: If the file doesn't exist. 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if not os.path.exists(path): 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), path) 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class AdbWrapper(object): 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """A wrapper around a local Android Debug Bridge executable.""" 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def __init__(self, device_serial): 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Initializes the AdbWrapper. 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) device_serial: The device serial number as a string. 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._device_serial = str(device_serial) 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # pylint: disable=W0613 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @classmethod 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) @decorators.WithTimeoutAndRetries 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) def _RunAdbCmd(cls, arg_list, timeout=None, retries=None, check_error=True): 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd = ['adb'] + arg_list 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) exit_code, output = cmd_helper.GetCmdStatusAndOutput(cmd) 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if exit_code != 0: 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch raise device_errors.AdbCommandFailedError( 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmd, 'returned non-zero exit code %s, output: %s' % 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (exit_code, output)) 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # This catches some errors, including when the device drops offline; 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # unfortunately adb is very inconsistent with error reporting so many 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # command failures present differently. 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if check_error and output[:len('error:')] == 'error:': 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch raise device_errors.AdbCommandFailedError(arg_list, output) 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return output 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # pylint: enable=W0613 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def _DeviceAdbCmd(self, arg_list, timeout, retries, check_error=True): 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Runs an adb command on the device associated with this object. 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) arg_list: A list of arguments to adb. 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: Timeout in seconds. 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: Number of retries. 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) check_error: Check that the command doesn't return an error message. This 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) does NOT check the return code of shell commands. 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Returns: 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) The output of the command. 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return self._RunAdbCmd( 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ['-s', self._device_serial] + arg_list, timeout=timeout, 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) retries=retries, check_error=check_error) 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def __eq__(self, other): 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Consider instances equal if they refer to the same device. 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) other: The instance to compare equality with. 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Returns: 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) True if the instances are considered equal, false otherwise. 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return self._device_serial == str(other) 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def __str__(self): 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """The string representation of an instance. 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Returns: 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) The device serial number as a string. 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return self._device_serial 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def __repr__(self): 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return '%s(\'%s\')' % (self.__class__.__name__, self) 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) # TODO(craigdh): Determine the filter criteria that should be supported. 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @classmethod 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def GetDevices(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Get the list of active attached devices. 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Yields: 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AdbWrapper instances. 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) output = cls._RunAdbCmd(['devices'], timeout=timeout, retries=retries) 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) lines = [line.split() for line in output.split('\n')] 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return [AdbWrapper(line[0]) for line in lines 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if len(line) == 2 and line[1] == 'device'] 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def GetDeviceSerial(self): 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Gets the device serial number associated with this object. 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Returns: 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Device serial number as a string. 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return self._device_serial 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Push(self, local, remote, timeout=60*5, retries=_DEFAULT_RETRIES): 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Pushes a file from the host to the device. 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local: Path on the host filesystem. 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote: Path on the device filesystem. 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) _VerifyLocalFileExists(local) 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._DeviceAdbCmd(['push', local, remote], timeout, retries) 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Pull(self, remote, local, timeout=60*5, retries=_DEFAULT_RETRIES): 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Pulls a file from the device to the host. 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote: Path on the device filesystem. 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local: Path on the host filesystem. 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._DeviceAdbCmd(['pull', remote, local], timeout, retries) 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) _VerifyLocalFileExists(local) 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Shell(self, command, expect_rc=None, timeout=_DEFAULT_TIMEOUT, 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries=_DEFAULT_RETRIES): 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Runs a shell command on the device. 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) command: The shell command to run. 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expect_rc: (optional) If set checks that the command's return code matches 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this value. 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Returns: 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) The output of the shell command as a string. 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Raises: 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_errors.AdbCommandFailedError: If the return code doesn't match 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) |expect_rc|. 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if expect_rc is None: 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) actual_command = command 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else: 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) actual_command = '%s; echo $?;' % command 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) output = self._DeviceAdbCmd( 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ['shell', actual_command], timeout, retries, check_error=False) 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if expect_rc is not None: 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) output_end = output.rstrip().rfind('\n') + 1 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) rc = output[output_end:].strip() 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) output = output[:output_end] 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if int(rc) != expect_rc: 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch raise device_errors.AdbCommandFailedError( 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ['shell', command], 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 'shell command exited with code: %s' % rc, 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._device_serial) 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return output 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Logcat(self, filter_spec=None, timeout=_DEFAULT_TIMEOUT, 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries=_DEFAULT_RETRIES): 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Get the logcat output. 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) filter_spec: (optional) Spec to filter the logcat. 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Returns: 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) logcat output as a string. 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd = ['logcat'] 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if filter_spec is not None: 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append(filter_spec) 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return self._DeviceAdbCmd(cmd, timeout, retries, check_error=False) 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Forward(self, local, remote, timeout=_DEFAULT_TIMEOUT, 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries=_DEFAULT_RETRIES): 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Forward socket connections from the local socket to the remote socket. 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Sockets are specified by one of: 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) tcp:<port> 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) localabstract:<unix domain socket name> 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) localreserved:<unix domain socket name> 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) localfilesystem:<unix domain socket name> 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dev:<character device name> 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) jdwp:<process pid> (remote only) 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local: The host socket. 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote: The device socket. 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._DeviceAdbCmd(['forward', str(local), str(remote)], timeout, retries) 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def JDWP(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """List of PIDs of processes hosting a JDWP transport. 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Returns: 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) A list of PIDs as strings. 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return [a.strip() for a in 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._DeviceAdbCmd(['jdwp'], timeout, retries).split('\n')] 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Install(self, apk_path, forward_lock=False, reinstall=False, 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) sd_card=False, timeout=60*2, retries=_DEFAULT_RETRIES): 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Install an apk on the device. 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) apk_path: Host path to the APK file. 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) forward_lock: (optional) If set forward-locks the app. 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reinstall: (optional) If set reinstalls the app, keeping its data. 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) sd_card: (optional) If set installs on the SD card. 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) _VerifyLocalFileExists(apk_path) 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd = ['install'] 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if forward_lock: 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append('-l') 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if reinstall: 255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append('-r') 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if sd_card: 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append('-s') 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append(apk_path) 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) output = self._DeviceAdbCmd(cmd, timeout, retries) 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if 'Success' not in output: 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch raise device_errors.AdbCommandFailedError(cmd, output) 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Uninstall(self, package, keep_data=False, timeout=_DEFAULT_TIMEOUT, 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries=_DEFAULT_RETRIES): 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Remove the app |package| from the device. 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) package: The package to uninstall. 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) keep_data: (optional) If set keep the data and cache directories. 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd = ['uninstall'] 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if keep_data: 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append('-k') 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append(package) 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) output = self._DeviceAdbCmd(cmd, timeout, retries) 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if 'Failure' in output: 279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch raise device_errors.AdbCommandFailedError(cmd, output) 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Backup(self, path, packages=None, apk=False, shared=False, 282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) nosystem=True, include_all=False, timeout=_DEFAULT_TIMEOUT, 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries=_DEFAULT_RETRIES): 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Write an archive of the device's data to |path|. 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) path: Local path to store the backup file. 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) packages: List of to packages to be backed up. 289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) apk: (optional) If set include the .apk files in the archive. 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shared: (optional) If set buckup the device's SD card. 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) nosystem: (optional) If set exclude system applications. 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) include_all: (optional) If set back up all installed applications and 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) |packages| is optional. 294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd = ['backup', path] 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if apk: 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append('-apk') 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if shared: 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append('-shared') 302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if nosystem: 303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append('-nosystem') 304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if include_all: 305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.append('-all') 306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if packages: 307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd.extend(packages) 308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assert bool(packages) ^ bool(include_all), ( 309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 'Provide \'packages\' or set \'include_all\' but not both.') 310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ret = self._DeviceAdbCmd(cmd, timeout, retries) 311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) _VerifyLocalFileExists(path) 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ret 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Restore(self, path, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Restore device contents from the backup archive. 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) path: Host path to the backup archive. 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) _VerifyLocalFileExists(path) 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._DeviceAdbCmd(['restore'] + [path], timeout, retries) 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def WaitForDevice(self, timeout=60*5, retries=_DEFAULT_RETRIES): 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Block until the device is online. 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._DeviceAdbCmd(['wait-for-device'], timeout, retries) 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def GetState(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Get device state. 336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Returns: 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) One of 'offline', 'bootloader', or 'device'. 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return self._DeviceAdbCmd(['get-state'], timeout, retries).strip() 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def GetDevPath(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Gets the device path. 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Returns: 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) The device path (e.g. usb:3-4) 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return self._DeviceAdbCmd(['get-devpath'], timeout, retries) 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Remount(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Remounts the /system partition on the device read-write.""" 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._DeviceAdbCmd(['remount'], timeout, retries) 361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Reboot(self, to_bootloader=False, timeout=60*5, 363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries=_DEFAULT_RETRIES): 364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Reboots the device. 365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) to_bootloader: (optional) If set reboots to the bootloader. 368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if to_bootloader: 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd = ['reboot-bootloader'] 373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else: 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd = ['reboot'] 375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self._DeviceAdbCmd(cmd, timeout, retries) 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def Root(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """Restarts the adbd daemon with root permissions, if possible. 379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Args: 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timeout: (optional) Timeout per try in seconds. 382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) retries: (optional) Number of retries to attempt. 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) """ 384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) output = self._DeviceAdbCmd(['root'], timeout, retries) 385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if 'cannot' in output: 386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch raise device_errors.AdbCommandFailedError(['root'], output) 387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 388