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 hashlib | 8 import hashlib |
9 import json | 9 import json |
10 import logging | 10 import logging |
11 import os | 11 import os |
12 import pipes | 12 import pipes |
13 import platform | 13 import platform |
14 import re | 14 import re |
15 import signal | 15 import signal |
16 import subprocess | 16 import subprocess |
17 import sys | 17 import sys |
18 import tempfile | 18 import tempfile |
19 import time | 19 import time |
20 import urlparse | 20 import urlparse |
21 | 21 |
22 SKY_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) | 22 SKY_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) |
23 SKY_ROOT = os.path.dirname(SKY_TOOLS_DIR) | 23 SKY_ROOT = os.path.dirname(SKY_TOOLS_DIR) |
24 SRC_ROOT = os.path.dirname(SKY_ROOT) | 24 SRC_ROOT = os.path.dirname(SKY_ROOT) |
25 | 25 |
26 GDB_PORT = 8888 | 26 GDB_PORT = 8888 |
27 SKY_SERVER_PORT = 9888 | 27 SKY_SERVER_PORT = 9888 |
28 OBSERVATORY_PORT = 8181 | 28 OBSERVATORY_PORT = 8181 |
29 DEFAULT_URL = "sky://domokit.github.io/home.dart" | 29 DEFAULT_URL = "https://domokit.github.io/home.dart" |
30 APK_NAME = 'SkyDemo.apk' | 30 APK_NAME = 'SkyDemo.apk' |
31 ADB_PATH = os.path.join(SRC_ROOT, | 31 ADB_PATH = os.path.join(SRC_ROOT, |
32 'third_party/android_tools/sdk/platform-tools/adb') | 32 'third_party/android_tools/sdk/platform-tools/adb') |
33 ANDROID_PACKAGE = "org.domokit.sky.demo" | 33 ANDROID_PACKAGE = "org.domokit.sky.demo" |
| 34 ANDROID_COMPONENT = '%s/%s.SkyDemoActivity' % (ANDROID_PACKAGE, ANDROID_PACKAGE) |
34 SHA1_PATH = '/sdcard/%s/%s.sha1' % (ANDROID_PACKAGE, APK_NAME) | 35 SHA1_PATH = '/sdcard/%s/%s.sha1' % (ANDROID_PACKAGE, APK_NAME) |
35 | 36 |
36 PID_FILE_PATH = "/tmp/skydemo.pids" | 37 PID_FILE_PATH = "/tmp/skydemo.pids" |
37 PID_FILE_KEYS = frozenset([ | 38 PID_FILE_KEYS = frozenset([ |
38 'remote_sky_server_port', | 39 'remote_sky_server_port', |
39 'sky_server_pid', | 40 'sky_server_pid', |
40 'sky_server_port', | 41 'sky_server_port', |
41 'sky_server_root', | 42 'sky_server_root', |
42 'build_dir', | 43 'build_dir', |
43 'sky_shell_pid', | 44 'sky_shell_pid', |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 return cls(known_keys, contents) | 98 return cls(known_keys, contents) |
98 | 99 |
99 def write_to(self, path): | 100 def write_to(self, path): |
100 try: | 101 try: |
101 with open(path, 'w') as pid_file: | 102 with open(path, 'w') as pid_file: |
102 json.dump(self._dict, pid_file, indent=2, sort_keys=True) | 103 json.dump(self._dict, pid_file, indent=2, sort_keys=True) |
103 except: | 104 except: |
104 logging.warn('Failed to write pid file: %s' % path) | 105 logging.warn('Failed to write pid file: %s' % path) |
105 | 106 |
106 | 107 |
107 def _convert_to_sky_url(url): | |
108 parts = urlparse.urlsplit(url) | |
109 parts = parts._replace(scheme='sky') | |
110 return parts.geturl() | |
111 | |
112 | |
113 # A free function for possible future sharing with a 'load' command. | 108 # A free function for possible future sharing with a 'load' command. |
114 def _url_from_args(args, pids): | 109 def _url_from_args(args, pids): |
115 if urlparse.urlparse(args.url_or_path).scheme: | 110 if urlparse.urlparse(args.url_or_path).scheme: |
116 return args.url_or_path | 111 return args.url_or_path |
117 # The load happens on the remote device, use the remote port. | 112 # The load happens on the remote device, use the remote port. |
118 remote_sky_server_port = pids.get('remote_sky_server_port', | 113 remote_sky_server_port = pids.get('remote_sky_server_port', |
119 pids['sky_server_port']) | 114 pids['sky_server_port']) |
120 url = SkyServer.url_for_path(remote_sky_server_port, | 115 return SkyServer.url_for_path(remote_sky_server_port, |
121 pids['sky_server_root'], args.url_or_path) | 116 pids['sky_server_root'], args.url_or_path) |
122 return _convert_to_sky_url(url) | |
123 | 117 |
124 | 118 |
125 def dev_packages_root(build_dir): | 119 def dev_packages_root(build_dir): |
126 return os.path.join(build_dir, 'gen', 'dart-pkg', 'packages') | 120 return os.path.join(build_dir, 'gen', 'dart-pkg', 'packages') |
127 | 121 |
128 | 122 |
129 class SetBuildDir(object): | 123 class SetBuildDir(object): |
130 def add_subparser(self, subparsers): | 124 def add_subparser(self, subparsers): |
131 start_parser = subparsers.add_parser('set_build_dir', | 125 start_parser = subparsers.add_parser('set_build_dir', |
132 help='force the build_dir to a particular value without starting Sky
') | 126 help='force the build_dir to a particular value without starting Sky
') |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 subprocess.check_call([ | 222 subprocess.check_call([ |
229 ADB_PATH, 'forward', port_string, port_string | 223 ADB_PATH, 'forward', port_string, port_string |
230 ]) | 224 ]) |
231 | 225 |
232 port_string = 'tcp:%s' % sky_server.port | 226 port_string = 'tcp:%s' % sky_server.port |
233 subprocess.check_call([ | 227 subprocess.check_call([ |
234 ADB_PATH, 'reverse', port_string, port_string | 228 ADB_PATH, 'reverse', port_string, port_string |
235 ]) | 229 ]) |
236 pids['remote_sky_server_port'] = sky_server.port | 230 pids['remote_sky_server_port'] = sky_server.port |
237 | 231 |
238 | |
239 subprocess.check_call([ADB_PATH, 'shell', | 232 subprocess.check_call([ADB_PATH, 'shell', |
240 'am', 'start', | 233 'am', 'start', |
241 '-a', 'android.intent.action.VIEW', | 234 '-a', 'android.intent.action.VIEW', |
242 '-d', _url_from_args(args, pids)]) | 235 '-d', _url_from_args(args, pids), |
| 236 ANDROID_COMPONENT]) |
243 | 237 |
244 if not args.gdb: | 238 if not args.gdb: |
245 return | 239 return |
246 | 240 |
247 # TODO(eseidel): am start -W does not seem to work? | 241 # TODO(eseidel): am start -W does not seem to work? |
248 pid_tries = 0 | 242 pid_tries = 0 |
249 while True: | 243 while True: |
250 pid = self._find_remote_pid_for_package(ANDROID_PACKAGE) | 244 pid = self._find_remote_pid_for_package(ANDROID_PACKAGE) |
251 if pid or pid_tries > 3: | 245 if pid or pid_tries > 3: |
252 break | 246 break |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 args = parser.parse_args() | 493 args = parser.parse_args() |
500 pids = Pids.read_from(PID_FILE_PATH, PID_FILE_KEYS) | 494 pids = Pids.read_from(PID_FILE_PATH, PID_FILE_KEYS) |
501 exit_code = args.func(args, pids) | 495 exit_code = args.func(args, pids) |
502 # We could do this with an at-exit handler instead? | 496 # We could do this with an at-exit handler instead? |
503 pids.write_to(PID_FILE_PATH) | 497 pids.write_to(PID_FILE_PATH) |
504 sys.exit(exit_code) | 498 sys.exit(exit_code) |
505 | 499 |
506 | 500 |
507 if __name__ == '__main__': | 501 if __name__ == '__main__': |
508 SkyShellRunner().main() | 502 SkyShellRunner().main() |
OLD | NEW |