OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2015 The Chromium Authors. All rights reserved. | 2 # Copyright 2015 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 from skypy.skyserver import SkyServer | 6 from skypy.skyserver import SkyServer |
7 import argparse | 7 import argparse |
8 import json | 8 import json |
9 import logging | 9 import logging |
10 import os | 10 import os |
| 11 import re |
11 import subprocess | 12 import subprocess |
12 import sys | 13 import sys |
| 14 import time |
13 import urlparse | 15 import urlparse |
14 | 16 |
15 SKY_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) | 17 SKY_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) |
16 SKY_ROOT = os.path.dirname(SKY_TOOLS_DIR) | 18 SKY_ROOT = os.path.dirname(SKY_TOOLS_DIR) |
17 SRC_ROOT = os.path.dirname(SKY_ROOT) | 19 SRC_ROOT = os.path.dirname(SKY_ROOT) |
18 | 20 |
19 SKY_SERVER_PORT = 9888 | 21 SKY_SERVER_PORT = 9888 |
20 DEFAULT_URL = "sky://domokit.github.io/home" | 22 DEFAULT_URL = "sky://domokit.github.io/home" |
21 APK_NAME = 'SkyDemo.apk' | 23 APK_NAME = 'SkyDemo.apk' |
22 ADB_PATH = os.path.join(SRC_ROOT, | 24 ADB_PATH = os.path.join(SRC_ROOT, |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 mojo_core_path = os.path.join(SRC_ROOT, 'mojo/public/dart/core.dart') | 223 mojo_core_path = os.path.join(SRC_ROOT, 'mojo/public/dart/core.dart') |
222 analyzer_args = [ANALYZER_PATH, | 224 analyzer_args = [ANALYZER_PATH, |
223 "--url-mapping=dart:sky,%s" % dart_sky_path, | 225 "--url-mapping=dart:sky,%s" % dart_sky_path, |
224 "--url-mapping=dart:sky_builtin,%s" % sky_builtin_path, | 226 "--url-mapping=dart:sky_builtin,%s" % sky_builtin_path, |
225 "--url-mapping=dart:mojo.bindings,%s" % mojo_bindings_path, | 227 "--url-mapping=dart:mojo.bindings,%s" % mojo_bindings_path, |
226 "--url-mapping=dart:mojo.core,%s" % mojo_core_path, | 228 "--url-mapping=dart:mojo.core,%s" % mojo_core_path, |
227 args.app_path | 229 args.app_path |
228 ] | 230 ] |
229 subprocess.call(analyzer_args) | 231 subprocess.call(analyzer_args) |
230 | 232 |
| 233 class StartTracing(object): |
| 234 def add_subparser(self, subparsers): |
| 235 start_tracing_parser = subparsers.add_parser('start_tracing', |
| 236 help=('start tracing a running sky instance')) |
| 237 start_tracing_parser.set_defaults(func=self.run) |
| 238 |
| 239 def run(self, args, pids): |
| 240 subprocess.check_output([ADB_PATH, 'shell', |
| 241 'am', 'broadcast', |
| 242 '-a', 'org.domokit.sky.demo.TRACING_START']) |
| 243 |
| 244 |
| 245 TRACE_COMPLETE_REGEXP = re.compile('Trace complete') |
| 246 TRACE_FILE_REGEXP = re.compile(r'Saving trace to (?P<path>\S+)') |
| 247 |
| 248 class StopTracing(object): |
| 249 def add_subparser(self, subparsers): |
| 250 stop_tracing_parser = subparsers.add_parser('stop_tracing', |
| 251 help=('stop tracing a running sky instance')) |
| 252 stop_tracing_parser.set_defaults(func=self.run) |
| 253 |
| 254 def run(self, args, pids): |
| 255 subprocess.check_output([ADB_PATH, 'logcat', '-c']) |
| 256 subprocess.check_output([ADB_PATH, 'shell', |
| 257 'am', 'broadcast', |
| 258 '-a', 'org.domokit.sky.demo.TRACING_STOP']) |
| 259 device_path = None |
| 260 is_complete = False |
| 261 while not is_complete: |
| 262 time.sleep(0.2) |
| 263 log = subprocess.check_output([ADB_PATH, 'logcat', '-d']) |
| 264 if device_path is None: |
| 265 result = TRACE_FILE_REGEXP.search(log) |
| 266 if result: |
| 267 device_path = result.group('path') |
| 268 is_complete = TRACE_COMPLETE_REGEXP.search(log) is not None |
| 269 |
| 270 print 'Downloading trace %s ...' % os.path.basename(device_path) |
| 271 |
| 272 if device_path: |
| 273 subprocess.check_output([ADB_PATH, 'pull', device_path]) |
| 274 subprocess.check_output([ADB_PATH, 'shell', 'rm', device_path]) |
| 275 |
231 | 276 |
232 class SkyShellRunner(object): | 277 class SkyShellRunner(object): |
233 def main(self): | 278 def main(self): |
234 logging.basicConfig(level=logging.WARNING) | 279 logging.basicConfig(level=logging.WARNING) |
235 | 280 |
236 parser = argparse.ArgumentParser(description='Sky Shell Runner') | 281 parser = argparse.ArgumentParser(description='Sky Shell Runner') |
237 subparsers = parser.add_subparsers(help='sub-command help') | 282 subparsers = parser.add_subparsers(help='sub-command help') |
238 | 283 |
239 for command in [StartSky(), StopSky(), Analyze()]: | 284 commands = [ |
| 285 StartSky(), |
| 286 StopSky(), |
| 287 Analyze(), |
| 288 StartTracing(), |
| 289 StopTracing(), |
| 290 ] |
| 291 |
| 292 for command in commands: |
240 command.add_subparser(subparsers) | 293 command.add_subparser(subparsers) |
241 | 294 |
242 args = parser.parse_args() | 295 args = parser.parse_args() |
243 pids = Pids.read_from(PID_FILE_PATH, PID_FILE_KEYS) | 296 pids = Pids.read_from(PID_FILE_PATH, PID_FILE_KEYS) |
244 exit_code = args.func(args, pids) | 297 exit_code = args.func(args, pids) |
245 # We could do this with an at-exit handler instead? | 298 # We could do this with an at-exit handler instead? |
246 pids.write_to(PID_FILE_PATH) | 299 pids.write_to(PID_FILE_PATH) |
247 sys.exit(exit_code) | 300 sys.exit(exit_code) |
248 | 301 |
249 | 302 |
250 if __name__ == '__main__': | 303 if __name__ == '__main__': |
251 SkyShellRunner().main() | 304 SkyShellRunner().main() |
OLD | NEW |