aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorGravatar Adam Michael <ajmichael@google.com>2016-10-25 21:25:20 +0000
committerGravatar John Cater <jcater@google.com>2016-10-26 11:10:58 +0000
commit97cc5be8787145bd0402406b67b2a28df5348788 (patch)
tree4fc219a70f7e82285e3096d0dce3b4ee6f6a83ff /tools
parent83ffb5e7bc034ea2dd1e957249079b3884a9450d (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.py40
-rw-r--r--tools/android/aar_embedded_jars_extractor_test.py70
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__":