1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
7 from telemetry.core import util
8 from telemetry.core.backends.chrome import android_browser_finder
9 from telemetry.core.platform import profiler
12 class AndroidTraceviewProfiler(profiler.Profiler):
13 """Collects a Traceview on Android."""
15 _DEFAULT_DEVICE_DIR = '/data/local/tmp/traceview'
17 def __init__(self, browser_backend, platform_backend, output_path, state):
18 super(AndroidTraceviewProfiler, self).__init__(
19 browser_backend, platform_backend, output_path, state)
21 if self._browser_backend.adb.device().old_interface.FileExistsOnDevice(
22 self._DEFAULT_DEVICE_DIR):
23 self._browser_backend.adb.RunShellCommand(
24 'rm ' + os.path.join(self._DEFAULT_DEVICE_DIR, '*'))
26 self._browser_backend.adb.RunShellCommand(
27 'mkdir -p ' + self._DEFAULT_DEVICE_DIR)
28 self._browser_backend.adb.RunShellCommand(
29 'chmod 777 ' + self._DEFAULT_DEVICE_DIR)
31 self._trace_files = []
32 for pid in self._GetProcessOutputFileMap().iterkeys():
33 device_dump_file = '%s/%s.trace' % (self._DEFAULT_DEVICE_DIR, pid)
34 self._trace_files.append((pid, device_dump_file))
35 self._browser_backend.adb.RunShellCommand('am profile %s start %s' %
36 (pid, device_dump_file))
41 return 'android-traceview'
44 def is_supported(cls, browser_type):
45 if browser_type == 'any':
46 return android_browser_finder.CanFindAvailableBrowsers()
47 return browser_type.startswith('android')
49 def CollectProfile(self):
51 for pid, trace_file in self._trace_files:
52 self._browser_backend.adb.RunShellCommand('am profile %s stop' % pid)
53 util.WaitFor(lambda: self._FileSize(trace_file) > 0, timeout=10)
54 output_files.append(trace_file)
55 self._browser_backend.adb.device().old_interface.Adb().Pull(
56 self._DEFAULT_DEVICE_DIR, self._output_path)
57 self._browser_backend.adb.RunShellCommand(
58 'rm ' + os.path.join(self._DEFAULT_DEVICE_DIR, '*'))
59 print 'Traceview profiles available in ', self._output_path
60 print 'Use third_party/android_tools/sdk/tools/monitor '
61 print 'then use "File->Open File" to visualize them.'
64 def _FileSize(self, file_name):
65 f = self._browser_backend.adb.device().old_interface.ListPathContents(
67 return f.get(os.path.basename(file_name), (0, ))[0]