From a5d0caceddf8b54ec95bec3edd181a960df51fb2 Mon Sep 17 00:00:00 2001 From: John McCutchan Date: Wed, 13 Mar 2024 13:55:26 -0700 Subject: [PATCH] Disable cleaning up ImageReaders in memory pressure callback We originally added this cleanup code to work around a Samsung-specific Android 14 bug where after resuming an application any ImageReaders are busted. According to the Android team what Samsung is doing is a violation of the "spec". The fix ended up breaking VirtualDisplay platform views after a suspend/resume because the surface we pass to the VirtualDisplay is no longer valid after the resume and we have no way of fixing that. This PR removes the Samsung-specific hacky fix, restoring the behaviour of VirtualDisplay backed platform views. We have an internal bug with Samsung to address the root cause. --- .../embedding/engine/renderer/FlutterRenderer.java | 8 ++++++++ .../embedding/engine/renderer/FlutterRendererTest.java | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java index 3f920cf126b34..df0e5b556a0d3 100644 --- a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java +++ b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java @@ -414,6 +414,11 @@ final class ImageReaderSurfaceProducer // Flip when debugging to see verbose logs. private static final boolean VERBOSE_LOGS = false; + // If we cleanup the ImageReaders on memory pressure it breaks VirtualDisplay + // backed platform views. Disable for now as this is only necessary to work + // around a Samsung-specific Android 14 bug. + private static final boolean CLEANUP_ON_MEMORY_PRESSURE = false; + private final long id; private boolean released; @@ -649,6 +654,9 @@ PerImage dequeueImage() { @Override public void onTrimMemory(int level) { + if (!CLEANUP_ON_MEMORY_PRESSURE) { + return; + } cleanup(); createNewReader = true; } diff --git a/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java b/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java index 50f83d5fb8e0a..bc36ed3075f73 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java @@ -648,11 +648,12 @@ public void ImageReaderSurfaceProducerTrimMemoryCallback() { assertEquals(1, texture.numImages()); // Invoke the onTrimMemory callback. + // This should do nothing. texture.onTrimMemory(0); shadowOf(Looper.getMainLooper()).idle(); - assertEquals(0, texture.numImageReaders()); - assertEquals(0, texture.numImages()); + assertEquals(1, texture.numImageReaders()); + assertEquals(1, texture.numImages()); } // A 0x0 ImageReader is a runtime error.