Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 00f4a6ec authored by Felipe Leme's avatar Felipe Leme
Browse files

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

BUG: 20447313
Change-Id: I66f90cdd2a07288f9e37a38185f1583c57cf65c8
parent a106554c
Loading
Loading
Loading
Loading
+5 −23
Original line number Diff line number Diff line
@@ -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.
     */