1#!/usr/bin/env python3 2# Copyright 2018 The Chromium Authors 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 13from util import build_utils 14import action_helpers # build_utils adds //build to sys.path. 15 16SCRIPT_TEMPLATE = string.Template("""\ 17#!/usr/bin/env python3 18# 19# This file was generated by build/android/gyp/create_bundle_wrapper_script.py 20 21import os 22import sys 23 24def main(): 25 script_directory = os.path.dirname(__file__) 26 resolve = lambda p: p if p is None else os.path.abspath(os.path.join( 27 script_directory, p)) 28 sys.path.append(resolve(${WRAPPED_SCRIPT_DIR})) 29 import apk_operations 30 31 additional_apk_paths = [resolve(p) for p in ${ADDITIONAL_APK_PATHS}] 32 apk_operations.RunForBundle(output_directory=resolve(${OUTPUT_DIR}), 33 bundle_path=resolve(${BUNDLE_PATH}), 34 bundle_apks_path=resolve(${BUNDLE_APKS_PATH}), 35 additional_apk_paths=additional_apk_paths, 36 aapt2_path=resolve(${AAPT2_PATH}), 37 keystore_path=resolve(${KEYSTORE_PATH}), 38 keystore_password=${KEYSTORE_PASSWORD}, 39 keystore_alias=${KEY_NAME}, 40 package_name=${PACKAGE_NAME}, 41 command_line_flags_file=${FLAGS_FILE}, 42 proguard_mapping_path=resolve(${MAPPING_PATH}), 43 target_cpu=${TARGET_CPU}, 44 system_image_locales=${SYSTEM_IMAGE_LOCALES}, 45 default_modules=${DEFAULT_MODULES}, 46 is_official_build=${IS_OFFICIAL_BUILD}) 47 48if __name__ == '__main__': 49 sys.exit(main()) 50""") 51 52def main(args): 53 args = build_utils.ExpandFileArgs(args) 54 parser = argparse.ArgumentParser() 55 parser.add_argument('--script-output-path', required=True, 56 help='Output path for executable script.') 57 parser.add_argument('--bundle-path', required=True) 58 parser.add_argument('--bundle-apks-path', required=True) 59 parser.add_argument( 60 '--additional-apk-path', 61 action='append', 62 dest='additional_apk_paths', 63 default=[], 64 help='Paths to APKs to be installed prior to --apk-path.') 65 parser.add_argument('--package-name', required=True) 66 parser.add_argument('--aapt2-path', required=True) 67 parser.add_argument('--keystore-path', required=True) 68 parser.add_argument('--keystore-password', required=True) 69 parser.add_argument('--key-name', required=True) 70 parser.add_argument('--command-line-flags-file') 71 parser.add_argument('--proguard-mapping-path') 72 parser.add_argument('--target-cpu') 73 parser.add_argument('--system-image-locales') 74 parser.add_argument('--default-modules', nargs='*', default=[]) 75 parser.add_argument('--is-official-build', action='store_true') 76 args = parser.parse_args(args) 77 78 def relativize(path): 79 """Returns the path relative to the output script directory.""" 80 if path is None: 81 return path 82 return os.path.relpath(path, os.path.dirname(args.script_output_path)) 83 84 wrapped_script_dir = os.path.join(os.path.dirname(__file__), os.path.pardir) 85 wrapped_script_dir = relativize(wrapped_script_dir) 86 with open(args.script_output_path, 'w') as script: 87 script_dict = { 88 'WRAPPED_SCRIPT_DIR': 89 repr(wrapped_script_dir), 90 'OUTPUT_DIR': 91 repr(relativize('.')), 92 'BUNDLE_PATH': 93 repr(relativize(args.bundle_path)), 94 'BUNDLE_APKS_PATH': 95 repr(relativize(args.bundle_apks_path)), 96 'ADDITIONAL_APK_PATHS': 97 [relativize(p) for p in args.additional_apk_paths], 98 'PACKAGE_NAME': 99 repr(args.package_name), 100 'AAPT2_PATH': 101 repr(relativize(args.aapt2_path)), 102 'KEYSTORE_PATH': 103 repr(relativize(args.keystore_path)), 104 'KEYSTORE_PASSWORD': 105 repr(args.keystore_password), 106 'KEY_NAME': 107 repr(args.key_name), 108 'MAPPING_PATH': 109 repr(relativize(args.proguard_mapping_path)), 110 'FLAGS_FILE': 111 repr(args.command_line_flags_file), 112 'TARGET_CPU': 113 repr(args.target_cpu), 114 'SYSTEM_IMAGE_LOCALES': 115 repr(action_helpers.parse_gn_list(args.system_image_locales)), 116 'DEFAULT_MODULES': 117 repr(args.default_modules), 118 'IS_OFFICIAL_BUILD': 119 repr(args.is_official_build), 120 } 121 script.write(SCRIPT_TEMPLATE.substitute(script_dict)) 122 os.chmod(args.script_output_path, 0o750) 123 return 0 124 125 126if __name__ == '__main__': 127 sys.exit(main(sys.argv[1:])) 128