99 lines
3.0 KiB
Python
99 lines
3.0 KiB
Python
# 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.
|
|
|
|
import optparse
|
|
import os
|
|
import re
|
|
|
|
import py_utils
|
|
|
|
from profile_chrome import util
|
|
from systrace import trace_result
|
|
from systrace import tracing_agents
|
|
|
|
|
|
_DDMS_SAMPLING_FREQUENCY_US = 100
|
|
|
|
|
|
class DdmsAgent(tracing_agents.TracingAgent):
|
|
def __init__(self, device, package_info):
|
|
tracing_agents.TracingAgent.__init__(self)
|
|
self._device = device
|
|
self._package = package_info.package
|
|
self._output_file = None
|
|
self._supports_sampling = self._SupportsSampling()
|
|
|
|
def __repr__(self):
|
|
return 'ddms profile'
|
|
|
|
def _SupportsSampling(self):
|
|
for line in self._device.RunShellCommand(
|
|
['am', '--help'], check_return=True):
|
|
if re.match(r'.*am profile start.*--sampling', line):
|
|
return True
|
|
return False
|
|
|
|
@py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
|
|
def StartAgentTracing(self, config, timeout=None):
|
|
self._output_file = (
|
|
'/data/local/tmp/ddms-profile-%s' % util.GetTraceTimestamp())
|
|
cmd = ['am', 'profile', 'start']
|
|
if self._supports_sampling:
|
|
cmd.extend(['--sampling', str(_DDMS_SAMPLING_FREQUENCY_US)])
|
|
cmd.extend([self._package, self._output_file])
|
|
self._device.RunShellCommand(cmd, check_return=True)
|
|
return True
|
|
|
|
@py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
|
|
def StopAgentTracing(self, timeout=None):
|
|
self._device.RunShellCommand(
|
|
['am', 'profile', 'stop', self._package], check_return=True)
|
|
return True
|
|
|
|
@py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
|
|
def GetResults(self, timeout=None):
|
|
with open(self._PullTrace(), 'r') as f:
|
|
trace_data = f.read()
|
|
return trace_result.TraceResult('ddms', trace_data)
|
|
|
|
def _PullTrace(self):
|
|
if not self._output_file:
|
|
return None
|
|
|
|
host_file = os.path.join(
|
|
os.path.curdir, os.path.basename(self._output_file))
|
|
self._device.PullFile(self._output_file, host_file)
|
|
return host_file
|
|
|
|
def SupportsExplicitClockSync(self):
|
|
return False
|
|
|
|
def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
|
|
# pylint: disable=unused-argument
|
|
assert self.SupportsExplicitClockSync(), ('Clock sync marker cannot be '
|
|
'recorded since explicit clock sync is not supported.')
|
|
|
|
|
|
class DdmsConfig(tracing_agents.TracingConfig):
|
|
def __init__(self, device, package_info, ddms):
|
|
tracing_agents.TracingConfig.__init__(self)
|
|
self.device = device
|
|
self.package_info = package_info
|
|
self.ddms = ddms
|
|
|
|
|
|
def try_create_agent(config):
|
|
if config.ddms:
|
|
return DdmsAgent(config.device, config.package_info)
|
|
return None
|
|
|
|
def add_options(parser):
|
|
options = optparse.OptionGroup(parser, 'Java tracing')
|
|
options.add_option('--ddms', help='Trace Java execution using DDMS '
|
|
'sampling.', action='store_true')
|
|
return options
|
|
|
|
def get_config(options):
|
|
return DdmsConfig(options.device, options.package_info, options.ddms)
|