| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # | 2 # |
| 3 # Copyright 2015 The Chromium Authors. All rights reserved. | 3 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 """Install *_incremental.apk targets as well as their dependent files.""" | 7 """Install *_incremental.apk targets as well as their dependent files.""" |
| 8 | 8 |
| 9 import argparse | 9 import argparse |
| 10 import glob | 10 import glob |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 from pylib.utils import time_profile | 25 from pylib.utils import time_profile |
| 26 | 26 |
| 27 prev_sys_path = list(sys.path) | 27 prev_sys_path = list(sys.path) |
| 28 sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, 'gyp')) | 28 sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, 'gyp')) |
| 29 from util import build_utils | 29 from util import build_utils |
| 30 sys.path = prev_sys_path | 30 sys.path = prev_sys_path |
| 31 | 31 |
| 32 | 32 |
| 33 def _TransformDexPaths(paths): | 33 def _TransformDexPaths(paths): |
| 34 """Given paths like ["/a/b/c", "/a/c/d"], returns ["b.c", "c.d"].""" | 34 """Given paths like ["/a/b/c", "/a/c/d"], returns ["b.c", "c.d"].""" |
| 35 if len(paths) == 1: |
| 36 return [os.path.basename(paths[0])] |
| 37 |
| 35 prefix_len = len(os.path.commonprefix(paths)) | 38 prefix_len = len(os.path.commonprefix(paths)) |
| 36 return [p[prefix_len:].replace(os.sep, '.') for p in paths] | 39 return [p[prefix_len:].replace(os.sep, '.') for p in paths] |
| 37 | 40 |
| 38 | 41 |
| 39 def _Execute(concurrently, *funcs): | 42 def _Execute(concurrently, *funcs): |
| 40 """Calls all functions in |funcs| concurrently or in sequence.""" | 43 """Calls all functions in |funcs| concurrently or in sequence.""" |
| 41 timer = time_profile.TimeProfile() | 44 timer = time_profile.TimeProfile() |
| 42 if concurrently: | 45 if concurrently: |
| 43 reraiser_thread.RunAsync(funcs) | 46 reraiser_thread.RunAsync(funcs) |
| 44 else: | 47 else: |
| (...skipping 11 matching lines...) Expand all Loading... |
| 56 def Uninstall(device, package): | 59 def Uninstall(device, package): |
| 57 """Uninstalls and removes all incremental files for the given package.""" | 60 """Uninstalls and removes all incremental files for the given package.""" |
| 58 main_timer = time_profile.TimeProfile() | 61 main_timer = time_profile.TimeProfile() |
| 59 device.Uninstall(package) | 62 device.Uninstall(package) |
| 60 device.RunShellCommand(['rm', '-rf', _GetDeviceIncrementalDir(package)], | 63 device.RunShellCommand(['rm', '-rf', _GetDeviceIncrementalDir(package)], |
| 61 check_return=True) | 64 check_return=True) |
| 62 logging.info('Uninstall took %s seconds.', main_timer.GetDelta()) | 65 logging.info('Uninstall took %s seconds.', main_timer.GetDelta()) |
| 63 | 66 |
| 64 | 67 |
| 65 def Install(device, apk, split_globs=None, lib_dir=None, dex_files=None, | 68 def Install(device, apk, split_globs=None, lib_dir=None, dex_files=None, |
| 66 enable_device_cache=True, use_concurrency=True): | 69 enable_device_cache=True, use_concurrency=True, |
| 70 show_proguard_warning=False): |
| 67 """Installs the given incremental apk and all required supporting files. | 71 """Installs the given incremental apk and all required supporting files. |
| 68 | 72 |
| 69 Args: | 73 Args: |
| 70 device: A DeviceUtils instance. | 74 device: A DeviceUtils instance. |
| 71 apk: The path to the apk, or an ApkHelper instance. | 75 apk: The path to the apk, or an ApkHelper instance. |
| 72 split_globs: Glob patterns for any required apk splits (optional). | 76 split_globs: Glob patterns for any required apk splits (optional). |
| 73 lib_dir: Directory containing the app's native libraries (optional). | 77 lib_dir: Directory containing the app's native libraries (optional). |
| 74 dex_files: List of .dex.jar files that comprise the app's Dalvik code. | 78 dex_files: List of .dex.jar files that comprise the app's Dalvik code. |
| 75 enable_device_cache: Whether to enable on-device caching of checksums. | 79 enable_device_cache: Whether to enable on-device caching of checksums. |
| 76 use_concurrency: Whether to speed things up using multiple threads. | 80 use_concurrency: Whether to speed things up using multiple threads. |
| 81 show_proguard_warning: Whether to print a warning about Proguard not being |
| 82 enabled after installing. |
| 77 """ | 83 """ |
| 78 main_timer = time_profile.TimeProfile() | 84 main_timer = time_profile.TimeProfile() |
| 79 install_timer = time_profile.TimeProfile() | 85 install_timer = time_profile.TimeProfile() |
| 80 push_native_timer = time_profile.TimeProfile() | 86 push_native_timer = time_profile.TimeProfile() |
| 81 push_dex_timer = time_profile.TimeProfile() | 87 push_dex_timer = time_profile.TimeProfile() |
| 82 | 88 |
| 83 apk = apk_helper.ToHelper(apk) | 89 apk = apk_helper.ToHelper(apk) |
| 84 apk_package = apk.GetPackageName() | 90 apk_package = apk.GetPackageName() |
| 85 device_incremental_dir = _GetDeviceIncrementalDir(apk_package) | 91 device_incremental_dir = _GetDeviceIncrementalDir(apk_package) |
| 86 | 92 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 | 179 |
| 174 _Execute(use_concurrency, do_install, do_push_files) | 180 _Execute(use_concurrency, do_install, do_push_files) |
| 175 | 181 |
| 176 finalize_timer = _Execute(use_concurrency, release_installer_lock, save_cache) | 182 finalize_timer = _Execute(use_concurrency, release_installer_lock, save_cache) |
| 177 | 183 |
| 178 logging.info( | 184 logging.info( |
| 179 'Took %s seconds (setup=%s, install=%s, libs=%s, dex=%s, finalize=%s)', | 185 'Took %s seconds (setup=%s, install=%s, libs=%s, dex=%s, finalize=%s)', |
| 180 main_timer.GetDelta(), setup_timer.GetDelta(), install_timer.GetDelta(), | 186 main_timer.GetDelta(), setup_timer.GetDelta(), install_timer.GetDelta(), |
| 181 push_native_timer.GetDelta(), push_dex_timer.GetDelta(), | 187 push_native_timer.GetDelta(), push_dex_timer.GetDelta(), |
| 182 finalize_timer.GetDelta()) | 188 finalize_timer.GetDelta()) |
| 189 if show_proguard_warning: |
| 190 logging.warning('Target had proguard enabled, but incremental install uses ' |
| 191 'non-proguarded .dex files. Performance characteristics ' |
| 192 'may differ.') |
| 183 | 193 |
| 184 | 194 |
| 185 def main(): | 195 def main(): |
| 186 parser = argparse.ArgumentParser() | 196 parser = argparse.ArgumentParser() |
| 187 parser.add_argument('apk_path', | 197 parser.add_argument('apk_path', |
| 188 help='The path to the APK to install.') | 198 help='The path to the APK to install.') |
| 189 parser.add_argument('--split', | 199 parser.add_argument('--split', |
| 190 action='append', | 200 action='append', |
| 191 dest='splits', | 201 dest='splits', |
| 192 help='A glob matching the apk splits. ' | 202 help='A glob matching the apk splits. ' |
| (...skipping 16 matching lines...) Expand all Loading... |
| 209 action='store_false', | 219 action='store_false', |
| 210 default=True, | 220 default=True, |
| 211 dest='threading', | 221 dest='threading', |
| 212 help='Do not install and push concurrently') | 222 help='Do not install and push concurrently') |
| 213 parser.add_argument('--no-cache', | 223 parser.add_argument('--no-cache', |
| 214 action='store_false', | 224 action='store_false', |
| 215 default=True, | 225 default=True, |
| 216 dest='cache', | 226 dest='cache', |
| 217 help='Do not use cached information about what files are ' | 227 help='Do not use cached information about what files are ' |
| 218 'currently on the target device.') | 228 'currently on the target device.') |
| 229 parser.add_argument('--show-proguard-warning', |
| 230 action='store_true', |
| 231 default=False, |
| 232 help='Print a warning about proguard being disabled') |
| 219 parser.add_argument('-v', | 233 parser.add_argument('-v', |
| 220 '--verbose', | 234 '--verbose', |
| 221 dest='verbose_count', | 235 dest='verbose_count', |
| 222 default=0, | 236 default=0, |
| 223 action='count', | 237 action='count', |
| 224 help='Verbose level (multiple times for more)') | 238 help='Verbose level (multiple times for more)') |
| 225 | 239 |
| 226 args = parser.parse_args() | 240 args = parser.parse_args() |
| 227 | 241 |
| 228 run_tests_helper.SetLogLevel(args.verbose_count) | 242 run_tests_helper.SetLogLevel(args.verbose_count) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 251 for d, desc in zip(devices, descriptions): | 265 for d, desc in zip(devices, descriptions): |
| 252 msg += ' %s (%s)\n' % (d, desc) | 266 msg += ' %s (%s)\n' % (d, desc) |
| 253 raise Exception(msg) | 267 raise Exception(msg) |
| 254 | 268 |
| 255 apk = apk_helper.ToHelper(args.apk_path) | 269 apk = apk_helper.ToHelper(args.apk_path) |
| 256 if args.uninstall: | 270 if args.uninstall: |
| 257 Uninstall(device, apk.GetPackageName()) | 271 Uninstall(device, apk.GetPackageName()) |
| 258 else: | 272 else: |
| 259 Install(device, apk, split_globs=args.splits, lib_dir=args.lib_dir, | 273 Install(device, apk, split_globs=args.splits, lib_dir=args.lib_dir, |
| 260 dex_files=args.dex_files, enable_device_cache=args.cache, | 274 dex_files=args.dex_files, enable_device_cache=args.cache, |
| 261 use_concurrency=args.threading) | 275 use_concurrency=args.threading, |
| 276 show_proguard_warning=args.show_proguard_warning) |
| 262 | 277 |
| 263 | 278 |
| 264 if __name__ == '__main__': | 279 if __name__ == '__main__': |
| 265 sys.exit(main()) | 280 sys.exit(main()) |
| OLD | NEW |