Skip to content

Commit 8d241e4

Browse files
authored
[Android] Prevent FlutterRenderer listener from calling JNI after detach (flutter#19558)
1 parent 617bd88 commit 8d241e4

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,11 @@ final class SurfaceTextureRegistryEntry implements TextureRegistry.SurfaceTextur
131131
new SurfaceTexture.OnFrameAvailableListener() {
132132
@Override
133133
public void onFrameAvailable(@NonNull SurfaceTexture texture) {
134-
if (released) {
135-
// Even though we make sure to unregister the callback before releasing, as of Android
136-
// O
137-
// SurfaceTexture has a data race when accessing the callback, so the callback may
138-
// still be called by a stale reference after released==true and mNativeView==null.
134+
if (released || !flutterJNI.isAttached()) {
135+
// Even though we make sure to unregister the callback before releasing, as of
136+
// Android O, SurfaceTexture has a data race when accessing the callback, so the
137+
// callback may still be called by a stale reference after released==true and
138+
// mNativeView==null.
139139
return;
140140
}
141141
markTextureFrameAvailable(id);

shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java

+19
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,23 @@ public void itStopsRenderingToSurfaceWhenRequested() {
9797
// Verify behavior under test.
9898
verify(fakeFlutterJNI, times(1)).onSurfaceDestroyed();
9999
}
100+
101+
@Test
102+
public void itStopsSurfaceTextureCallbackWhenDetached() {
103+
// Setup the test.
104+
FlutterRenderer flutterRenderer = new FlutterRenderer(fakeFlutterJNI);
105+
106+
fakeFlutterJNI.detachFromNativeAndReleaseResources();
107+
108+
FlutterRenderer.SurfaceTextureRegistryEntry entry =
109+
(FlutterRenderer.SurfaceTextureRegistryEntry) flutterRenderer.createSurfaceTexture();
110+
111+
flutterRenderer.startRenderingToSurface(fakeSurface);
112+
113+
// Execute the behavior under test.
114+
flutterRenderer.stopRenderingToSurface();
115+
116+
// Verify behavior under test.
117+
verify(fakeFlutterJNI, times(0)).markTextureFrameAvailable(eq(entry.id()));
118+
}
100119
}

0 commit comments

Comments
 (0)