Improved zipping logic so it zips chunks, instead of the whole file at once, to avoid OOM.

BUG: 20447313
Change-Id: I66f90cdd2a07288f9e37a38185f1583c57cf65c8
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.Patterns;
 
 import com.google.android.collect.Lists;
+import libcore.io.Streams;
 
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
@@ -191,20 +192,17 @@
      * 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 @@
         }
     }
 
-    /** 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.
      */