Index: build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java |
diff --git a/build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java b/build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java |
index e800a3941395b34a4afc96938c6dac999b3b86c4..beb26facda44e40dc31ec9ced6e18415803a29c9 100644 |
--- a/build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java |
+++ b/build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java |
@@ -4,8 +4,6 @@ |
package org.chromium.javaassertionenabler; |
-import com.google.common.io.ByteStreams; |
- |
import org.objectweb.asm.ClassReader; |
import org.objectweb.asm.ClassVisitor; |
import org.objectweb.asm.ClassWriter; |
@@ -14,21 +12,30 @@ import org.objectweb.asm.Opcodes; |
import java.io.BufferedInputStream; |
import java.io.BufferedOutputStream; |
+import java.io.ByteArrayOutputStream; |
+import java.io.FileInputStream; |
import java.io.FileOutputStream; |
import java.io.IOException; |
-import java.util.Collections; |
-import java.util.jar.JarEntry; |
-import java.util.jar.JarFile; |
-import java.util.jar.JarOutputStream; |
+import java.io.InputStream; |
+import java.nio.file.Files; |
+import java.nio.file.Path; |
+import java.nio.file.Paths; |
+import java.nio.file.StandardCopyOption; |
+import java.util.zip.ZipEntry; |
+import java.util.zip.ZipInputStream; |
+import java.util.zip.ZipOutputStream; |
/** |
* An application that enables Java ASSERT statements by modifying Java bytecode. It takes in a JAR |
* file, modifies bytecode of classes that use ASSERT, and outputs the bytecode to a new JAR file. |
*/ |
class AssertionEnabler { |
+ static final String ASSERTION_DISABLED_NAME = "$assertionsDisabled"; |
static final String CLASS_FILE_SUFFIX = ".class"; |
static final String STATIC_INITIALIZER_NAME = "<clinit>"; |
- static final String ASSERTION_DISABLED_NAME = "$assertionsDisabled"; |
+ static final String TEMPORARY_FILE_SUFFIX = ".temp"; |
+ |
+ static final int BUFFER_SIZE = 16384; |
static class AssertionEnablerVisitor extends ClassVisitor { |
AssertionEnablerVisitor(ClassWriter writer) { |
@@ -68,33 +75,53 @@ class AssertionEnabler { |
} |
} |
+ static byte[] readAllBytes(InputStream inputStream) throws IOException { |
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream(); |
+ int numRead = 0; |
+ byte[] data = new byte[BUFFER_SIZE]; |
+ while ((numRead = inputStream.read(data, 0, data.length)) != -1) { |
+ buffer.write(data, 0, numRead); |
+ } |
+ |
+ return buffer.toByteArray(); |
+ } |
+ |
static void enableAssertionInJar(String inputJarPath, String outputJarPath) { |
- try (JarOutputStream outputStream = new JarOutputStream( |
- new BufferedOutputStream(new FileOutputStream(outputJarPath)))) { |
- JarFile jarFile = new JarFile(inputJarPath); |
- for (JarEntry entry : Collections.list(jarFile.entries())) { |
- try (BufferedInputStream inputStream = new BufferedInputStream( |
- jarFile.getInputStream(entry))) { |
- byte[] byteCode = ByteStreams.toByteArray(inputStream); |
+ String tempJarPath = outputJarPath + TEMPORARY_FILE_SUFFIX; |
+ try (ZipInputStream inputStream = new ZipInputStream( |
+ new BufferedInputStream(new FileInputStream(inputJarPath))); |
+ ZipOutputStream tempStream = new ZipOutputStream( |
+ new BufferedOutputStream(new FileOutputStream(tempJarPath)))) { |
+ ZipEntry entry = null; |
- if (entry.isDirectory() || !entry.getName().endsWith(CLASS_FILE_SUFFIX)) { |
- outputStream.putNextEntry(entry); |
- outputStream.write(byteCode); |
- outputStream.closeEntry(); |
- continue; |
- } |
- ClassReader reader = new ClassReader(byteCode); |
- ClassWriter writer = new ClassWriter(reader, 0); |
- reader.accept(new AssertionEnablerVisitor(writer), 0); |
- byte[] patchedByteCode = writer.toByteArray(); |
- outputStream.putNextEntry(new JarEntry(entry.getName())); |
- outputStream.write(patchedByteCode); |
- outputStream.closeEntry(); |
+ while ((entry = inputStream.getNextEntry()) != null) { |
+ byte[] byteCode = readAllBytes(inputStream); |
+ |
+ if (entry.isDirectory() || !entry.getName().endsWith(CLASS_FILE_SUFFIX)) { |
+ tempStream.putNextEntry(entry); |
+ tempStream.write(byteCode); |
+ tempStream.closeEntry(); |
+ continue; |
} |
+ ClassReader reader = new ClassReader(byteCode); |
+ ClassWriter writer = new ClassWriter(reader, 0); |
+ reader.accept(new AssertionEnablerVisitor(writer), 0); |
+ byte[] patchedByteCode = writer.toByteArray(); |
+ tempStream.putNextEntry(new ZipEntry(entry.getName())); |
+ tempStream.write(patchedByteCode); |
+ tempStream.closeEntry(); |
} |
} catch (IOException e) { |
throw new RuntimeException(e); |
} |
+ |
+ try { |
+ Path src = Paths.get(tempJarPath); |
+ Path dest = Paths.get(outputJarPath); |
+ Files.move(src, dest, StandardCopyOption.REPLACE_EXISTING); |
+ } catch (IOException ioException) { |
+ throw new RuntimeException(ioException); |
+ } |
} |
public static void main(String[] args) { |