From a30cf8b7e1a4f05e1fa7c72b62abc174d4923952 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 5 Aug 2022 16:28:52 -0700 Subject: [PATCH] Dumping view capture directly to file instead of loading it all in memory This avoid OOM when processing large data Bug: 241600398 Test: Verified on device Change-Id: I76072d52e47bea3a2f9802ce3b23ddae58fe8d23 --- src/com/android/launcher3/Launcher.java | 5 ++++- src/com/android/launcher3/util/ViewCapture.java | 15 +++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 38b46b03bf..5ee9aa8668 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -3027,7 +3027,10 @@ public class Launcher extends StatefulActivity writer.println(prefix + "\tmAppWidgetHost.isListening: " + mAppWidgetHost.isListening()); if (mViewCapture != null) { - writer.println(prefix + "\tmViewCapture: " + mViewCapture.dumpToString()); + writer.print(prefix + "\tmViewCapture: "); + writer.flush(); + mViewCapture.dump(fd); + writer.println(); } // Extra logging for general debugging diff --git a/src/com/android/launcher3/util/ViewCapture.java b/src/com/android/launcher3/util/ViewCapture.java index 140971b0ec..cf9ea699d9 100644 --- a/src/com/android/launcher3/util/ViewCapture.java +++ b/src/com/android/launcher3/util/ViewCapture.java @@ -21,6 +21,7 @@ import android.os.Looper; import android.os.SystemClock; import android.os.Trace; import android.util.Base64; +import android.util.Base64OutputStream; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -32,6 +33,9 @@ import com.android.launcher3.view.ViewCaptureData.ExportedData; import com.android.launcher3.view.ViewCaptureData.FrameData; import com.android.launcher3.view.ViewCaptureData.ViewNode; +import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.OutputStream; import java.util.concurrent.FutureTask; /** @@ -73,7 +77,7 @@ public class ViewCapture implements OnDrawListener { /** * Creates a proto of all the data captured so far. */ - public String dumpToString() { + public void dump(FileDescriptor out) { Handler handler = mRoot.getHandler(); if (handler == null) { handler = Executors.MAIN_EXECUTOR.getHandler(); @@ -84,12 +88,15 @@ public class ViewCapture implements OnDrawListener { } else { handler.post(task); } - try { - return Base64.encodeToString(task.get().toByteArray(), + try (OutputStream os = new FileOutputStream(out)) { + ExportedData data = task.get(); + Base64OutputStream encodedOS = new Base64OutputStream(os, Base64.NO_CLOSE | Base64.NO_PADDING | Base64.NO_WRAP); + data.writeTo(encodedOS); + encodedOS.close(); + os.flush(); } catch (Exception e) { Log.e(TAG, "Error capturing proto", e); - return "--error--"; } }