diff options
author | Colin Cross <ccross@android.com> | 2019-02-05 21:55:21 -0800 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2019-02-08 15:24:47 +0000 |
commit | e4246abd7f456eb4119f2cffc01bdfca852584b5 (patch) | |
tree | da9d75703d09106d677b1d5b8976a6cdc601e6ce /scripts | |
parent | 129b9ceeb147099a62c46b4ff74670bb1670e34b (diff) | |
download | build_soong-e4246abd7f456eb4119f2cffc01bdfca852584b5.tar.gz build_soong-e4246abd7f456eb4119f2cffc01bdfca852584b5.tar.bz2 build_soong-e4246abd7f456eb4119f2cffc01bdfca852584b5.zip |
Make manifest and APK agree on uncompressed native libs
Only put uncompressed native libs in an APK if the min_sdk_version
supports it (>= 23, Marshmallow), and set
android:extractNativeLibs="false" in the AndroidManifest.xml so
that the platform won't extract them anyways.
Bug: 117618214
Test: m checkbuild
Change-Id: I760017e48bf3c6b618aabde0982df45995765d48
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/manifest_fixer.py | 33 | ||||
-rwxr-xr-x | scripts/manifest_fixer_test.py | 43 |
2 files changed, 75 insertions, 1 deletions
diff --git a/scripts/manifest_fixer.py b/scripts/manifest_fixer.py index 917f55b4..83868e60 100755 --- a/scripts/manifest_fixer.py +++ b/scripts/manifest_fixer.py @@ -63,8 +63,12 @@ def parse_args(): help='manifest is for a package built against the platform') parser.add_argument('--use-embedded-dex', dest='use_embedded_dex', action='store_true', help=('specify if the app wants to use embedded dex and avoid extracted,' - 'locally compiled code. Should not be conflict if already declared ' + 'locally compiled code. Must not conflict if already declared ' 'in the manifest.')) + parser.add_argument('--extract-native-libs', dest='extract_native_libs', + default=None, type=lambda x: (str(x).lower() == 'true'), + help=('specify if the app wants to use embedded native libraries. Must not conflict ' + 'if already declared in the manifest.')) parser.add_argument('input', help='input AndroidManifest.xml file') parser.add_argument('output', help='output AndroidManifest.xml file') return parser.parse_args() @@ -295,6 +299,30 @@ def add_use_embedded_dex(doc): raise RuntimeError('existing attribute mismatches the option of --use-embedded-dex') +def add_extract_native_libs(doc, extract_native_libs): + manifest = parse_manifest(doc) + elems = get_children_with_tag(manifest, 'application') + application = elems[0] if len(elems) == 1 else None + if len(elems) > 1: + raise RuntimeError('found multiple <application> tags') + elif not elems: + application = doc.createElement('application') + indent = get_indent(manifest.firstChild, 1) + first = manifest.firstChild + manifest.insertBefore(doc.createTextNode(indent), first) + manifest.insertBefore(application, first) + + value = str(extract_native_libs).lower() + attr = application.getAttributeNodeNS(android_ns, 'extractNativeLibs') + if attr is None: + attr = doc.createAttributeNS(android_ns, 'android:extractNativeLibs') + attr.value = value + application.setAttributeNode(attr) + elif attr.value != value: + raise RuntimeError('existing attribute extractNativeLibs="%s" conflicts with --extract-native-libs="%s"' % + (attr.value, value)) + + def write_xml(f, doc): f.write('<?xml version="1.0" encoding="utf-8"?>\n') for node in doc.childNodes: @@ -325,6 +353,9 @@ def main(): if args.use_embedded_dex: add_use_embedded_dex(doc) + if args.extract_native_libs is not None: + add_extract_native_libs(doc, args.extract_native_libs) + with open(args.output, 'wb') as f: write_xml(f, doc) diff --git a/scripts/manifest_fixer_test.py b/scripts/manifest_fixer_test.py index 1d8de556..4ad9afaf 100755 --- a/scripts/manifest_fixer_test.py +++ b/scripts/manifest_fixer_test.py @@ -381,5 +381,48 @@ class UseEmbeddedDexTest(unittest.TestCase): manifest_input = self.manifest_tmpl % self.use_embedded_dex('false') self.assertRaises(RuntimeError, self.run_test, manifest_input) + +class AddExtractNativeLibsTest(unittest.TestCase): + """Unit tests for add_extract_native_libs function.""" + + def run_test(self, input_manifest, value): + doc = minidom.parseString(input_manifest) + manifest_fixer.add_extract_native_libs(doc, value) + output = StringIO.StringIO() + manifest_fixer.write_xml(output, doc) + return output.getvalue() + + manifest_tmpl = ( + '<?xml version="1.0" encoding="utf-8"?>\n' + '<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n' + ' <application%s/>\n' + '</manifest>\n') + + def extract_native_libs(self, value): + return ' android:extractNativeLibs="%s"' % value + + def test_set_true(self): + manifest_input = self.manifest_tmpl % '' + expected = self.manifest_tmpl % self.extract_native_libs('true') + output = self.run_test(manifest_input, True) + self.assertEqual(output, expected) + + def test_set_false(self): + manifest_input = self.manifest_tmpl % '' + expected = self.manifest_tmpl % self.extract_native_libs('false') + output = self.run_test(manifest_input, False) + self.assertEqual(output, expected) + + def test_match(self): + manifest_input = self.manifest_tmpl % self.extract_native_libs('true') + expected = manifest_input + output = self.run_test(manifest_input, True) + self.assertEqual(output, expected) + + def test_conflict(self): + manifest_input = self.manifest_tmpl % self.extract_native_libs('true') + self.assertRaises(RuntimeError, self.run_test, manifest_input, False) + + if __name__ == '__main__': unittest.main() |