Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 # found in the LICENSE file. | |
| 4 """ A simple device interface for build steps. | |
|
shashi
2013/06/20 03:16:19
Nit new line between file comment and copyright no
cjhopman
2013/06/25 16:43:11
Done.
| |
| 5 | |
| 6 """ | |
| 7 | |
| 8 import logging | |
| 9 import os | |
| 10 import re | |
| 11 import sys | |
| 12 | |
| 13 import build_utils | |
| 14 | |
| 15 BUILD_ANDROID_DIR = os.path.join(os.path.dirname(__file__), '..', '..') | |
| 16 sys.path.append(BUILD_ANDROID_DIR) | |
| 17 | |
| 18 from pylib import android_commands | |
| 19 | |
| 20 from pylib.android_commands import GetAttachedDevices | |
| 21 | |
| 22 | |
| 23 class BuildDevice(object): | |
| 24 def __init__(self, configuration): | |
| 25 self.id = configuration['id'] | |
| 26 self.description = configuration['description'] | |
| 27 self.install_metadata = configuration['install_metadata'] | |
| 28 self.adb = android_commands.AndroidCommands(self.id) | |
| 29 | |
| 30 def RunShellCommand(self, *args, **kwargs): | |
| 31 return self.adb.RunShellCommand(*args, **kwargs) | |
| 32 | |
| 33 def PushIfNeeded(self, *args, **kwargs): | |
| 34 return self.adb.PushIfNeeded(*args, **kwargs) | |
| 35 | |
| 36 def GetSerialNumber(self): | |
| 37 return self.id | |
| 38 | |
| 39 def Install(self, *args, **kwargs): | |
| 40 return self.adb.Install(*args, **kwargs) | |
| 41 | |
| 42 def GetInstallMetadata(self, apk_package): | |
| 43 """Gets the metadata on the device for the apk_package apk.""" | |
| 44 # Matches lines like: | |
| 45 # -rw-r--r-- system system 7376582 2013-04-19 16:34 org.chromium.chrome .testshell.apk | |
| 46 # -rw-r--r-- system system 7376582 2013-04-19 16:34 org.chromium.chrome .testshell-1.apk | |
| 47 apk_matcher = lambda s: re.match('.*%s(-[0-9]*)?.apk$' % apk_package, s) | |
| 48 matches = filter(apk_matcher, self.install_metadata) | |
| 49 return matches[0] if matches else None | |
| 50 | |
| 51 | |
| 52 def GetConfigurationForDevice(id): | |
| 53 adb = android_commands.AndroidCommands(id) | |
| 54 configuration = None | |
| 55 has_root = False | |
| 56 is_online = adb.IsOnline() | |
| 57 if is_online: | |
| 58 cmd = 'ls -l /data/app; getprop ro.build.description' | |
| 59 cmd_output = adb.RunShellCommand(cmd) | |
| 60 has_root = not 'Permission denied' in cmd_output[0] | |
| 61 if not has_root: | |
| 62 # Disable warning log messages from EnableAdbRoot() | |
| 63 logging.getLogger().disabled = True | |
| 64 has_root = adb.EnableAdbRoot() | |
|
shashi
2013/06/20 03:16:19
Can we move this to before and always try to enabl
cjhopman
2013/06/25 16:43:11
It is ~200ms per device for every build. A no-op b
shashi
2013/06/25 17:23:31
OK, did not realise it was this slow.
On 2013/06/2
| |
| 65 logging.getLogger().disabled = False | |
| 66 cmd_output = adb.RunShellCommand(cmd) | |
| 67 | |
| 68 configuration = { | |
| 69 'id': id, | |
| 70 'description': cmd_output[-1], | |
| 71 'install_metadata': cmd_output[:-1], | |
| 72 } | |
| 73 return configuration, is_online, has_root | |
| 74 | |
| 75 | |
| 76 def WriteConfigurations(configurations, path): | |
| 77 # Currently we only support installing to the first device. | |
| 78 build_utils.WriteJson(configurations[:1], path, only_if_changed=True) | |
| 79 | |
| 80 | |
| 81 def ReadConfigurations(path): | |
| 82 configurations = build_utils.ReadJson(path) | |
|
shashi
2013/06/20 03:16:19
nit: return build_utils.ReadJson(path)
cjhopman
2013/06/25 16:43:11
Done.
| |
| 83 return configurations | |
| 84 | |
| 85 | |
| 86 def GetBuildDevice(configurations): | |
| 87 assert len(configurations) == 1 | |
|
shashi
2013/06/20 03:16:19
nit: pass a single element of the list instead of
cjhopman
2013/06/25 16:43:11
It is actually important that the list of configur
shashi
2013/06/25 17:23:31
If there is plan in future to support multiple dev
| |
| 88 return BuildDevice(configurations[0]) | |
| 89 | |
| 90 | |
| 91 def GetBuildDeviceFromPath(path): | |
| 92 configurations = ReadConfigurations(path) | |
| 93 if len(configurations) > 0: | |
| 94 return GetBuildDevice(ReadConfigurations(path)) | |
|
shashi
2013/06/20 03:16:19
nit: pass configurations[0] here.
return GetBuildD
| |
| 95 return None | |
| 96 | |
| OLD | NEW |