| Index: build/android/devil/android/fastboot_utils.py
|
| diff --git a/build/android/devil/android/fastboot_utils.py b/build/android/devil/android/fastboot_utils.py
|
| deleted file mode 100644
|
| index 587f42fd02ce0bec28a2521c5afa9c65d30c0bbc..0000000000000000000000000000000000000000
|
| --- a/build/android/devil/android/fastboot_utils.py
|
| +++ /dev/null
|
| @@ -1,245 +0,0 @@
|
| -# Copyright 2015 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.
|
| -
|
| -"""Provides a variety of device interactions based on fastboot."""
|
| -# pylint: disable=unused-argument
|
| -
|
| -import contextlib
|
| -import fnmatch
|
| -import logging
|
| -import os
|
| -import re
|
| -
|
| -from devil.android import decorators
|
| -from devil.android import device_errors
|
| -from devil.android.sdk import fastboot
|
| -from devil.utils import timeout_retry
|
| -
|
| -_DEFAULT_TIMEOUT = 30
|
| -_DEFAULT_RETRIES = 3
|
| -_FASTBOOT_REBOOT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
|
| -ALL_PARTITIONS = [
|
| - 'bootloader',
|
| - 'radio',
|
| - 'boot',
|
| - 'recovery',
|
| - 'system',
|
| - 'userdata',
|
| - 'cache',
|
| -]
|
| -
|
| -class FastbootUtils(object):
|
| -
|
| - _FASTBOOT_WAIT_TIME = 1
|
| - _RESTART_WHEN_FLASHING = ['bootloader', 'radio']
|
| - _BOARD_VERIFICATION_FILE = 'android-info.txt'
|
| - _FLASH_IMAGE_FILES = {
|
| - 'bootloader': 'bootloader*.img',
|
| - 'radio': 'radio*.img',
|
| - 'boot': 'boot.img',
|
| - 'recovery': 'recovery.img',
|
| - 'system': 'system.img',
|
| - 'userdata': 'userdata.img',
|
| - 'cache': 'cache.img',
|
| - }
|
| -
|
| - def __init__(self, device, fastbooter=None, default_timeout=_DEFAULT_TIMEOUT,
|
| - default_retries=_DEFAULT_RETRIES):
|
| - """FastbootUtils constructor.
|
| -
|
| - Example Usage to flash a device:
|
| - fastboot = fastboot_utils.FastbootUtils(device)
|
| - fastboot.FlashDevice('/path/to/build/directory')
|
| -
|
| - Args:
|
| - device: A DeviceUtils instance.
|
| - fastbooter: Optional fastboot object. If none is passed, one will
|
| - be created.
|
| - default_timeout: An integer containing the default number of seconds to
|
| - wait for an operation to complete if no explicit value is provided.
|
| - default_retries: An integer containing the default number or times an
|
| - operation should be retried on failure if no explicit value is provided.
|
| - """
|
| - self._device = device
|
| - self._board = device.product_board
|
| - self._serial = str(device)
|
| - self._default_timeout = default_timeout
|
| - self._default_retries = default_retries
|
| - if fastbooter:
|
| - self.fastboot = fastbooter
|
| - else:
|
| - self.fastboot = fastboot.Fastboot(self._serial)
|
| -
|
| - @decorators.WithTimeoutAndRetriesFromInstance()
|
| - def WaitForFastbootMode(self, timeout=None, retries=None):
|
| - """Wait for device to boot into fastboot mode.
|
| -
|
| - This waits for the device serial to show up in fastboot devices output.
|
| - """
|
| - def fastboot_mode():
|
| - return self._serial in self.fastboot.Devices()
|
| -
|
| - timeout_retry.WaitFor(fastboot_mode, wait_period=self._FASTBOOT_WAIT_TIME)
|
| -
|
| - @decorators.WithTimeoutAndRetriesFromInstance(
|
| - min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
|
| - def EnableFastbootMode(self, timeout=None, retries=None):
|
| - """Reboots phone into fastboot mode.
|
| -
|
| - Roots phone if needed, then reboots phone into fastboot mode and waits.
|
| - """
|
| - self._device.EnableRoot()
|
| - self._device.adb.Reboot(to_bootloader=True)
|
| - self.WaitForFastbootMode()
|
| -
|
| - @decorators.WithTimeoutAndRetriesFromInstance(
|
| - min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
|
| - def Reboot(self, bootloader=False, timeout=None, retries=None):
|
| - """Reboots out of fastboot mode.
|
| -
|
| - It reboots the phone either back into fastboot, or to a regular boot. It
|
| - then blocks until the device is ready.
|
| -
|
| - Args:
|
| - bootloader: If set to True, reboots back into bootloader.
|
| - """
|
| - if bootloader:
|
| - self.fastboot.RebootBootloader()
|
| - self.WaitForFastbootMode()
|
| - else:
|
| - self.fastboot.Reboot()
|
| - self._device.WaitUntilFullyBooted(timeout=_FASTBOOT_REBOOT_TIMEOUT)
|
| -
|
| - def _VerifyBoard(self, directory):
|
| - """Validate as best as possible that the android build matches the device.
|
| -
|
| - Goes through build files and checks if the board name is mentioned in the
|
| - |self._BOARD_VERIFICATION_FILE| or in the build archive.
|
| -
|
| - Args:
|
| - directory: directory where build files are located.
|
| - """
|
| - files = os.listdir(directory)
|
| - board_regex = re.compile(r'require board=(\w+)')
|
| - if self._BOARD_VERIFICATION_FILE in files:
|
| - with open(os.path.join(directory, self._BOARD_VERIFICATION_FILE)) as f:
|
| - for line in f:
|
| - m = board_regex.match(line)
|
| - if m:
|
| - board_name = m.group(1)
|
| - if board_name == self._board:
|
| - return True
|
| - elif board_name:
|
| - return False
|
| - else:
|
| - logging.warning('No board type found in %s.',
|
| - self._BOARD_VERIFICATION_FILE)
|
| - else:
|
| - logging.warning('%s not found. Unable to use it to verify device.',
|
| - self._BOARD_VERIFICATION_FILE)
|
| -
|
| - zip_regex = re.compile(r'.*%s.*\.zip' % re.escape(self._board))
|
| - for f in files:
|
| - if zip_regex.match(f):
|
| - return True
|
| -
|
| - return False
|
| -
|
| - def _FindAndVerifyPartitionsAndImages(self, partitions, directory):
|
| - """Validate partitions and images.
|
| -
|
| - Validate all partition names and partition directories. Cannot stop mid
|
| - flash so its important to validate everything first.
|
| -
|
| - Args:
|
| - Partitions: partitions to be tested.
|
| - directory: directory containing the images.
|
| -
|
| - Returns:
|
| - Dictionary with exact partition, image name mapping.
|
| - """
|
| - files = os.listdir(directory)
|
| -
|
| - def find_file(pattern):
|
| - for filename in files:
|
| - if fnmatch.fnmatch(filename, pattern):
|
| - return os.path.join(directory, filename)
|
| - raise device_errors.FastbootCommandFailedError(
|
| - 'Failed to flash device. Counld not find image for %s.', pattern)
|
| -
|
| - return {name: find_file(self._FLASH_IMAGE_FILES[name])
|
| - for name in partitions}
|
| -
|
| - def _FlashPartitions(self, partitions, directory, wipe=False, force=False):
|
| - """Flashes all given partiitons with all given images.
|
| -
|
| - Args:
|
| - partitions: List of partitions to flash.
|
| - directory: Directory where all partitions can be found.
|
| - wipe: If set to true, will automatically detect if cache and userdata
|
| - partitions are sent, and if so ignore them.
|
| - force: boolean to decide to ignore board name safety checks.
|
| -
|
| - Raises:
|
| - device_errors.CommandFailedError(): If image cannot be found or if bad
|
| - partition name is give.
|
| - """
|
| - if not self._VerifyBoard(directory):
|
| - if force:
|
| - logging.warning('Could not verify build is meant to be installed on '
|
| - 'the current device type, but force flag is set. '
|
| - 'Flashing device. Possibly dangerous operation.')
|
| - else:
|
| - raise device_errors.CommandFailedError(
|
| - 'Could not verify build is meant to be installed on the current '
|
| - 'device type. Run again with force=True to force flashing with an '
|
| - 'unverified board.')
|
| -
|
| - flash_image_files = self._FindAndVerifyPartitionsAndImages(partitions,
|
| - directory)
|
| - for partition in partitions:
|
| - if partition in ['cache', 'userdata'] and not wipe:
|
| - logging.info(
|
| - 'Not flashing in wipe mode. Skipping partition %s.', partition)
|
| - else:
|
| - logging.info(
|
| - 'Flashing %s with %s', partition, flash_image_files[partition])
|
| - self.fastboot.Flash(partition, flash_image_files[partition])
|
| - if partition in self._RESTART_WHEN_FLASHING:
|
| - self.Reboot(bootloader=True)
|
| -
|
| - @contextlib.contextmanager
|
| - def FastbootMode(self, timeout=None, retries=None):
|
| - """Context manager that enables fastboot mode, and reboots after.
|
| -
|
| - Example usage:
|
| - with FastbootMode():
|
| - Flash Device
|
| - # Anything that runs after flashing.
|
| - """
|
| - self.EnableFastbootMode()
|
| - self.fastboot.SetOemOffModeCharge(False)
|
| - try:
|
| - yield self
|
| - finally:
|
| - self.fastboot.SetOemOffModeCharge(True)
|
| - self.Reboot()
|
| -
|
| - def FlashDevice(self, directory, partitions=None, wipe=False):
|
| - """Flash device with build in |directory|.
|
| -
|
| - Directory must contain bootloader, radio, boot, recovery, system, userdata,
|
| - and cache .img files from an android build. This is a dangerous operation so
|
| - use with care.
|
| -
|
| - Args:
|
| - fastboot: A FastbootUtils instance.
|
| - directory: Directory with build files.
|
| - wipe: Wipes cache and userdata if set to true.
|
| - partitions: List of partitions to flash. Defaults to all.
|
| - """
|
| - if partitions is None:
|
| - partitions = ALL_PARTITIONS
|
| - with self.FastbootMode():
|
| - self._FlashPartitions(partitions, directory, wipe=wipe)
|
|
|