Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / core / platform / profiler / android_traceview_profiler.py
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.
4
5 import os
6
7 from telemetry.core import util
8 from telemetry.core.backends.chrome import android_browser_finder
9 from telemetry.core.platform import profiler
10
11
12 class AndroidTraceviewProfiler(profiler.Profiler):
13   """Collects a Traceview on Android."""
14
15   _DEFAULT_DEVICE_DIR = '/data/local/tmp/traceview'
16
17   def __init__(self, browser_backend, platform_backend, output_path, state):
18     super(AndroidTraceviewProfiler, self).__init__(
19         browser_backend, platform_backend, output_path, state)
20
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, '*'))
25     else:
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)
30
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))
37
38
39   @classmethod
40   def name(cls):
41     return 'android-traceview'
42
43   @classmethod
44   def is_supported(cls, browser_type):
45     if browser_type == 'any':
46       return android_browser_finder.CanFindAvailableBrowsers()
47     return browser_type.startswith('android')
48
49   def CollectProfile(self):
50     output_files = []
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.'
62     return output_files
63
64   def _FileSize(self, file_name):
65     f = self._browser_backend.adb.device().old_interface.ListPathContents(
66         file_name)
67     return f.get(os.path.basename(file_name), (0, ))[0]