diff options
author | Jiyong Park <jiyong@google.com> | 2019-02-08 02:49:59 +0900 |
---|---|---|
committer | Jiyong Park <jiyong@google.com> | 2019-02-10 00:13:49 +0900 |
commit | 1c4605a7f8da9e4af59efbed4f337719f0c0a515 (patch) | |
tree | 1e606703088fab188fb0daf5c5b884f302bc7e7e /apexer/apexer.py | |
parent | fcecff73506f9f4138fd4b06553f9c3d2fcb7762 (diff) |
Allow each APEX to provide its own AndroidManifest
AndroidManifest.xml file can be specified via the 'androidManifest'
property in the apex module type. It can be used to have a custom
AndroidManifest.xml that have additional tags (such as <uses-sdk> or
<uses-feature>) for precise tageting.
The property is optiona; if unspecified, the one is auto-generated as
before.
Bug: 123857186
Test: m apex_test_build_features
Change-Id: I0d28438e9463f8f544047bf5c89dc76066b7dbab
Diffstat (limited to 'apexer/apexer.py')
-rw-r--r-- | apexer/apexer.py | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/apexer/apexer.py b/apexer/apexer.py index acfaba2..ba5a8f0 100644 --- a/apexer/apexer.py +++ b/apexer/apexer.py @@ -31,6 +31,7 @@ import subprocess import sys import tempfile import uuid +import xml.etree.ElementTree as ET from apex_manifest import ValidateApexManifest from apex_manifest import ApexManifestError @@ -59,6 +60,8 @@ def ParseArgs(argv): help='verbose execution') parser.add_argument('--manifest', default='apex_manifest.json', help='path to the APEX manifest file') + parser.add_argument('--android_manifest', + help='path to the AndroidManifest file. If omitted, a default one is created and used') parser.add_argument('--file_contexts', help='selinux file contexts file. Required for "image" APEXs.') parser.add_argument('--canned_fs_config', @@ -134,6 +137,13 @@ def PrepareAndroidManifest(package, version): """ return template.format(package=package, version=version) +def ValidateAndroidManifest(package, android_manifest): + tree = ET.parse(android_manifest) + manifest_tag = tree.getroot() + package_in_xml = manifest_tag.attrib['package'] + if package_in_xml != package: + raise Exception("Package name '" + package_in_xml + "' in '" + android_manifest + + " differ from package name '" + package + "' in the apex_manifest.json") def ValidateArgs(args): if not os.path.exists(args.manifest): @@ -144,6 +154,15 @@ def ValidateArgs(args): print("Manifest file '" + args.manifest + "' is not a file") return False + if args.android_manifest is not None: + if not os.path.exists(args.android_manifest): + print("Android Manifest file '" + args.android_manifest + "' does not exist") + return False + + if not os.path.isfile(args.android_manifest): + print("Android Manifest file '" + args.android_manifest + "' is not a file") + return False + if not os.path.exists(args.input_dir): print("Input directory '" + args.input_dir + "' does not exist") return False @@ -312,16 +331,17 @@ def CreateApex(args, work_dir): RunCommand(cmd, args.verbose) # package the image file and APEX manifest as an APK. - # The AndroidManifest file is automatically generated. + # The AndroidManifest file is automatically generated if not given. android_manifest_file = os.path.join(work_dir, 'AndroidManifest.xml') - if args.verbose: - print('Creating AndroidManifest ' + android_manifest_file) - with open(android_manifest_file, 'w+') as f: - app_package_name = manifest_apex.name - if args.override_apk_package_name: - app_package_name = args.override_apk_package_name - - f.write(PrepareAndroidManifest(app_package_name, manifest_apex.version)) + if not args.android_manifest: + if args.verbose: + print('Creating AndroidManifest ' + android_manifest_file) + with open(android_manifest_file, 'w+') as f: + app_package_name = manifest_apex.name + f.write(PrepareAndroidManifest(app_package_name, manifest_apex.version)) + else: + ValidateAndroidManifest(manifest_apex.name, args.android_manifest) + shutil.copyfile(args.android_manifest, android_manifest_file) # copy manifest to the content dir so that it is also accessible # without mounting the image @@ -335,6 +355,11 @@ def CreateApex(args, work_dir): cmd = ['aapt2'] cmd.append('link') cmd.extend(['--manifest', android_manifest_file]) + if args.override_apk_package_name: + cmd.extend(['--rename-manifest-package', args.override_apk_package_name]) + # This version from apex_manifest.json is used when versionCode isn't + # specified in AndroidManifest.xml + cmd.extend(['--version-code', str(manifest_apex.version)]) cmd.extend(['-o', apk_file]) cmd.extend(['-I', "prebuilts/sdk/current/public/android.jar"]) RunCommand(cmd, args.verbose) |