Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1407)

Unified Diff: build/android/provision_devices.py

Issue 434193002: [Android] Parallelize provision_devices.py. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | build/android/pylib/device/device_blacklist.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/android/provision_devices.py
diff --git a/build/android/provision_devices.py b/build/android/provision_devices.py
index 43c33eba58a391583e87de4986b7190d32290784..b5981d9a39ffab3eb1b8ac3bba2fc0483e1882c1 100755
--- a/build/android/provision_devices.py
+++ b/build/android/provision_devices.py
@@ -49,42 +49,40 @@ def LaunchHostHeartbeat():
'build/android/host_heartbeat.py')])
-def PushAndLaunchAdbReboot(devices, target):
+def PushAndLaunchAdbReboot(device, target):
"""Pushes and launches the adb_reboot binary on the device.
Arguments:
- devices: The list of serial numbers of the device to which the
- adb_reboot binary should be pushed.
- target : The build target (example, Debug or Release) which helps in
- locating the adb_reboot binary.
+ device: The DeviceUtils instance for the device to which the adb_reboot
+ binary should be pushed.
+ target: The build target (example, Debug or Release) which helps in
+ locating the adb_reboot binary.
"""
- for device_serial in devices:
- logging.info('Will push and launch adb_reboot on %s' % device_serial)
- device = device_utils.DeviceUtils(device_serial)
- # Kill if adb_reboot is already running.
- try:
- # Don't try to kill adb_reboot more than once. We don't expect it to be
- # running at all.
- device.KillAll('adb_reboot', blocking=True, timeout=2, retries=0)
- except device_errors.CommandFailedError:
- # We can safely ignore the exception because we don't expect adb_reboot
- # to be running.
- pass
- # Push adb_reboot
- logging.info(' Pushing adb_reboot ...')
- adb_reboot = os.path.join(constants.DIR_SOURCE_ROOT,
- 'out/%s/adb_reboot' % target)
- device.PushChangedFiles(adb_reboot, '/data/local/tmp/')
- # Launch adb_reboot
- logging.info(' Launching adb_reboot ...')
- device.old_interface.GetAndroidToolStatusAndOutput(
- '/data/local/tmp/adb_reboot')
- LaunchHostHeartbeat()
+ logging.info('Will push and launch adb_reboot on %s' % str(device))
+ # Kill if adb_reboot is already running.
+ try:
+ # Don't try to kill adb_reboot more than once. We don't expect it to be
+ # running at all.
+ device.KillAll('adb_reboot', blocking=True, timeout=2, retries=0)
+ except device_errors.CommandFailedError:
+ # We can safely ignore the exception because we don't expect adb_reboot
+ # to be running.
+ pass
+ # Push adb_reboot
+ logging.info(' Pushing adb_reboot ...')
+ adb_reboot = os.path.join(constants.DIR_SOURCE_ROOT,
+ 'out/%s/adb_reboot' % target)
+ device.PushChangedFiles(adb_reboot, '/data/local/tmp/')
+ # Launch adb_reboot
+ logging.info(' Launching adb_reboot ...')
+ device.old_interface.GetAndroidToolStatusAndOutput(
+ '/data/local/tmp/adb_reboot')
def _ConfigureLocalProperties(device, is_perf):
"""Set standard readonly testing device properties prior to reboot."""
local_props = [
+ 'persist.sys.usb.config=adb',
'ro.monkey=1',
'ro.test_harness=1',
'ro.audio.silent=1',
@@ -138,135 +136,90 @@ def WipeDeviceData(device):
as_root=True)
-def WipeDevicesIfPossible(devices):
- devices_to_reboot = []
- for device_serial in devices:
- device = device_utils.DeviceUtils(device_serial)
- if not device.old_interface.EnableAdbRoot():
- continue
+def WipeDeviceIfPossible(device):
+ try:
+ device.EnableRoot()
WipeDeviceData(device)
- devices_to_reboot.append(device)
-
- if devices_to_reboot:
- try:
- device_utils.DeviceUtils.parallel(devices_to_reboot).Reboot(True)
- except errors.DeviceUnresponsiveError:
- pass
- for device_serial in devices_to_reboot:
- device.WaitUntilFullyBooted(timeout=90)
-
-
-def ProvisionDevice(device_serial, is_perf, disable_location):
- device = device_utils.DeviceUtils(device_serial)
- device.old_interface.EnableAdbRoot()
- _ConfigureLocalProperties(device, is_perf)
- device_settings.ConfigureContentSettings(
- device, device_settings.DETERMINISTIC_DEVICE_SETTINGS)
- if disable_location:
- device_settings.ConfigureContentSettings(
- device, device_settings.DISABLE_LOCATION_SETTINGS)
- else:
- device_settings.ConfigureContentSettings(
- device, device_settings.ENABLE_LOCATION_SETTINGS)
- device_settings.SetLockScreenSettings(device)
- if is_perf:
- # TODO(tonyg): We eventually want network on. However, currently radios
- # can cause perfbots to drain faster than they charge.
+ device.Reboot(True, timeout=180, retries=0)
+ except (errors.DeviceUnresponsiveError, device_errors.CommandFailedError):
+ pass
+
+
+def ProvisionDevice(device, options, is_perf):
+ try:
+ if not options.skip_wipe:
+ WipeDeviceIfPossible(device)
+ device.EnableRoot()
+ _ConfigureLocalProperties(device, is_perf)
device_settings.ConfigureContentSettings(
- device, device_settings.NETWORK_DISABLED_SETTINGS)
- # Some perf bots run benchmarks with USB charging disabled which leads
- # to gradual draining of the battery. We must wait for a full charge
- # before starting a run in order to keep the devices online.
- try:
- battery_info = device.old_interface.GetBatteryInfo()
- except Exception as e:
- battery_info = {}
- logging.error('Unable to obtain battery info for %s, %s',
- device_serial, e)
-
- while int(battery_info.get('level', 100)) < 95:
- if not device.old_interface.IsDeviceCharging():
- if device.old_interface.CanControlUsbCharging():
- device.old_interface.EnableUsbCharging()
- else:
- logging.error('Device is not charging')
- break
- logging.info('Waiting for device to charge. Current level=%s',
+ device, device_settings.DETERMINISTIC_DEVICE_SETTINGS)
+ if options.disable_location:
+ device_settings.ConfigureContentSettings(
+ device, device_settings.DISABLE_LOCATION_SETTINGS)
+ else:
+ device_settings.ConfigureContentSettings(
+ device, device_settings.ENABLE_LOCATION_SETTINGS)
+ device_settings.SetLockScreenSettings(device)
+ if is_perf:
+ # TODO(tonyg): We eventually want network on. However, currently radios
+ # can cause perfbots to drain faster than they charge.
+ device_settings.ConfigureContentSettings(
+ device, device_settings.NETWORK_DISABLED_SETTINGS)
+ # Some perf bots run benchmarks with USB charging disabled which leads
+ # to gradual draining of the battery. We must wait for a full charge
+ # before starting a run in order to keep the devices online.
+ try:
+ battery_info = device.old_interface.GetBatteryInfo()
+ except Exception as e:
+ battery_info = {}
+ logging.error('Unable to obtain battery info for %s, %s',
+ str(device), e)
+
+ while int(battery_info.get('level', 100)) < 95:
+ if not device.old_interface.IsDeviceCharging():
+ if device.old_interface.CanControlUsbCharging():
+ device.old_interface.EnableUsbCharging()
+ else:
+ logging.error('Device is not charging')
+ break
+ logging.info('Waiting for device to charge. Current level=%s',
battery_info.get('level', 0))
- time.sleep(60)
- battery_info = device.old_interface.GetBatteryInfo()
- device.RunShellCommand('date -u %f' % time.time(), as_root=True)
+ time.sleep(60)
+ battery_info = device.old_interface.GetBatteryInfo()
+ device.RunShellCommand('date -u %f' % time.time(), as_root=True)
+ device.Reboot(True, timeout=180, retries=0)
+ props = device.RunShellCommand('getprop')
+ for prop in props:
+ logging.info(' %s' % prop)
+ if options.auto_reconnect:
+ PushAndLaunchAdbReboot(device, options.target)
+ except (errors.WaitForResponseTimedOutError,
+ device_errors.CommandTimeoutError):
+ logging.info('Timed out waiting for device %s. Adding to blacklist.',
+ str(device))
+ # Device black list is reset by bb_device_status_check.py per build.
+ device_blacklist.ExtendBlacklist([str(device)])
+ except (device_errors.CommandFailedError):
+ logging.info('Failed to provision device %s. Adding to blacklist.',
+ str(device))
+ device_blacklist.ExtendBlacklist([str(device)])
def ProvisionDevices(options):
is_perf = 'perf' in os.environ.get('BUILDBOT_BUILDERNAME', '').lower()
- # TODO(jbudorick): Parallelize provisioning of all attached devices after
- # switching from AndroidCommands.
if options.device is not None:
devices = [options.device]
else:
devices = android_commands.GetAttachedDevices()
- # Wipe devices (unless --skip-wipe was specified)
- if not options.skip_wipe:
- WipeDevicesIfPossible(devices)
-
- bad_devices = []
- # Provision devices
- for device_serial in devices:
- try:
- ProvisionDevice(device_serial, is_perf, options.disable_location)
- except (errors.WaitForResponseTimedOutError,
- device_errors.CommandTimeoutError):
- logging.info('Timed out waiting for device %s. Adding to blacklist.',
- device_serial)
- bad_devices.append(device_serial)
- # Device black list is reset by bb_device_status_check.py per build.
- device_blacklist.ExtendBlacklist([device_serial])
- except device_errors.CommandFailedError:
- logging.info('Failed to provision device %s. Adding to blacklist.',
- device_serial)
- bad_devices.append(device_serial)
- device_blacklist.ExtendBlacklist([device_serial])
- devices = [device for device in devices if device not in bad_devices]
-
- # If there are no good devices
- if not devices:
- raise device_errors.NoDevicesError
-
- try:
- device_utils.DeviceUtils.parallel(devices).Reboot(True)
- except errors.DeviceUnresponsiveError:
- pass
-
- bad_devices = []
- for device_serial in devices:
- device = device_utils.DeviceUtils(device_serial)
- try:
- device.WaitUntilFullyBooted(timeout=90)
- (_, prop) = device.old_interface.GetShellCommandStatusAndOutput('getprop')
- for p in prop:
- logging.info(p)
- except (errors.WaitForResponseTimedOutError,
- device_errors.CommandTimeoutError):
- logging.info('Timed out waiting for device %s. Adding to blacklist.',
- device_serial)
- bad_devices.append(device_serial)
- # Device black list is reset by bb_device_status_check.py per build.
- device_blacklist.ExtendBlacklist([device_serial])
- except device_errors.CommandFailedError:
- logging.info('Failed to provision device %s. Adding to blacklist.',
- device_serial)
- bad_devices.append(device_serial)
- device_blacklist.ExtendBlacklist([device_serial])
- devices = [device for device in devices if device not in bad_devices]
-
- # If there are no good devices
- if not devices:
- raise device_errors.NoDevicesError
-
+ parallel_devices = device_utils.DeviceUtils.parallel(devices)
+ parallel_devices.pMap(ProvisionDevice, options, is_perf)
if options.auto_reconnect:
- PushAndLaunchAdbReboot(devices, options.target)
+ LaunchHostHeartbeat()
+ blacklist = device_blacklist.ReadBlacklist()
+ if all(d in blacklist for d in devices):
+ raise device_errors.NoDevicesError
+ return 0
def main(argv):
@@ -293,7 +246,7 @@ def main(argv):
print >> sys.stderr, 'Unused args %s' % args
return 1
- ProvisionDevices(options)
+ return ProvisionDevices(options)
if __name__ == '__main__':
« no previous file with comments | « no previous file | build/android/pylib/device/device_blacklist.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698