| Index: tools/telemetry/telemetry/core/platform/profiler/android_systrace_profiler.py
|
| diff --git a/tools/telemetry/telemetry/core/platform/profiler/android_systrace_profiler.py b/tools/telemetry/telemetry/core/platform/profiler/android_systrace_profiler.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fb4767c7e3656736db448144c00001eeaf851e0b
|
| --- /dev/null
|
| +++ b/tools/telemetry/telemetry/core/platform/profiler/android_systrace_profiler.py
|
| @@ -0,0 +1,69 @@
|
| +# Copyright 2013 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 os
|
| +import subprocess
|
| +import StringIO
|
| +import zipfile
|
| +
|
| +from telemetry.core import util
|
| +from telemetry.core.backends.chrome import android_browser_finder
|
| +from telemetry.core.platform import profiler
|
| +
|
| +_SYSTRACE_CATEGORIES = [
|
| + 'gfx',
|
| + 'input',
|
| + 'view',
|
| + 'sched',
|
| + 'freq',
|
| +]
|
| +
|
| +class AndroidSystraceProfiler(profiler.Profiler):
|
| + """Collects a Systrace on Android."""
|
| +
|
| + def __init__(self, browser_backend, platform_backend, output_path, state):
|
| + super(AndroidSystraceProfiler, self).__init__(
|
| + browser_backend, platform_backend, output_path, state)
|
| + assert self._browser_backend.supports_tracing
|
| + self._output_path = output_path + '-trace.zip'
|
| + self._systrace_output_path = output_path + '.systrace'
|
| +
|
| + # Use telemetry's own tracing backend instead the combined mode in
|
| + # adb_profile_chrome because some benchmarks also do tracing of their own
|
| + # and the two methods conflict.
|
| + self._browser_backend.StartTracing(None, timeout=10)
|
| + self._profiler = subprocess.Popen(
|
| + [os.path.join(util.GetChromiumSrcDir(),
|
| + 'build', 'android', 'adb_profile_chrome.py'),
|
| + '--categories', '', '--continuous', '--output',
|
| + self._systrace_output_path, '--systrace'] + _SYSTRACE_CATEGORIES,
|
| + stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
| +
|
| + @classmethod
|
| + def name(cls):
|
| + return 'android-systrace'
|
| +
|
| + @classmethod
|
| + def is_supported(cls, browser_type):
|
| + if browser_type == 'any':
|
| + return android_browser_finder.CanFindAvailableBrowsers()
|
| + return browser_type.startswith('android')
|
| +
|
| + def CollectProfile(self):
|
| + self._profiler.communicate(input='\n')
|
| + trace_result = self._browser_backend.StopTracing()
|
| + self._profiler.wait()
|
| +
|
| + trace_file = StringIO.StringIO()
|
| + trace_result.Serialize(trace_file)
|
| +
|
| + # Merge the chrome and systraces into a zip file.
|
| + with zipfile.ZipFile(self._output_path, 'w', zipfile.ZIP_DEFLATED) as z:
|
| + z.writestr('trace.json', trace_file.getvalue())
|
| + z.write(self._systrace_output_path, 'systrace')
|
| + os.unlink(self._systrace_output_path)
|
| +
|
| + print 'Systrace saved as %s' % self._output_path
|
| + print 'To view, open in chrome://tracing'
|
| + return [self._output_path]
|
|
|