1#!/usr/bin/env python 2# Copyright 2018 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6"""Create a wrapper script to manage an Android App Bundle.""" 7 8import argparse 9import os 10import string 11import sys 12 13# Import apk_operations even though this script doesn't use it so that 14# targets that depend on the wrapper scripts will rebuild when apk_operations 15# or its deps change. 16sys.path.insert(1, os.path.join(os.path.dirname(__file__), os.pardir)) 17import apk_operations # pylint: disable=unused-import 18from util import build_utils 19 20SCRIPT_TEMPLATE = string.Template("""\ 21#!/usr/bin/env python 22# 23# This file was generated by build/android/gyp/create_bundle_wrapper_script.py 24 25import os 26import sys 27 28def main(): 29 script_directory = os.path.dirname(__file__) 30 resolve = lambda p: p if p is None else os.path.abspath(os.path.join( 31 script_directory, p)) 32 sys.path.append(resolve(${WRAPPED_SCRIPT_DIR})) 33 import apk_operations 34 35 additional_apk_paths = [resolve(p) for p in ${ADDITIONAL_APK_PATHS}] 36 apk_operations.RunForBundle(output_directory=resolve(${OUTPUT_DIR}), 37 bundle_path=resolve(${BUNDLE_PATH}), 38 bundle_apks_path=resolve(${BUNDLE_APKS_PATH}), 39 additional_apk_paths=additional_apk_paths, 40 aapt2_path=resolve(${AAPT2_PATH}), 41 keystore_path=resolve(${KEYSTORE_PATH}), 42 keystore_password=${KEYSTORE_PASSWORD}, 43 keystore_alias=${KEY_NAME}, 44 package_name=${PACKAGE_NAME}, 45 command_line_flags_file=${FLAGS_FILE}, 46 proguard_mapping_path=resolve(${MAPPING_PATH}), 47 target_cpu=${TARGET_CPU}, 48 system_image_locales=${SYSTEM_IMAGE_LOCALES}, 49 default_modules=${DEFAULT_MODULES}) 50 51if __name__ == '__main__': 52 sys.exit(main()) 53""") 54 55def main(args): 56 args = build_utils.ExpandFileArgs(args) 57 parser = argparse.ArgumentParser() 58 parser.add_argument('--script-output-path', required=True, 59 help='Output path for executable script.') 60 parser.add_argument('--bundle-path', required=True) 61 parser.add_argument('--bundle-apks-path', required=True) 62 parser.add_argument( 63 '--additional-apk-path', 64 action='append', 65 dest='additional_apk_paths', 66 default=[], 67 help='Paths to APKs to be installed prior to --apk-path.') 68 parser.add_argument('--package-name', required=True) 69 parser.add_argument('--aapt2-path', required=True) 70 parser.add_argument('--keystore-path', required=True) 71 parser.add_argument('--keystore-password', required=True) 72 parser.add_argument('--key-name', required=True) 73 parser.add_argument('--command-line-flags-file') 74 parser.add_argument('--proguard-mapping-path') 75 parser.add_argument('--target-cpu') 76 parser.add_argument('--system-image-locales') 77 parser.add_argument('--default-modules', nargs='*', default=[]) 78 args = parser.parse_args(args) 79 80 def relativize(path): 81 """Returns the path relative to the output script directory.""" 82 if path is None: 83 return path 84 return os.path.relpath(path, os.path.dirname(args.script_output_path)) 85 86 wrapped_script_dir = os.path.join(os.path.dirname(__file__), os.path.pardir) 87 wrapped_script_dir = relativize(wrapped_script_dir) 88 with open(args.script_output_path, 'w') as script: 89 script_dict = { 90 'WRAPPED_SCRIPT_DIR': 91 repr(wrapped_script_dir), 92 'OUTPUT_DIR': 93 repr(relativize('.')), 94 'BUNDLE_PATH': 95 repr(relativize(args.bundle_path)), 96 'BUNDLE_APKS_PATH': 97 repr(relativize(args.bundle_apks_path)), 98 'ADDITIONAL_APK_PATHS': 99 [relativize(p) for p in args.additional_apk_paths], 100 'PACKAGE_NAME': 101 repr(args.package_name), 102 'AAPT2_PATH': 103 repr(relativize(args.aapt2_path)), 104 'KEYSTORE_PATH': 105 repr(relativize(args.keystore_path)), 106 'KEYSTORE_PASSWORD': 107 repr(args.keystore_password), 108 'KEY_NAME': 109 repr(args.key_name), 110 'MAPPING_PATH': 111 repr(relativize(args.proguard_mapping_path)), 112 'FLAGS_FILE': 113 repr(args.command_line_flags_file), 114 'TARGET_CPU': 115 repr(args.target_cpu), 116 'SYSTEM_IMAGE_LOCALES': 117 repr(build_utils.ParseGnList(args.system_image_locales)), 118 'DEFAULT_MODULES': 119 repr(args.default_modules), 120 } 121 script.write(SCRIPT_TEMPLATE.substitute(script_dict)) 122 os.chmod(args.script_output_path, 0750) 123 return 0 124 125 126if __name__ == '__main__': 127 sys.exit(main(sys.argv[1:])) 128