| Index: build/android/pylib/android_commands.py
|
| diff --git a/build/android/pylib/android_commands.py b/build/android/pylib/android_commands.py
|
| index f370efee13d67f7df8d7366a760f6f29662ed1d9..1d80642d6546e9c47ef9c6c5ed668a73bebccc7d 100644
|
| --- a/build/android/pylib/android_commands.py
|
| +++ b/build/android/pylib/android_commands.py
|
| @@ -109,9 +109,11 @@ def GetAttachedDevices():
|
| devices.insert(0, preferred_device)
|
| return devices
|
|
|
| +
|
| def IsDeviceAttached(device):
|
| return device in GetAttachedDevices()
|
|
|
| +
|
| def _GetFilesFromRecursiveLsOutput(path, ls_output, re_file, utc_offset=None):
|
| """Gets a list of files from `ls` command output.
|
|
|
| @@ -164,10 +166,12 @@ def _GetFilesFromRecursiveLsOutput(path, ls_output, re_file, utc_offset=None):
|
| files[filename] = (int(file_match.group('size')), lastmod)
|
| return files
|
|
|
| +
|
| def _ComputeFileListHash(md5sum_output):
|
| """Returns a list of MD5 strings from the provided md5sum output."""
|
| return [line.split(' ')[0] for line in md5sum_output]
|
|
|
| +
|
| def _HasAdbPushSucceeded(command_output):
|
| """Returns whether adb push has succeeded from the provided output."""
|
| if not command_output:
|
| @@ -179,6 +183,7 @@ def _HasAdbPushSucceeded(command_output):
|
| return False
|
| return True
|
|
|
| +
|
| def GetLogTimestamp(log_line, year):
|
| """Returns the timestamp of the given |log_line| in the given year."""
|
| try:
|
| @@ -211,6 +216,14 @@ class AndroidCommands(object):
|
| self._external_storage = ''
|
| self._util_wrapper = ''
|
|
|
| + def _LogShell(self, cmd):
|
| + """Logs the adb shell command."""
|
| + if self._device:
|
| + device_repr = self._device[-4:]
|
| + else:
|
| + device_repr = '????'
|
| + logging.info('[%s]> %s', device_repr, cmd)
|
| +
|
| def Adb(self):
|
| """Returns our AdbInterface to avoid us wrapping all its methods."""
|
| return self._adb
|
| @@ -317,7 +330,7 @@ class AndroidCommands(object):
|
| """
|
| uninstall_command = 'uninstall %s' % package
|
|
|
| - logging.info('>>> $' + uninstall_command)
|
| + self._LogShell(uninstall_command)
|
| return self._adb.SendCommand(uninstall_command, timeout_time=60)
|
|
|
| def Install(self, package_file_path, reinstall=False):
|
| @@ -341,7 +354,7 @@ class AndroidCommands(object):
|
| install_cmd.append(package_file_path)
|
| install_cmd = ' '.join(install_cmd)
|
|
|
| - logging.info('>>> $' + install_cmd)
|
| + self._LogShell(install_cmd)
|
| return self._adb.SendCommand(install_cmd,
|
| timeout_time=2 * 60,
|
| retry_count=0)
|
| @@ -472,14 +485,14 @@ class AndroidCommands(object):
|
| Returns:
|
| list containing the lines of output received from running the command
|
| """
|
| - logging.info('>>> $' + command)
|
| + self._LogShell(command)
|
| if "'" in command: logging.warning(command + " contains ' quotes")
|
| result = self._adb.SendShellCommand(
|
| "'%s'" % command, timeout_time).splitlines()
|
| if ['error: device not found'] == result:
|
| raise errors.DeviceUnresponsiveError('device not found')
|
| if log_result:
|
| - logging.info('\n>>> '.join(result))
|
| + self._LogShell('\n'.join(result))
|
| return result
|
|
|
| def GetShellCommandStatusAndOutput(self, command, timeout_time=20,
|
| @@ -697,7 +710,7 @@ class AndroidCommands(object):
|
| # NOTE: We can't use adb_interface.Push() because it hardcodes a timeout of
|
| # 60 seconds which isn't sufficient for a lot of users of this method.
|
| push_command = 'push %s %s' % (local_path, device_path)
|
| - logging.info('>>> $' + push_command)
|
| + self._LogShell(push_command)
|
| output = self._adb.SendCommand(push_command, timeout_time=30 * 60)
|
| assert _HasAdbPushSucceeded(output)
|
|
|
| @@ -1253,7 +1266,7 @@ class AndroidCommands(object):
|
| An instance of am_instrument_parser.TestResult object.
|
| """
|
| cmd = 'uiautomator runtest %s -e class %s' % (test_package, test)
|
| - logging.info('>>> $' + cmd)
|
| + self._LogShell(cmd)
|
| output = self._adb.SendShellCommand(cmd, timeout_time=timeout)
|
| # uiautomator doesn't fully conform to the instrumenation test runner
|
| # convention and doesn't terminate with INSTRUMENTATION_CODE.
|
|
|