| Index: build/android/pylib/android_commands.py
|
| diff --git a/build/android/pylib/android_commands.py b/build/android/pylib/android_commands.py
|
| index fcf97a859ed139a3bbeb91c71d7ae0ab7387b0c3..b8b407333f9a9269d019393abbe9f33758494951 100644
|
| --- a/build/android/pylib/android_commands.py
|
| +++ b/build/android/pylib/android_commands.py
|
| @@ -150,7 +150,7 @@ def _GetFilesFromRecursiveLsOutput(path, ls_output, re_file, utc_offset=None):
|
| if file_match:
|
| filename = os.path.join(current_dir, file_match.group('filename'))
|
| if filename.startswith(path_dir):
|
| - filename = filename[len(path_dir)+1:]
|
| + filename = filename[len(path_dir) + 1:]
|
| lastmod = datetime.datetime.strptime(
|
| file_match.group('date') + ' ' + file_match.group('time')[:5],
|
| '%Y-%m-%d %H:%M')
|
| @@ -226,12 +226,16 @@ class AndroidCommands(object):
|
| True: if output from executing adb root was as expected.
|
| False: otherwise.
|
| """
|
| - return_value = self._adb.EnableAdbRoot()
|
| - # EnableAdbRoot inserts a call for wait-for-device only when adb logcat
|
| - # output matches what is expected. Just to be safe add a call to
|
| - # wait-for-device.
|
| - self._adb.SendCommand('wait-for-device')
|
| - return return_value
|
| + if self.GetBuildType() == 'user':
|
| + logging.warning("Can't enable root in production builds with type user")
|
| + return False
|
| + else:
|
| + return_value = self._adb.EnableAdbRoot()
|
| + # EnableAdbRoot inserts a call for wait-for-device only when adb logcat
|
| + # output matches what is expected. Just to be safe add a call to
|
| + # wait-for-device.
|
| + self._adb.SendCommand('wait-for-device')
|
| + return return_value
|
|
|
| def GetDeviceYear(self):
|
| """Returns the year information of the date on device."""
|
| @@ -328,7 +332,9 @@ class AndroidCommands(object):
|
| install_cmd = ' '.join(install_cmd)
|
|
|
| logging.info('>>> $' + install_cmd)
|
| - return self._adb.SendCommand(install_cmd, timeout_time=2*60, retry_count=0)
|
| + return self._adb.SendCommand(install_cmd,
|
| + timeout_time=2 * 60,
|
| + retry_count=0)
|
|
|
| def ManagedInstall(self, apk_path, keep_data=False, package_name=None,
|
| reboots_on_failure=2):
|
| @@ -636,14 +642,14 @@ class AndroidCommands(object):
|
|
|
| # They don't match, so remove everything first and then create it.
|
| if os.path.isdir(local_path):
|
| - self.RunShellCommand('rm -r %s' % device_path, timeout_time=2*60)
|
| + self.RunShellCommand('rm -r %s' % device_path, timeout_time=2 * 60)
|
| self.RunShellCommand('mkdir -p %s' % device_path)
|
|
|
| # 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)
|
| - output = self._adb.SendCommand(push_command, timeout_time=30*60)
|
| + output = self._adb.SendCommand(push_command, timeout_time=30 * 60)
|
| assert _HasAdbPushSucceeded(output)
|
|
|
|
|
| @@ -659,10 +665,40 @@ class AndroidCommands(object):
|
| f.flush()
|
| self._adb.Push(f.name, filename)
|
|
|
| + _TEMP_FILE_BASE_FMT = 'temp_file_%d'
|
| + _TEMP_SCRIPT_FILE_BASE_FMT = 'temp_script_file_%d.sh'
|
| +
|
| + def _GetDeviceTempFileName(self, base_name):
|
| + i = 0
|
| + while self.FileExistsOnDevice(
|
| + self.GetExternalStorage() + '/' + base_name % i):
|
| + i += 1
|
| + return self.GetExternalStorage() + '/' + base_name % i
|
| +
|
| + def SetProtectedFileContents(self, filename, contents):
|
| + """Writes |contents| to the protected file specified by |filename|.
|
| +
|
| + This is less efficient than SetFileContents, but will work for protected
|
| + files and device files.
|
| + """
|
| + temp_file = self._GetDeviceTempFileName(AndroidCommands._TEMP_FILE_BASE_FMT)
|
| + temp_script = self._GetDeviceTempFileName(
|
| + AndroidCommands._TEMP_SCRIPT_FILE_BASE_FMT)
|
| +
|
| + # Put the contents in a temporary file
|
| + self.SetFileContents(temp_file, contents)
|
| + # Create a script to copy the file contents to its final destination
|
| + self.SetFileContents(temp_script, 'cat %s > %s' % (temp_file, filename))
|
| + # Run the script as root
|
| + self.RunShellCommand('su -c sh %s' % temp_script)
|
| + # And remove the temporary files
|
| + self.RunShellCommand('rm ' + temp_file)
|
| + self.RunShellCommand('rm ' + temp_script)
|
| +
|
| def RemovePushedFiles(self):
|
| """Removes all files pushed with PushIfNeeded() from the device."""
|
| for p in self._pushed_files:
|
| - self.RunShellCommand('rm -r %s' % p, timeout_time=2*60)
|
| + self.RunShellCommand('rm -r %s' % p, timeout_time=2 * 60)
|
|
|
| def ListPathContents(self, path):
|
| """Lists files in all subdirectories of |path|.
|
| @@ -778,7 +814,7 @@ class AndroidCommands(object):
|
| self.StartMonitoringLogcat(clear=False)
|
| return self._logcat
|
|
|
| - def WaitForLogMatch(self, success_re, error_re, clear=False):
|
| + def WaitForLogMatch(self, success_re, error_re, clear=False, timeout=10):
|
| """Blocks until a matching line is logged or a timeout occurs.
|
|
|
| Args:
|
| @@ -799,7 +835,7 @@ class AndroidCommands(object):
|
| t0 = time.time()
|
| while True:
|
| if not self._logcat:
|
| - self.StartMonitoringLogcat(clear)
|
| + self.StartMonitoringLogcat(clear, timeout=timeout)
|
| try:
|
| while True:
|
| # Note this will block for upto the timeout _per log line_, so we need
|
|
|