| Index: tools/telemetry/telemetry/core/backends/chrome/android_browser_finder.py
|
| diff --git a/tools/telemetry/telemetry/core/backends/chrome/android_browser_finder.py b/tools/telemetry/telemetry/core/backends/chrome/android_browser_finder.py
|
| index 315e1f35245b57697ef6893f0c17f1e37b71f63c..9890ea4b0c6d6c3c133abeee9556d8ced83702eb 100644
|
| --- a/tools/telemetry/telemetry/core/backends/chrome/android_browser_finder.py
|
| +++ b/tools/telemetry/telemetry/core/backends/chrome/android_browser_finder.py
|
| @@ -4,7 +4,7 @@
|
|
|
| """Finds android browsers that can be controlled by telemetry."""
|
|
|
| -import logging
|
| +import logging as real_logging
|
| import os
|
| import re
|
| import subprocess
|
| @@ -12,13 +12,13 @@
|
|
|
| from telemetry import decorators
|
| from telemetry.core import browser
|
| -from telemetry.core import exceptions
|
| +from telemetry.core import platform
|
| from telemetry.core import possible_browser
|
| -from telemetry.core import platform
|
| from telemetry.core import util
|
| from telemetry.core.backends import adb_commands
|
| -from telemetry.core.platform import android_device
|
| from telemetry.core.backends.chrome import android_browser_backend
|
| +from telemetry.core.platform import android_platform_backend
|
| +from telemetry.core.platform.profiler import monsoon
|
|
|
| try:
|
| import psutil # pylint: disable=F0401
|
| @@ -69,16 +69,14 @@
|
| class PossibleAndroidBrowser(possible_browser.PossibleBrowser):
|
| """A launchable android browser instance."""
|
| def __init__(self, browser_type, finder_options, android_platform,
|
| - backend_settings, apk_name):
|
| + platform_backend, backend_settings, apk_name):
|
| super(PossibleAndroidBrowser, self).__init__(browser_type, 'android',
|
| finder_options, backend_settings.supports_tab_control)
|
| assert browser_type in FindAllBrowserTypes(finder_options), \
|
| ('Please add %s to android_browser_finder.FindAllBrowserTypes' %
|
| browser_type)
|
| self._platform = android_platform
|
| - self._platform_backend = (
|
| - android_platform._platform_backend # pylint: disable=W0212
|
| - )
|
| + self._platform_backend = platform_backend
|
| self._backend_settings = backend_settings
|
| self._local_apk = None
|
|
|
| @@ -114,8 +112,7 @@
|
| use_rndis_forwarder,
|
| output_profile_path=self.finder_options.output_profile_path,
|
| extensions_to_load=self.finder_options.extensions_to_load,
|
| - target_arch=self.finder_options.target_arch,
|
| - android_platform_backend=self._platform_backend)
|
| + target_arch=self.finder_options.target_arch)
|
| b = browser.Browser(backend, self._platform_backend)
|
| return b
|
|
|
| @@ -130,7 +127,7 @@
|
| @decorators.Cache
|
| def UpdateExecutableIfNeeded(self):
|
| if self.HaveLocalAPK():
|
| - logging.warn('Installing %s on device if needed.' % self._local_apk)
|
| + real_logging.warn('Installing %s on device if needed.' % self._local_apk)
|
| self.platform.InstallApplication(self._local_apk)
|
|
|
| def last_modification_time(self):
|
| @@ -149,7 +146,8 @@
|
| return None
|
|
|
|
|
| -def CanFindAvailableBrowsers():
|
| +@decorators.Cache
|
| +def CanFindAvailableBrowsers(logging=real_logging):
|
| if not adb_commands.IsAndroidSupported():
|
| logging.info('Android build commands unavailable on this machine. Have '
|
| 'you installed Android build dependencies?')
|
| @@ -178,36 +176,63 @@
|
| return False
|
|
|
|
|
| -def FindAllBrowserTypes(_options):
|
| +def FindAllBrowserTypes(_):
|
| return CHROME_PACKAGE_NAMES.keys()
|
|
|
|
|
| -def FindAllAvailableBrowsers(finder_options):
|
| +def FindAllAvailableBrowsers(finder_options, logging=real_logging):
|
| """Finds all the desktop browsers available on this machine."""
|
| - if not CanFindAvailableBrowsers():
|
| + if not CanFindAvailableBrowsers(logging=logging):
|
| logging.info('No adb command found. ' +
|
| 'Will not try searching for Android browsers.')
|
| return []
|
| - if finder_options.android_device:
|
| - devices = [android_device.AndroidDevice(finder_options.android_device,
|
| - finder_options.no_performance_mode,
|
| - logging)]
|
| - else:
|
| - devices = android_device.AndroidDevice.GetAllConnectedDevices()
|
| -
|
| - if len(devices) == 0:
|
| - logging.info('No android devices found.')
|
| - return []
|
| - elif len(devices) > 1:
|
| +
|
| + def _GetDevices():
|
| + if finder_options.android_device:
|
| + return [finder_options.android_device]
|
| + else:
|
| + return adb_commands.GetAttachedDevices()
|
| +
|
| + devices = _GetDevices()
|
| +
|
| + if not devices:
|
| + try:
|
| + m = monsoon.Monsoon(wait=False)
|
| + m.SetUsbPassthrough(1)
|
| + m.SetVoltage(3.8)
|
| + m.SetMaxCurrent(8)
|
| + logging.warn("""
|
| +Monsoon power monitor detected, but no Android devices.
|
| +
|
| +The Monsoon's power output has been enabled. Please now ensure that:
|
| +
|
| + 1. The Monsoon's front and back USB are connected to the host.
|
| + 2. The Device is connected to the Monsoon's main and USB channels.
|
| + 3. The Device is turned on.
|
| +
|
| +Waiting for device...
|
| +""")
|
| + util.WaitFor(_GetDevices, 600)
|
| + devices = _GetDevices()
|
| + if not devices:
|
| + raise IOError()
|
| + except IOError:
|
| + logging.info('No android devices found.')
|
| + return []
|
| +
|
| + if len(devices) > 1:
|
| logging.warn(
|
| 'Multiple devices attached. Please specify one of the following:\n' +
|
| - '\n'.join([' --device=%s' % d.device_id for d in devices]))
|
| + '\n'.join([' --device=%s' % d for d in devices]))
|
| return []
|
|
|
| - try:
|
| - android_platform = platform.GetPlatformForDevice(devices[0])
|
| - except exceptions.PlatformError:
|
| - return []
|
| + device = devices[0]
|
| + adb = adb_commands.AdbCommands(device=device)
|
| +
|
| + # Trying to root the device, if possible.
|
| + if not adb.IsRootEnabled():
|
| + # Ignore result.
|
| + adb.EnableAdbRoot()
|
|
|
| # Host side workaround for crbug.com/268450 (adb instability).
|
| # The adb server has a race which is mitigated by binding to a single core.
|
| @@ -226,14 +251,29 @@
|
| except (psutil.NoSuchProcess, psutil.AccessDenied):
|
| logging.warn('Failed to set adb process CPU affinity')
|
|
|
| + platform_backend = android_platform_backend.AndroidPlatformBackend(
|
| + adb.device(), finder_options.no_performance_mode)
|
| + android_platform = platform.Platform(platform_backend)
|
| +
|
| possible_browsers = []
|
| for name, package_info in CHROME_PACKAGE_NAMES.iteritems():
|
| [package, backend_settings, local_apk] = package_info
|
| b = PossibleAndroidBrowser(name,
|
| finder_options,
|
| android_platform,
|
| - backend_settings(package),
|
| + platform_backend,
|
| + backend_settings(adb, package),
|
| local_apk)
|
| if b.platform.CanLaunchApplication(package) or b.HaveLocalAPK():
|
| possible_browsers.append(b)
|
| +
|
| + if possible_browsers:
|
| + installed_prebuilt_tools = adb_commands.SetupPrebuiltTools(adb)
|
| + if not installed_prebuilt_tools:
|
| + logging.error(
|
| + 'Android device detected, however prebuilt android tools could not '
|
| + 'be used. To run on Android you must build them first:\n'
|
| + ' $ ninja -C out/Release android_tools')
|
| + return []
|
| +
|
| return possible_browsers
|
|
|