| #!/usr/bin/env python |
| |
| # Copyright 2015 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Creates a script to run an "_incremental" .apk.""" |
| |
| import argparse |
| import os |
| import pprint |
| import sys |
| |
| sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir)) |
| sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, 'gyp')) |
| |
| from pylib.constants import host_paths |
| from util import build_utils |
| |
| |
| SCRIPT_TEMPLATE = """\ |
| #!/usr/bin/env python |
| # |
| # This file was generated by: |
| # //build/android/incremental_install/create_install_script.py |
| |
| import os |
| import subprocess |
| import sys |
| |
| |
| def _ResolvePath(path): |
| script_directory = os.path.dirname(__file__) |
| return os.path.abspath(os.path.join(script_directory, path)) |
| |
| |
| # Exported to allow test runner to be able to install incremental apks. |
| def GetInstallParameters(): |
| apk_path = {apk_path} |
| dex_files = {dex_files} |
| dont_even_try = {dont_even_try} |
| native_libs = {native_libs} |
| show_proguard_warning = {show_proguard_warning} |
| splits = {splits} |
| |
| return dict(apk_path=_ResolvePath(apk_path), |
| dex_files=[_ResolvePath(p) for p in dex_files], |
| dont_even_try=dont_even_try, |
| native_libs=[_ResolvePath(p) for p in native_libs], |
| show_proguard_warning=show_proguard_warning, |
| splits=[_ResolvePath(p) for p in splits]) |
| |
| |
| def main(): |
| output_directory = {output_directory} |
| cmd_path = {cmd_path} |
| params = GetInstallParameters() |
| cmd_args = [ |
| _ResolvePath(cmd_path), |
| '--output-directory', _ResolvePath(output_directory), |
| ] |
| for native_lib in params['native_libs']: |
| cmd_args.extend(('--native_lib', native_lib)) |
| for dex_path in params['dex_files']: |
| cmd_args.extend(('--dex-file', dex_path)) |
| for split in params['splits']: |
| cmd_args.extend(('--split', split)) |
| cmd_args.append(params['apk_path']) |
| if params['dont_even_try']: |
| cmd_args.extend(('--dont-even-try', params['dont_even_try'])) |
| if params['show_proguard_warning']: |
| cmd_args.append('--show-proguard-warning') |
| return subprocess.call(cmd_args + sys.argv[1:]) |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |
| """ |
| |
| |
| def _ParseArgs(args): |
| args = build_utils.ExpandFileArgs(args) |
| parser = argparse.ArgumentParser() |
| build_utils.AddDepfileOption(parser) |
| parser.add_argument('--script-output-path', |
| help='Output path for executable script.', |
| required=True) |
| parser.add_argument('--output-directory', |
| help='Path to the root build directory.', |
| default='.') |
| parser.add_argument('--apk-path', |
| help='Path to the .apk to install.', |
| required=True) |
| parser.add_argument('--split', |
| action='append', |
| dest='splits', |
| default=[], |
| help='A glob matching the apk splits. ' |
| 'Can be specified multiple times.') |
| parser.add_argument('--native-libs', |
| action='append', |
| default=[], |
| help='GYP-list of paths to native libraries. Can be ' |
| 'repeated.') |
| parser.add_argument('--dex-file', |
| action='append', |
| default=[], |
| dest='dex_files', |
| help='List of dex files to include.') |
| parser.add_argument('--dex-file-list', |
| help='GYP-list of dex files.') |
| parser.add_argument('--show-proguard-warning', |
| action='store_true', |
| default=False, |
| help='Print a warning about proguard being disabled') |
| parser.add_argument('--dont-even-try', |
| help='Prints this message and exits.') |
| |
| options = parser.parse_args(args) |
| options.dex_files += build_utils.ParseGypList(options.dex_file_list) |
| all_libs = [] |
| for gyp_list in options.native_libs: |
| all_libs.extend(build_utils.ParseGypList(gyp_list)) |
| options.native_libs = all_libs |
| return options |
| |
| |
| def main(args): |
| options = _ParseArgs(args) |
| |
| def relativize(path): |
| script_dir = os.path.dirname(options.script_output_path) |
| return path and os.path.relpath(path, script_dir) |
| |
| installer_path = os.path.join(host_paths.DIR_SOURCE_ROOT, 'build', 'android', |
| 'incremental_install', 'installer.py') |
| pformat = pprint.pformat |
| template_args = { |
| 'cmd_path': pformat(relativize(installer_path)), |
| 'apk_path': pformat(relativize(options.apk_path)), |
| 'output_directory': pformat(relativize(options.output_directory)), |
| 'native_libs': pformat([relativize(p) for p in options.native_libs]), |
| 'dex_files': pformat([relativize(p) for p in options.dex_files]), |
| 'dont_even_try': pformat(options.dont_even_try), |
| 'show_proguard_warning': pformat(options.show_proguard_warning), |
| 'splits': pformat([relativize(p) for p in options.splits]), |
| } |
| |
| with open(options.script_output_path, 'w') as script: |
| script.write(SCRIPT_TEMPLATE.format(**template_args)) |
| |
| os.chmod(options.script_output_path, 0750) |
| |
| if options.depfile: |
| build_utils.WriteDepfile( |
| options.depfile, |
| build_utils.GetPythonDependencies()) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main(sys.argv[1:])) |