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 re |
| 12 import signal |
12 import subprocess | 13 import subprocess |
13 import sys | 14 import sys |
14 import time | 15 import time |
15 import urlparse | 16 import urlparse |
16 | 17 |
17 SKY_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) | 18 SKY_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) |
18 SKY_ROOT = os.path.dirname(SKY_TOOLS_DIR) | 19 SKY_ROOT = os.path.dirname(SKY_TOOLS_DIR) |
19 SRC_ROOT = os.path.dirname(SKY_ROOT) | 20 SRC_ROOT = os.path.dirname(SKY_ROOT) |
20 | 21 |
21 SKY_SERVER_PORT = 9888 | 22 SKY_SERVER_PORT = 9888 |
22 DEFAULT_URL = "sky://domokit.github.io/home" | 23 DEFAULT_URL = "sky://domokit.github.io/home" |
23 APK_NAME = 'SkyDemo.apk' | 24 APK_NAME = 'SkyDemo.apk' |
24 ADB_PATH = os.path.join(SRC_ROOT, | 25 ADB_PATH = os.path.join(SRC_ROOT, |
25 'third_party/android_tools/sdk/platform-tools/adb') | 26 'third_party/android_tools/sdk/platform-tools/adb') |
26 | 27 ANDROID_PACKAGE = "org.domokit.sky.demo" |
27 | 28 |
28 PID_FILE_PATH = "/tmp/skydemo.pids" | 29 PID_FILE_PATH = "/tmp/skydemo.pids" |
29 PID_FILE_KEYS = frozenset([ | 30 PID_FILE_KEYS = frozenset([ |
30 'remote_sky_server_port', | 31 'remote_sky_server_port', |
31 'sky_server_pid', | 32 'sky_server_pid', |
32 'sky_server_port', | 33 'sky_server_port', |
33 'sky_server_root', | 34 'sky_server_root', |
34 'build_dir', | 35 'build_dir', |
35 ]) | 36 ]) |
36 | 37 |
(...skipping 25 matching lines...) Expand all Loading... |
62 def __iter__(self): | 63 def __iter__(self): |
63 return iter(self._dict) | 64 return iter(self._dict) |
64 | 65 |
65 def __contains__(self, key): | 66 def __contains__(self, key): |
66 assert key in self._known_keys, '%s not in allowed_keys' % key | 67 assert key in self._known_keys, '%s not in allowed_keys' % key |
67 return key in self._dict | 68 return key in self._dict |
68 | 69 |
69 def clear(self): | 70 def clear(self): |
70 self._dict = {} | 71 self._dict = {} |
71 | 72 |
| 73 def pop(self, key, default=None): |
| 74 assert key in self._known_keys, '%s not in allowed_keys' % key |
| 75 return self._dict.pop(key, default) |
| 76 |
72 @classmethod | 77 @classmethod |
73 def read_from(cls, path, known_keys): | 78 def read_from(cls, path, known_keys): |
74 contents = {} | 79 contents = {} |
75 try: | 80 try: |
76 with open(path, 'r') as pid_file: | 81 with open(path, 'r') as pid_file: |
77 contents = json.load(pid_file) | 82 contents = json.load(pid_file) |
78 except: | 83 except: |
79 if os.path.exists(path): | 84 if os.path.exists(path): |
80 logging.warn('Failed to read pid file: %s' % path) | 85 logging.warn('Failed to read pid file: %s' % path) |
81 return cls(known_keys, contents) | 86 return cls(known_keys, contents) |
(...skipping 17 matching lines...) Expand all Loading... |
99 if urlparse.urlparse(args.url_or_path).scheme: | 104 if urlparse.urlparse(args.url_or_path).scheme: |
100 return args.url_or_path | 105 return args.url_or_path |
101 # The load happens on the remote device, use the remote port. | 106 # The load happens on the remote device, use the remote port. |
102 remote_sky_server_port = pids.get('remote_sky_server_port', | 107 remote_sky_server_port = pids.get('remote_sky_server_port', |
103 pids['sky_server_port']) | 108 pids['sky_server_port']) |
104 url = SkyServer.url_for_path(remote_sky_server_port, | 109 url = SkyServer.url_for_path(remote_sky_server_port, |
105 pids['sky_server_root'], args.url_or_path) | 110 pids['sky_server_root'], args.url_or_path) |
106 return _convert_to_sky_url(url) | 111 return _convert_to_sky_url(url) |
107 | 112 |
108 | 113 |
| 114 def dev_sdk_root(build_dir): |
| 115 return os.path.join(build_dir, 'gen', 'sky_sdk') |
| 116 |
| 117 def dev_packages_root(build_dir): |
| 118 return os.path.join(dev_sdk_root(build_dir), 'packages_root') |
| 119 |
| 120 |
109 class StartSky(object): | 121 class StartSky(object): |
110 def add_subparser(self, subparsers): | 122 def add_subparser(self, subparsers): |
111 start_parser = subparsers.add_parser('start', | 123 start_parser = subparsers.add_parser('start', |
112 help='launch SKyShell.apk on the device') | 124 help='launch SKyShell.apk on the device') |
113 start_parser.add_argument('build_dir', type=str) | 125 start_parser.add_argument('build_dir', type=str) |
114 start_parser.add_argument('url_or_path', nargs='?', type=str, | 126 start_parser.add_argument('url_or_path', nargs='?', type=str, |
115 default=DEFAULT_URL) | 127 default=DEFAULT_URL) |
116 start_parser.add_argument('--no_install', action="store_false", | 128 start_parser.add_argument('--no_install', action="store_false", |
117 default=True, dest="install", | 129 default=True, dest="install", |
118 help="Don't install SkyDemo.apk before starting") | 130 help="Don't install SkyDemo.apk before starting") |
(...skipping 17 matching lines...) Expand all Loading... |
136 server_root = self._server_root_for_url(args.url_or_path) | 148 server_root = self._server_root_for_url(args.url_or_path) |
137 sky_server = SkyServer(SKY_SERVER_PORT, configuration, server_root, pack
ages_root) | 149 sky_server = SkyServer(SKY_SERVER_PORT, configuration, server_root, pack
ages_root) |
138 return sky_server | 150 return sky_server |
139 | 151 |
140 def run(self, args, pids): | 152 def run(self, args, pids): |
141 apk_path = os.path.join(args.build_dir, 'apks', APK_NAME) | 153 apk_path = os.path.join(args.build_dir, 'apks', APK_NAME) |
142 if not os.path.exists(apk_path): | 154 if not os.path.exists(apk_path): |
143 print "'%s' does not exist?" % apk_path | 155 print "'%s' does not exist?" % apk_path |
144 return 2 | 156 return 2 |
145 | 157 |
146 sdk_root = os.path.join(args.build_dir, 'gen', 'sky_sdk') | 158 sdk_root = dev_sdk_root(args.build_dir) |
147 packages_root = os.path.join(sdk_root, 'packages_root') | 159 packages_root = dev_packages_root(args.build_dir) |
148 sky_tools_directory = os.path.join(SRC_ROOT, 'sky/tools') | 160 sky_tools_directory = os.path.join(SRC_ROOT, 'sky/tools') |
149 subprocess.check_call([ | 161 subprocess.check_call([ |
150 os.path.join(sky_tools_directory, 'deploy_sdk.py'), | 162 os.path.join(sky_tools_directory, 'deploy_sdk.py'), |
151 '--build-dir', args.build_dir, | 163 '--build-dir', args.build_dir, |
152 '--non-interactive', | 164 '--non-interactive', |
153 '--dev-environment', | 165 '--dev-environment', |
154 '--fake-pub-get-into', packages_root, | 166 '--fake-pub-get-into', packages_root, |
155 sdk_root, | 167 sdk_root, |
156 ]) | 168 ]) |
157 | 169 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 return | 202 return |
191 logging.info('Killing %s (%d).' % (name, pid)) | 203 logging.info('Killing %s (%d).' % (name, pid)) |
192 try: | 204 try: |
193 os.kill(pid, signal.SIGTERM) | 205 os.kill(pid, signal.SIGTERM) |
194 except OSError: | 206 except OSError: |
195 logging.info('%s (%d) already gone.' % (name, pid)) | 207 logging.info('%s (%d) already gone.' % (name, pid)) |
196 | 208 |
197 def run(self, args, pids): | 209 def run(self, args, pids): |
198 self._kill_if_exists(pids, 'sky_server_pid', 'sky_server') | 210 self._kill_if_exists(pids, 'sky_server_pid', 'sky_server') |
199 | 211 |
200 if 'remote_sky_server_port' in self.pids: | 212 if 'remote_sky_server_port' in pids: |
201 port_string = 'tcp:%s' % self.pids['remote_sky_server_port'] | 213 port_string = 'tcp:%s' % pids['remote_sky_server_port'] |
202 subprocess.call([ADB_PATH, 'reverse', '--remove', port_string]) | 214 subprocess.call([ADB_PATH, 'reverse', '--remove', port_string]) |
203 | 215 |
204 subprocess.call([ | 216 subprocess.call([ |
205 ADB_PATH, 'shell', 'am', 'force-stop', ANDROID_PACKAGE]) | 217 ADB_PATH, 'shell', 'am', 'force-stop', ANDROID_PACKAGE]) |
206 | 218 |
207 pids.clear() | 219 pids.clear() |
208 | 220 |
209 | 221 |
210 class Analyze(object): | 222 class Analyze(object): |
211 def add_subparser(self, subparsers): | 223 def add_subparser(self, subparsers): |
212 analyze_parser = subparsers.add_parser('analyze', | 224 analyze_parser = subparsers.add_parser('analyze', |
213 help=('run the dart analyzer with sky url mappings')) | 225 help=('run the dart analyzer with sky url mappings')) |
214 analyze_parser.add_argument('app_path', type=str) | 226 analyze_parser.add_argument('app_path', type=str) |
215 analyze_parser.set_defaults(func=self.run) | 227 analyze_parser.set_defaults(func=self.run) |
216 | 228 |
217 def run(self, args, pids): | 229 def run(self, args, pids): |
| 230 build_dir = pids.get('build_dir') |
| 231 if not build_dir: |
| 232 logging.fatal("pids file missing build_dir. Try 'start' first.") |
| 233 return 2 |
218 ANALYZER_PATH = 'third_party/dart-sdk/dart-sdk/bin/dartanalyzer' | 234 ANALYZER_PATH = 'third_party/dart-sdk/dart-sdk/bin/dartanalyzer' |
219 | 235 |
220 build_dir = os.path.abspath(pids['build_dir']) | |
221 bindings_path = os.path.join(build_dir, 'gen/sky/bindings') | 236 bindings_path = os.path.join(build_dir, 'gen/sky/bindings') |
222 sky_builtin_path = \ | 237 sky_builtin_path = \ |
223 os.path.join(SRC_ROOT, 'sky/engine/bindings/builtin.dart') | 238 os.path.join(SRC_ROOT, 'sky/engine/bindings/builtin.dart') |
224 dart_sky_path = os.path.join(bindings_path, 'dart_sky.dart') | 239 dart_sky_path = os.path.join(bindings_path, 'dart_sky.dart') |
225 analyzer_args = [ANALYZER_PATH, | 240 analyzer_args = [ANALYZER_PATH, |
226 "--url-mapping=dart:sky,%s" % dart_sky_path, | 241 "--url-mapping=dart:sky,%s" % dart_sky_path, |
227 "--url-mapping=dart:sky_builtin,%s" % sky_builtin_path, | 242 "--url-mapping=dart:sky_builtin,%s" % sky_builtin_path, |
| 243 "--package-root", dev_packages_root(build_dir), |
228 args.app_path | 244 args.app_path |
229 ] | 245 ] |
230 subprocess.call(analyzer_args) | 246 return subprocess.call(analyzer_args) |
231 | 247 |
232 class StartTracing(object): | 248 class StartTracing(object): |
233 def add_subparser(self, subparsers): | 249 def add_subparser(self, subparsers): |
234 start_tracing_parser = subparsers.add_parser('start_tracing', | 250 start_tracing_parser = subparsers.add_parser('start_tracing', |
235 help=('start tracing a running sky instance')) | 251 help=('start tracing a running sky instance')) |
236 start_tracing_parser.set_defaults(func=self.run) | 252 start_tracing_parser.set_defaults(func=self.run) |
237 | 253 |
238 def run(self, args, pids): | 254 def run(self, args, pids): |
239 subprocess.check_output([ADB_PATH, 'shell', | 255 subprocess.check_output([ADB_PATH, 'shell', |
240 'am', 'broadcast', | 256 'am', 'broadcast', |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 args = parser.parse_args() | 310 args = parser.parse_args() |
295 pids = Pids.read_from(PID_FILE_PATH, PID_FILE_KEYS) | 311 pids = Pids.read_from(PID_FILE_PATH, PID_FILE_KEYS) |
296 exit_code = args.func(args, pids) | 312 exit_code = args.func(args, pids) |
297 # We could do this with an at-exit handler instead? | 313 # We could do this with an at-exit handler instead? |
298 pids.write_to(PID_FILE_PATH) | 314 pids.write_to(PID_FILE_PATH) |
299 sys.exit(exit_code) | 315 sys.exit(exit_code) |
300 | 316 |
301 | 317 |
302 if __name__ == '__main__': | 318 if __name__ == '__main__': |
303 SkyShellRunner().main() | 319 SkyShellRunner().main() |
OLD | NEW |