summaryrefslogtreecommitdiff
path: root/apexer/apexer.py
diff options
context:
space:
mode:
authorJiyong Park <jiyong@google.com>2019-02-08 02:49:59 +0900
committerJiyong Park <jiyong@google.com>2019-02-10 00:13:49 +0900
commit1c4605a7f8da9e4af59efbed4f337719f0c0a515 (patch)
tree1e606703088fab188fb0daf5c5b884f302bc7e7e /apexer/apexer.py
parentfcecff73506f9f4138fd4b06553f9c3d2fcb7762 (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.py43
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)