#!/usr/bin/env python3 # Copyright 2018 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Create a wrapper script to manage an Android App Bundle.""" import argparse import os import string import sys from util import build_utils import action_helpers # build_utils adds //build to sys.path. SCRIPT_TEMPLATE = string.Template("""\ #!/usr/bin/env python3 # # This file was generated by build/android/gyp/create_bundle_wrapper_script.py import os import sys def main(): script_directory = os.path.dirname(__file__) resolve = lambda p: p if p is None else os.path.abspath(os.path.join( script_directory, p)) sys.path.append(resolve(${WRAPPED_SCRIPT_DIR})) import apk_operations additional_apk_paths = [resolve(p) for p in ${ADDITIONAL_APK_PATHS}] apk_operations.RunForBundle(output_directory=resolve(${OUTPUT_DIR}), bundle_path=resolve(${BUNDLE_PATH}), bundle_apks_path=resolve(${BUNDLE_APKS_PATH}), additional_apk_paths=additional_apk_paths, aapt2_path=resolve(${AAPT2_PATH}), keystore_path=resolve(${KEYSTORE_PATH}), keystore_password=${KEYSTORE_PASSWORD}, keystore_alias=${KEY_NAME}, package_name=${PACKAGE_NAME}, command_line_flags_file=${FLAGS_FILE}, proguard_mapping_path=resolve(${MAPPING_PATH}), target_cpu=${TARGET_CPU}, system_image_locales=${SYSTEM_IMAGE_LOCALES}, default_modules=${DEFAULT_MODULES}) if __name__ == '__main__': sys.exit(main()) """) def main(args): args = build_utils.ExpandFileArgs(args) parser = argparse.ArgumentParser() parser.add_argument('--script-output-path', required=True, help='Output path for executable script.') parser.add_argument('--bundle-path', required=True) parser.add_argument('--bundle-apks-path', required=True) parser.add_argument( '--additional-apk-path', action='append', dest='additional_apk_paths', default=[], help='Paths to APKs to be installed prior to --apk-path.') parser.add_argument('--package-name', required=True) parser.add_argument('--aapt2-path', required=True) parser.add_argument('--keystore-path', required=True) parser.add_argument('--keystore-password', required=True) parser.add_argument('--key-name', required=True) parser.add_argument('--command-line-flags-file') parser.add_argument('--proguard-mapping-path') parser.add_argument('--target-cpu') parser.add_argument('--system-image-locales') parser.add_argument('--default-modules', nargs='*', default=[]) args = parser.parse_args(args) def relativize(path): """Returns the path relative to the output script directory.""" if path is None: return path return os.path.relpath(path, os.path.dirname(args.script_output_path)) wrapped_script_dir = os.path.join(os.path.dirname(__file__), os.path.pardir) wrapped_script_dir = relativize(wrapped_script_dir) with open(args.script_output_path, 'w') as script: script_dict = { 'WRAPPED_SCRIPT_DIR': repr(wrapped_script_dir), 'OUTPUT_DIR': repr(relativize('.')), 'BUNDLE_PATH': repr(relativize(args.bundle_path)), 'BUNDLE_APKS_PATH': repr(relativize(args.bundle_apks_path)), 'ADDITIONAL_APK_PATHS': [relativize(p) for p in args.additional_apk_paths], 'PACKAGE_NAME': repr(args.package_name), 'AAPT2_PATH': repr(relativize(args.aapt2_path)), 'KEYSTORE_PATH': repr(relativize(args.keystore_path)), 'KEYSTORE_PASSWORD': repr(args.keystore_password), 'KEY_NAME': repr(args.key_name), 'MAPPING_PATH': repr(relativize(args.proguard_mapping_path)), 'FLAGS_FILE': repr(args.command_line_flags_file), 'TARGET_CPU': repr(args.target_cpu), 'SYSTEM_IMAGE_LOCALES': repr(action_helpers.parse_gn_list(args.system_image_locales)), 'DEFAULT_MODULES': repr(args.default_modules), } script.write(SCRIPT_TEMPLATE.substitute(script_dict)) os.chmod(args.script_output_path, 0o750) return 0 if __name__ == '__main__': sys.exit(main(sys.argv[1:]))