Index: build/android/pylib/device/device_utils.py |
diff --git a/build/android/pylib/device/device_utils.py b/build/android/pylib/device/device_utils.py |
index 0ff3a8454799eccc160b4aaf357b1f1bb34dc2d3..f416c7866ae44194b404689a5b3eb303f05b2e70 100644 |
--- a/build/android/pylib/device/device_utils.py |
+++ b/build/android/pylib/device/device_utils.py |
@@ -56,6 +56,13 @@ def RestartServer(): |
pylib.android_commands.AndroidCommands().RestartAdbServer() |
+def _JoinLines(lines): |
+ # makes sure that the last line is also terminated, and is more memory |
+ # efficient than first appending an end-line to each line and then joining |
+ # all of them together. |
+ return ''.join(s for line in lines for s in (line, '\n')) |
+ |
+ |
class DeviceUtils(object): |
_VALID_SHELL_VARIABLE = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$') |
@@ -857,7 +864,8 @@ class DeviceUtils(object): |
str(e), str(self)), None, sys.exc_info()[2] |
@decorators.WithTimeoutAndRetriesFromInstance() |
- def ReadFile(self, device_path, as_root=False, timeout=None, retries=None): |
+ def ReadFile(self, device_path, as_root=False, |
+ timeout=None, retries=None): |
"""Reads the contents of a file from the device. |
Args: |
@@ -869,22 +877,17 @@ class DeviceUtils(object): |
retries: number of retries |
Returns: |
- The contents of the file at |device_path| as a list of lines. |
+ The contents of |device_path| as a string. Contents are intepreted using |
+ universal newlines, so the caller will see them encoded as '\n'. Also, |
+ all lines will be terminated. |
Raises: |
- CommandFailedError if the file can't be read. |
+ AdbCommandFailedError if the file can't be read. |
CommandTimeoutError on timeout. |
DeviceUnreachableError on missing device. |
""" |
- # TODO(jbudorick) Evaluate whether we want to return a list of lines after |
- # the implementation switch, and if file not found should raise exception. |
- if as_root: |
- if not self.old_interface.CanAccessProtectedFileContents(): |
- raise device_errors.CommandFailedError( |
- 'Cannot read from %s with root privileges.' % device_path) |
- return self.old_interface.GetProtectedFileContents(device_path) |
- else: |
- return self.old_interface.GetFileContents(device_path) |
+ return _JoinLines(self.RunShellCommand( |
+ ['cat', device_path], as_root=as_root, check_return=True)) |
@decorators.WithTimeoutAndRetriesFromInstance() |
def WriteFile(self, device_path, contents, as_root=False, force_push=False, |