From 00f4a6ecbca4a0286c7f283850e1af3c424818a0 Mon Sep 17 00:00:00 2001 From: Felipe Leme Date: Tue, 16 Jun 2015 10:25:06 -0700 Subject: Improved zipping logic so it zips chunks, instead of the whole file at once, to avoid OOM. BUG: 20447313 Change-Id: I66f90cdd2a07288f9e37a38185f1583c57cf65c8 --- .../src/com/android/shell/BugreportReceiver.java | 28 ++++------------------ 1 file changed, 5 insertions(+), 23 deletions(-) (limited to 'packages/Shell') diff --git a/packages/Shell/src/com/android/shell/BugreportReceiver.java b/packages/Shell/src/com/android/shell/BugreportReceiver.java index d299d66..13747ed 100644 --- a/packages/Shell/src/com/android/shell/BugreportReceiver.java +++ b/packages/Shell/src/com/android/shell/BugreportReceiver.java @@ -37,6 +37,7 @@ import android.util.Log; import android.util.Patterns; import com.google.android.collect.Lists; +import libcore.io.Streams; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; @@ -191,20 +192,17 @@ public class BugreportReceiver extends BroadcastReceiver { * original in case of failure). */ private static File zipBugreport(File bugreportFile) { - byte[] bytes = read(bugreportFile); - if (bytes == null) { - // Could not read bugreport, return original. - return bugreportFile; - } String bugreportPath = bugreportFile.getAbsolutePath(); String zippedPath = bugreportPath.replace(".txt", ".zip"); Log.v(TAG, "zipping " + bugreportPath + " as " + zippedPath); File bugreportZippedFile = new File(zippedPath); - try (ZipOutputStream zos = new ZipOutputStream( + try (InputStream is = new FileInputStream(bugreportFile); + ZipOutputStream zos = new ZipOutputStream( new BufferedOutputStream(new FileOutputStream(bugreportZippedFile)))) { ZipEntry entry = new ZipEntry("bugreport.txt"); zos.putNextEntry(entry); - zos.write(bytes); + int totalBytes = Streams.copy(is, zos); + Log.v(TAG, "size of original bugreport: " + totalBytes + " bytes"); zos.closeEntry(); // Delete old file; boolean deleted = bugreportFile.delete(); @@ -220,22 +218,6 @@ public class BugreportReceiver extends BroadcastReceiver { } } - /** Returns the content of file, or {@code null} in case of error. */ - private static byte[] read(File file) { - try (ByteArrayOutputStream output = new ByteArrayOutputStream(); - InputStream input = new FileInputStream(file)) { - byte[] buffer = new byte[4096]; - int read = 0; - while ((read = input.read(buffer)) != -1) { - output.write(buffer, 0, read); - } - return output.toByteArray(); - } catch (IOException e) { - Log.e(TAG, "IOException reading " + file.getAbsolutePath(), e); - return null; - } - } - /** * Find the best matching {@link Account} based on build properties. */ -- cgit v1.1