diff options
author | Adam Michael <ajmichael@google.com> | 2016-10-25 21:25:20 +0000 |
---|---|---|
committer | John Cater <jcater@google.com> | 2016-10-26 11:10:58 +0000 |
commit | 97cc5be8787145bd0402406b67b2a28df5348788 (patch) | |
tree | 4fc219a70f7e82285e3096d0dce3b4ee6f6a83ff /tools | |
parent | 83ffb5e7bc034ea2dd1e957249079b3884a9450d (diff) |
Merge all jars in AAR in aar_import, not just classes.jar
See https://github.com/bazelbuild/bazel/issues/1935
--
MOS_MIGRATED_REVID=137202533
Diffstat (limited to 'tools')
-rw-r--r-- | tools/android/aar_embedded_jars_extractor.py | 40 | ||||
-rw-r--r-- | tools/android/aar_embedded_jars_extractor_test.py | 70 |
2 files changed, 71 insertions, 39 deletions
diff --git a/tools/android/aar_embedded_jars_extractor.py b/tools/android/aar_embedded_jars_extractor.py index 099ebac1aa..22326ef152 100644 --- a/tools/android/aar_embedded_jars_extractor.py +++ b/tools/android/aar_embedded_jars_extractor.py @@ -12,13 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""A tool for extracting jar files from an AAR and failing gracefully. +"""A tool for extracting all jar files from an AAR. -If the jar file is present within the archive, it is extracted into the output -directory. If not, an empty jar is created in the output directory. +An AAR may contain JARs at /classes.jar and /libs/*.jar. This tool extracts all +of the jars and creates a param file for singlejar to merge them into one jar. """ import os +import re import sys import zipfile @@ -26,27 +27,30 @@ from third_party.py import gflags FLAGS = gflags.FLAGS -gflags.DEFINE_string("input_archive", None, "Input archive") -gflags.MarkFlagAsRequired("input_archive") -gflags.DEFINE_string("filename", None, "Filename of JAR to extract") -gflags.MarkFlagAsRequired("filename") -gflags.DEFINE_string("output_dir", None, "Output directory") +gflags.DEFINE_string("input_aar", None, "Input AAR") +gflags.MarkFlagAsRequired("input_aar") +gflags.DEFINE_string( + "output_singlejar_param_file", None, "Output parameter file for singlejar") +gflags.MarkFlagAsRequired("output_singlejar_param_file") +gflags.DEFINE_string("output_dir", None, "Output directory to extract jars in") gflags.MarkFlagAsRequired("output_dir") -def ExtractEmbeddedJar(input_archive, filename, output_dir): - with zipfile.ZipFile(input_archive, "r") as archive: - if filename in archive.namelist(): - archive.extract(filename, output_dir) - else: - with zipfile.ZipFile(os.path.join(output_dir, filename), "w") as jar: - # All jar files must contain META-INF/MANIFEST.MF. - jar.writestr("META-INF/MANIFEST.MF", ("Manifest-Version: 1.0\n" - "Created-By: Bazel\n")) +def ExtractEmbeddedJars(aar, singlejar_param_file, output_dir): + os.makedirs(output_dir) + jar_pattern = re.compile("^(classes|libs/.+)\\.jar$") + singlejar_param_file.write("--exclude_build_data\n") + for name in aar.namelist(): + if jar_pattern.match(name): + singlejar_param_file.write("--sources\n") + singlejar_param_file.write(output_dir + "/" + name + "\n") + aar.extract(name, output_dir) def main(): - ExtractEmbeddedJar(FLAGS.input_archive, FLAGS.filename, FLAGS.output_dir) + with zipfile.ZipFile(FLAGS.input_aar, "r") as aar: + with open(FLAGS.output_singlejar_param_file, "w") as singlejar_param_file: + ExtractEmbeddedJars(aar, singlejar_param_file, FLAGS.output_dir) if __name__ == "__main__": FLAGS(sys.argv) diff --git a/tools/android/aar_embedded_jars_extractor_test.py b/tools/android/aar_embedded_jars_extractor_test.py index 145637fdd7..9f4dca3a24 100644 --- a/tools/android/aar_embedded_jars_extractor_test.py +++ b/tools/android/aar_embedded_jars_extractor_test.py @@ -14,36 +14,64 @@ """Tests for aar_embedded_jars_extractor.""" -import filecmp import os +import shutil +import StringIO import unittest import zipfile from tools.android import aar_embedded_jars_extractor -class EmbeddedJarExtractorTest(unittest.TestCase): +class AarEmbeddedJarsExtractor(unittest.TestCase): """Unit tests for aar_embedded_jars_extractor.py.""" - def testPassingJarFile(self): - bjar = zipfile.ZipFile("b.jar", "w") - bjar.close() - azip = zipfile.ZipFile("a.zip", "w") - azip.write("b.jar") - azip.close() - if not os.path.exists("output"): - os.mkdir("output") - aar_embedded_jars_extractor.ExtractEmbeddedJar("a.zip", "b.jar", "output") - self.assertTrue(filecmp.cmp("b.jar", "output/b.jar")) - - def testMissingJarFile(self): - azip = zipfile.ZipFile("a.zip", "w") - azip.close() - if not os.path.exists("output"): - os.mkdir("output") - aar_embedded_jars_extractor.ExtractEmbeddedJar("a.zip", "b.jar", "output") - bjar = zipfile.ZipFile("output/b.jar", "r") - self.assertEqual(["META-INF/MANIFEST.MF"], bjar.namelist()) + def setUp(self): + os.chdir(os.environ["TEST_TMPDIR"]) + + def tearDown(self): + shutil.rmtree("out_dir") + + def testNoJars(self): + aar = zipfile.ZipFile(StringIO.StringIO(), "w") + param_file = StringIO.StringIO() + aar_embedded_jars_extractor.ExtractEmbeddedJars(aar, param_file, "out_dir") + self.assertEqual([], os.listdir("out_dir")) + param_file.seek(0) + self.assertEqual("--exclude_build_data\n", param_file.read()) + + def testClassesJarAndLibsJars(self): + aar = zipfile.ZipFile(StringIO.StringIO(), "w") + aar.writestr("classes.jar", "") + aar.writestr("libs/a.jar", "") + aar.writestr("libs/b.jar", "") + param_file = StringIO.StringIO() + aar_embedded_jars_extractor.ExtractEmbeddedJars(aar, param_file, "out_dir") + self.assertItemsEqual(["classes.jar", "libs"], os.listdir("out_dir")) + self.assertItemsEqual(["a.jar", "b.jar"], os.listdir("out_dir/libs")) + param_file.seek(0) + self.assertEqual( + ["--exclude_build_data\n", + "--sources\n", + "out_dir/classes.jar\n", + "--sources\n", + "out_dir/libs/a.jar\n", + "--sources\n", + "out_dir/libs/b.jar\n"], + param_file.readlines()) + + def testOnlyClassesJar(self): + aar = zipfile.ZipFile(StringIO.StringIO(), "w") + aar.writestr("classes.jar", "") + param_file = StringIO.StringIO() + aar_embedded_jars_extractor.ExtractEmbeddedJars(aar, param_file, "out_dir") + self.assertEqual(["classes.jar"], os.listdir("out_dir")) + param_file.seek(0) + self.assertEqual( + ["--exclude_build_data\n", + "--sources\n", + "out_dir/classes.jar\n"], + param_file.readlines()) if __name__ == "__main__": |