| # Copyright 2021 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. |
| """ |
| This script runs Android perfetto tracing, located in the |
| third_party/catapult folder. It is consumed as a library by the |
| executable profile_chrome_startup script. |
| """ |
| |
| import os |
| import sys |
| |
| _CATAPULT_DIR = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, |
| 'third_party', 'catapult') |
| |
| sys.path.insert(0, os.path.join(_CATAPULT_DIR, 'systrace')) |
| sys.path.insert(0, os.path.join(_CATAPULT_DIR, 'devil')) |
| |
| from profile_chrome import chrome_startup_tracing_agent |
| from profile_chrome import profiler |
| from profile_chrome import flags |
| from systrace import util |
| from devil.android import device_utils |
| from devil.android.sdk import adb_wrapper |
| |
| _CHROME_STARTUP_MODULES = [chrome_startup_tracing_agent] |
| |
| |
| def ProfileChrome(options): |
| """Profiles chrome on Android and saves the trace file to output file. |
| |
| Args: |
| options: Command line flags with their specified values as |
| returned by optparse. |
| |
| Returns: |
| Path to Android profetto trace file |
| """ |
| if not options.device_serial_number: |
| # Find the serial number of the connected device. |
| devices = [a.GetDeviceSerial() for a in adb_wrapper.AdbWrapper.Devices()] |
| if len(devices) == 0: |
| raise RuntimeError('No ADB devices connected.') |
| if len(devices) >= 2: |
| raise RuntimeError('Multiple devices connected, serial number ' + |
| 'required. Specify the -e flag.') |
| options.device_serial_number = devices[0] |
| |
| # Check if the device is healthy. |
| devices = device_utils.DeviceUtils.HealthyDevices() |
| device = None |
| for d in devices: |
| if d.serial == options.device_serial_number: |
| device = d |
| break |
| if device is None: |
| raise RuntimeError('No valid connected devices. Check the device ' + |
| 'serial number.') |
| package_info = util.get_supported_browsers()[options.browser] |
| |
| options.device = device |
| options.package_info = package_info |
| |
| # Ensure compatibility between trace_format and write_json flags. |
| # trace_format is preferred. write_json is supported for backward |
| # compatibility reasons. |
| flags.ParseFormatFlags(options) |
| |
| # Set to root permissions since CaptureProfile() reads app data |
| # to pull the trace. |
| adb_wrapper.AdbWrapper(options.device).Root() |
| |
| trace_file = profiler.CaptureProfile(options, |
| options.trace_time, |
| _CHROME_STARTUP_MODULES, |
| output=options.output_file, |
| compress=options.compress, |
| trace_format=options.trace_format) |
| |
| return trace_file |