aboutsummaryrefslogtreecommitdiff
path: root/catapult/telemetry/telemetry/internal/platform/profiler/android_systrace_profiler.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/telemetry/telemetry/internal/platform/profiler/android_systrace_profiler.py')
-rw-r--r--catapult/telemetry/telemetry/internal/platform/profiler/android_systrace_profiler.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/catapult/telemetry/telemetry/internal/platform/profiler/android_systrace_profiler.py b/catapult/telemetry/telemetry/internal/platform/profiler/android_systrace_profiler.py
new file mode 100644
index 00000000..a8523b9b
--- /dev/null
+++ b/catapult/telemetry/telemetry/internal/platform/profiler/android_systrace_profiler.py
@@ -0,0 +1,78 @@
+# 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 StringIO
+import subprocess
+import zipfile
+
+from telemetry.core import util
+from telemetry.internal.backends.chrome import android_browser_finder
+from telemetry.internal.platform import profiler
+from telemetry.timeline import trace_data as trace_data_module
+from telemetry.timeline import tracing_config
+
+_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,
+ device=None):
+ 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.
+ config = tracing_config.TracingConfig()
+ config.enable_chrome_trace = True
+ self._browser_backend.StartTracing(config, timeout=10)
+ command = ['python', os.path.join(util.GetCatapultDir(), 'systrace', 'bin',
+ 'adb_profile_chrome'),
+ '--categories', '', '--continuous', '--output',
+ self._systrace_output_path, '--json', '--systrace',
+ ','.join(_SYSTRACE_CATEGORIES)]
+ if device:
+ command.extend(['--device', device])
+ self._profiler = subprocess.Popen(command, 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_builder = trace_data_module.TraceDataBuilder()
+ self._browser_backend.StopTracing(trace_result_builder)
+ trace_result = trace_result_builder.AsData()
+
+ 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]