| 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 |