Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """ A simple device interface for build steps. | 5 """ A simple device interface for build steps. |
| 6 | 6 |
| 7 """ | 7 """ |
| 8 | 8 |
| 9 import logging | 9 import logging |
| 10 import os | 10 import os |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 21 def GetAttachedDevices(): | 21 def GetAttachedDevices(): |
| 22 return [a.GetDeviceSerial() | 22 return [a.GetDeviceSerial() |
| 23 for a in adb_wrapper.AdbWrapper.Devices()] | 23 for a in adb_wrapper.AdbWrapper.Devices()] |
| 24 | 24 |
| 25 | 25 |
| 26 class BuildDevice(object): | 26 class BuildDevice(object): |
| 27 def __init__(self, configuration): | 27 def __init__(self, configuration): |
| 28 self.id = configuration['id'] | 28 self.id = configuration['id'] |
| 29 self.description = configuration['description'] | 29 self.description = configuration['description'] |
| 30 self.install_metadata = configuration['install_metadata'] | 30 self.install_metadata = configuration['install_metadata'] |
| 31 assert all(isinstance(entry, dict) for entry in self.install_metadata), ( | |
| 32 'Invalid BuildDevice configuration') | |
|
perezju
2016/06/15 14:54:45
This will break hard if there are old config files
| |
| 31 self.device = device_utils.DeviceUtils(self.id) | 33 self.device = device_utils.DeviceUtils(self.id) |
| 32 | 34 |
| 33 def RunShellCommand(self, *args, **kwargs): | 35 def RunShellCommand(self, *args, **kwargs): |
| 34 return self.device.RunShellCommand(*args, **kwargs) | 36 return self.device.RunShellCommand(*args, **kwargs) |
| 35 | 37 |
| 36 def PushChangedFiles(self, *args, **kwargs): | 38 def PushChangedFiles(self, *args, **kwargs): |
| 37 return self.device.PushChangedFiles(*args, **kwargs) | 39 return self.device.PushChangedFiles(*args, **kwargs) |
| 38 | 40 |
| 39 def GetSerialNumber(self): | 41 def GetSerialNumber(self): |
| 40 return self.id | 42 return self.id |
| 41 | 43 |
| 42 def Install(self, *args, **kwargs): | 44 def Install(self, *args, **kwargs): |
| 43 return self.device.Install(*args, **kwargs) | 45 return self.device.Install(*args, **kwargs) |
| 44 | 46 |
| 45 def InstallSplitApk(self, *args, **kwargs): | 47 def InstallSplitApk(self, *args, **kwargs): |
| 46 return self.device.InstallSplitApk(*args, **kwargs) | 48 return self.device.InstallSplitApk(*args, **kwargs) |
| 47 | 49 |
| 48 def GetInstallMetadata(self, apk_package): | 50 def GetInstallMetadata(self, apk_package, refresh=False): |
| 49 """Gets the metadata on the device for the apk_package apk.""" | 51 """Gets the metadata on the device for a given apk. |
| 50 # Matches lines like: | 52 |
| 51 # -rw-r--r-- system system 7376582 2013-04-19 16:34 \ | 53 Args: |
| 52 # org.chromium.chrome.apk | 54 apk_package: A string with the package name for which to get metadata. |
| 53 # -rw-r--r-- system system 7376582 2013-04-19 16:34 \ | 55 refresh: A boolean indicating whether to re-read package metadata from |
| 54 # org.chromium.chrome-1.apk | 56 the device, or use the values from the current configuration. |
| 55 apk_matcher = lambda s: re.match('.*%s(-[0-9]*)?.apk$' % apk_package, s) | 57 """ |
| 56 matches = filter(apk_matcher, self.install_metadata) | 58 if refresh: |
| 57 return matches[0] if matches else None | 59 self.install_metadata = self.device.StatDirectory( |
| 60 '/data/app/', as_root=True) | |
| 61 # Matches names like: org.chromium.chrome.apk, org.chromium.chrome-1.apk | |
| 62 apk_pattern = re.compile('%s(-[0-9]*)?(.apk)?$' % re.escape(apk_package)) | |
|
perezju
2016/06/15 14:54:45
Wondering when/if this is actually being run. Note
jbudorick
2016/06/15 20:47:36
Good (?) news -- apk_install.py was only used in g
| |
| 63 return next( | |
| 64 (entry for entry in self.install_metadata | |
| 65 if apk_pattern.match(entry['filename'])), | |
| 66 None) | |
| 58 | 67 |
| 59 | 68 |
| 60 def GetConfigurationForDevice(device_id): | 69 def GetConfigurationForDevice(device_id): |
| 61 device = device_utils.DeviceUtils(device_id) | 70 device = device_utils.DeviceUtils(device_id) |
| 62 configuration = None | 71 configuration = None |
| 63 has_root = False | 72 has_root = False |
| 64 is_online = device.IsOnline() | 73 is_online = device.IsOnline() |
| 65 if is_online: | 74 if is_online: |
| 66 cmd = 'ls -l /data/app; getprop ro.build.description' | 75 has_root = device.HasRoot() |
| 67 cmd_output = device.RunShellCommand(cmd) | |
| 68 has_root = not 'Permission denied' in cmd_output[0] | |
| 69 if not has_root: | |
| 70 # Disable warning log messages from EnableRoot() | |
| 71 logging.getLogger().disabled = True | |
| 72 try: | |
| 73 device.EnableRoot() | |
| 74 has_root = True | |
| 75 except device_errors.CommandFailedError: | |
| 76 has_root = False | |
| 77 finally: | |
| 78 logging.getLogger().disabled = False | |
| 79 cmd_output = device.RunShellCommand(cmd) | |
| 80 | |
| 81 configuration = { | 76 configuration = { |
| 82 'id': device_id, | 77 'id': device_id, |
| 83 'description': cmd_output[-1], | 78 'description': device.build_description, |
| 84 'install_metadata': cmd_output[:-1], | 79 'install_metadata': device.StatDirectory('/data/app/', as_root=True), |
| 85 } | 80 } |
| 86 return configuration, is_online, has_root | 81 return configuration, is_online, has_root |
| 87 | 82 |
| 88 | 83 |
| 89 def WriteConfigurations(configurations, path): | 84 def WriteConfigurations(configurations, path): |
| 90 # Currently we only support installing to the first device. | 85 # Currently we only support installing to the first device. |
| 91 build_utils.WriteJson(configurations[:1], path, only_if_changed=True) | 86 build_utils.WriteJson(configurations[:1], path, only_if_changed=True) |
| 92 | 87 |
| 93 | 88 |
| 94 def ReadConfigurations(path): | 89 def ReadConfigurations(path): |
| 95 return build_utils.ReadJson(path) | 90 return build_utils.ReadJson(path) |
| 96 | 91 |
| 97 | 92 |
| 98 def GetBuildDevice(configurations): | 93 def GetBuildDevice(configurations): |
| 99 assert len(configurations) == 1 | 94 assert len(configurations) == 1 |
| 100 return BuildDevice(configurations[0]) | 95 return BuildDevice(configurations[0]) |
| 101 | 96 |
| 102 | 97 |
| 103 def GetBuildDeviceFromPath(path): | 98 def GetBuildDeviceFromPath(path): |
| 104 configurations = ReadConfigurations(path) | 99 configurations = ReadConfigurations(path) |
| 105 if len(configurations) > 0: | 100 if len(configurations) > 0: |
| 106 return GetBuildDevice(ReadConfigurations(path)) | 101 return GetBuildDevice(ReadConfigurations(path)) |
| 107 return None | 102 return None |
| 108 | |
| OLD | NEW |