Index: build/android/gyp/util/build_device.py |
diff --git a/build/android/gyp/util/build_device.py b/build/android/gyp/util/build_device.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8ab11124f74462b20105efee247298888fe41062 |
--- /dev/null |
+++ b/build/android/gyp/util/build_device.py |
@@ -0,0 +1,108 @@ |
+# Copyright 2013 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+""" A simple device interface for build steps. |
+ |
+""" |
+ |
+import logging |
+import os |
+import re |
+import sys |
+ |
+from util import build_utils |
+ |
+BUILD_ANDROID_DIR = os.path.join(os.path.dirname(__file__), '..', '..') |
+sys.path.append(BUILD_ANDROID_DIR) |
+ |
+from pylib import android_commands |
+from pylib.device import device_errors |
+from pylib.device import device_utils |
+ |
+GetAttachedDevices = android_commands.GetAttachedDevices |
+ |
+ |
+class BuildDevice(object): |
+ def __init__(self, configuration): |
+ self.id = configuration['id'] |
+ self.description = configuration['description'] |
+ self.install_metadata = configuration['install_metadata'] |
+ self.device = device_utils.DeviceUtils(self.id) |
+ |
+ def RunShellCommand(self, *args, **kwargs): |
+ return self.device.RunShellCommand(*args, **kwargs) |
+ |
+ def PushChangedFiles(self, *args, **kwargs): |
+ return self.device.PushChangedFiles(*args, **kwargs) |
+ |
+ def GetSerialNumber(self): |
+ return self.id |
+ |
+ def Install(self, *args, **kwargs): |
+ return self.device.Install(*args, **kwargs) |
+ |
+ def InstallSplitApk(self, *args, **kwargs): |
+ return self.device.InstallSplitApk(*args, **kwargs) |
+ |
+ def GetInstallMetadata(self, apk_package): |
+ """Gets the metadata on the device for the apk_package apk.""" |
+ # Matches lines like: |
+ # -rw-r--r-- system system 7376582 2013-04-19 16:34 \ |
+ # org.chromium.chrome.shell.apk |
+ # -rw-r--r-- system system 7376582 2013-04-19 16:34 \ |
+ # org.chromium.chrome.shell-1.apk |
+ apk_matcher = lambda s: re.match('.*%s(-[0-9]*)?.apk$' % apk_package, s) |
+ matches = filter(apk_matcher, self.install_metadata) |
+ return matches[0] if matches else None |
+ |
+ |
+def GetConfigurationForDevice(device_id): |
+ device = device_utils.DeviceUtils(device_id) |
+ configuration = None |
+ has_root = False |
+ is_online = device.IsOnline() |
+ if is_online: |
+ cmd = 'ls -l /data/app; getprop ro.build.description' |
+ cmd_output = device.RunShellCommand(cmd) |
+ has_root = not 'Permission denied' in cmd_output[0] |
+ if not has_root: |
+ # Disable warning log messages from EnableRoot() |
+ logging.getLogger().disabled = True |
+ try: |
+ device.EnableRoot() |
+ has_root = True |
+ except device_errors.CommandFailedError: |
+ has_root = False |
+ finally: |
+ logging.getLogger().disabled = False |
+ cmd_output = device.RunShellCommand(cmd) |
+ |
+ configuration = { |
+ 'id': device_id, |
+ 'description': cmd_output[-1], |
+ 'install_metadata': cmd_output[:-1], |
+ } |
+ return configuration, is_online, has_root |
+ |
+ |
+def WriteConfigurations(configurations, path): |
+ # Currently we only support installing to the first device. |
+ build_utils.WriteJson(configurations[:1], path, only_if_changed=True) |
+ |
+ |
+def ReadConfigurations(path): |
+ return build_utils.ReadJson(path) |
+ |
+ |
+def GetBuildDevice(configurations): |
+ assert len(configurations) == 1 |
+ return BuildDevice(configurations[0]) |
+ |
+ |
+def GetBuildDeviceFromPath(path): |
+ configurations = ReadConfigurations(path) |
+ if len(configurations) > 0: |
+ return GetBuildDevice(ReadConfigurations(path)) |
+ return None |
+ |