Repository navigation
[Android] Skip the HardwareBuffer defect fallback for platform views - #193441
Conversation
There was a problem hiding this comment.
Code Review
This pull request introduces a static hardwareBufferDefectOverride variable and a corresponding setHardwareBufferDefectOverride method in FlutterRenderer to allow overriding the Android HardwareBuffer defect check. The hasAndroidHardwareBufferDefect method is updated to respect this override when it is set. Additionally, unit tests are added in FlutterRendererTest to verify the override behavior under various SDK versions and configurations, with a teardown method to reset the override after each test. I have no feedback to provide.
gmackall
left a comment
There was a problem hiding this comment.
I'm skeptical of adding this api - it seems like it would be pushing a burden that should be on Flutter itself on to app developers, and locking in a permanent public API for an internal rendering workaround.
I think there are two paths here which require different treatment:
- #181931 was attempting to fix Flutter
Texturewidgets (specificallyvideo_playerin #166481), where a plugin callsTextureRegistry.createSurfaceProducer()and passes theSurfacedirectly toMediaCodec(OMX.hisi.video.decoder.avc), which fails during buffer allocation when backed byImageReaderSurfaceProduceron Huawei API <= 29 devices. - PlatformViews (
AndroidView/PlatformViewsController.makePlatformViewRenderTarget) also callcreateSurfaceProducer(lifecycle)under the hood on API 29+ for Texture Layer Hybrid Composition, so #181931 (unintentionally, it seems) moved PlatformViews onto theSurfaceTextureSurfaceProducerfallback as well. However, PlatformViews don't connectMediaCodecdirectly to theImageReadersurface—Android's UI renderer draws the view hierarchy into it vialockHardwareCanvas()(and any childTextureViewinside the PlatformView renders into its own internalSurfaceTexturefirst). In fact, PlatformViews on Huawei API 29 usedImageReaderSurfaceProducerin stable from Flutter 3.29.2 (#164201) through 3.41 without issue.
Because a static override is process-wide, an app on Huawei Android 10 that uses both video_player and a PlatformView (note that devices like MAR-LX1A appear in both #166481 and #188303) wouldn't have a single setting that works for both.
Instead of adding a public override that apps have to opt into, could we scope the hasAndroidHardwareBufferDefect() fallback so that PlatformViewsController.makePlatformViewRenderTarget bypasses it and stays on ImageReaderSurfaceProducer on API 29+?That would fix #188303 out of the box for all apps while keeping the #181931 fallback for external texture plugins like video_player.
Would you be open to updating the PR along those lines (roughly, the gist here) and testing that on your JNY-LX1 device?
eb8ed1d to
77b10f6
Compare
|
Thanks, that makes sense. I updated the PR along the lines of your gist and removed the setter (rebased on main, one commit). On top of the gist I added a test for API 28 and a Tested on JNY-LX1 / Android 10 with 3.47.5 plus this change, in our app and in the repro app, which now also plays a video with
|
Nice! |
|
Triage housekeeping, I think this will also fix #196048 |
|
autosubmit label was removed for flutter/flutter/193441, because The base commit of the PR is older than 7 days and can not be merged. Please merge the latest changes from the main into this branch and resubmit the PR. |
|
autosubmit label was removed for flutter/flutter/193441, because - The status or check suite Presubmit has failed. Please fix the issues identified (or deflake) before re-applying this label. |
|
auto label is removed for flutter/flutter/193441, Failed to enqueue flutter/flutter/193441 with HTTP 400: Pull request Required status check "Check Code Freeze" is expected.. |
|
auto label is removed for flutter/flutter/193441, Failed to enqueue flutter/flutter/193441 with HTTP 400: Pull request Required status check "Check Code Freeze" is expected.. |
Hmm maybe we need to update autosubmit bot to treat expected like queued? They are being used interchangeably at least here, right, this check is underway. |
oh wait nvm I needed to approve workflows to run |
|
auto label is removed for flutter/flutter/193441, Failed to enqueue flutter/flutter/193441 with HTTP 400: Pull request Required status check "Check Code Freeze" is expected.. |
I approved workflows please I'm begging you, run |
|
auto label is removed for flutter/flutter/193441, Failed to enqueue flutter/flutter/193441 with HTTP 400: Pull request Required status check "Check Code Freeze" is expected.. |
|
Thanks for working on this! |
…13653) Manual roll Flutter from 9c427b5d7b1c to 1b9585481095 (32 revisions) Manual roll requested by [email protected] flutter/flutter@9c427b5...1b95854 2026-11-13 [email protected] Roll pub packages (flutter/flutter#196541) 2026-11-13 [email protected] Do not route PRs for review without cla, convert to draft (flutter/flutter#196341) 2026-11-13 [email protected] Roll Skia from d87a6c04da74 to 11f46cfe8838 (13 revisions) (flutter/flutter#196533) 2026-11-13 [email protected] [flutter_tools, flutter_test] Deprecate --experimental-faster-testing (flutter/flutter#196123) 2026-11-13 [email protected] [flutter_tools] Handle RPCError in ScreenshotCommand.runSkia (flutter/flutter#196132) 2026-11-13 [email protected] Roll Dart SDK from a8b961fd48bb to c91e8b6674e2 (2 revisions) (flutter/flutter#196502) 2026-11-13 [email protected] Roll Skia from 0c5ce4960cef to d87a6c04da74 (12 revisions) (flutter/flutter#196497) 2026-11-13 [email protected] Don't call `skia_image()` for raster-owned images in `DlImage::Equals` (flutter/flutter#196473) 2026-11-13 [email protected] [flutter_tools] Require FlutterCommandRunner DI fields and extract findCommandName (flutter/flutter#196331) 2026-11-13 [email protected] [web] Unify ui.Canvas behind a shared EngineCanvas frontend (flutter/flutter#196348) 2026-11-13 [email protected] Link to MediaQuery.displayFeaturesOf from DisplayFeatures (flutter/flutter#193728) 2026-11-13 [email protected] Removes reference to unnecessary ensureSemantics call in doc (flutter/flutter#195831) 2026-11-13 [email protected] [flutter_tools] Register trackWidgetCreation in AppleBuildOptionsBundle (flutter/flutter#196078) 2026-11-12 [email protected] [Android] Skip the HardwareBuffer defect fallback for platform views (flutter/flutter#193441) 2026-11-12 [email protected] Fix supports_decal check in framebuffer_blend.frag (flutter/flutter#196227) 2026-11-12 [email protected] [ios] Update the screen in didUpdateEffectiveGeometry (flutter/flutter#195508) 2026-11-12 [email protected] [flutter_tools] Add `Cache-Control` headers for web test assets (flutter/flutter#196414) 2026-11-12 [email protected] Roll Skia from 3b71ec08218f to 0c5ce4960cef (16 revisions) (flutter/flutter#196472) 2026-11-12 [email protected] [web] Render bounded ImageFilter.blur on wimp (flutter/flutter#196081) 2026-11-12 [email protected] Roll Dart SDK from 69567bd3c427 to a8b961fd48bb (2 revisions) (flutter/flutter#196464) 2026-11-12 [email protected] [engine] Release the Skia OpenGL resource context on shutdown (flutter/flutter#193592) 2026-11-12 [email protected] [web] Fix decoding of still AVIF images on Chrome (flutter/flutter#195958) 2026-11-12 [email protected] Gate SurfaceControl context setting on API 34+ (flutter/flutter#196394) 2026-11-12 [email protected] [flutter_tools] Only pass on a valid root tool in DASH__TOOL (flutter/flutter#196228) 2026-11-12 [email protected] Support GL_TEXTURE_EXTERNAL_OES embedder textures in Impeller (flutter/flutter#195857) 2026-11-12 [email protected] Stop building linux/wasm_release in local_engine_builds (flutter/flutter#196345) 2026-11-12 [email protected] Split flame out of Linux customer_testing (flutter/flutter#196347) 2026-11-12 Jiwon Lee [Windows] Fix Space input after Alt+Space with previous Microsoft IME (flutter/flutter#192105) 2026-11-12 [email protected] [flutter_tools] Add ToolExtensionException, exit() guard, graceful shutdown, and base modifiers (flutter/flutter#195908) 2026-11-12 [email protected] Roll Packages from 653628e to 14f9933 (9 revisions) (flutter/flutter#196450) 2026-11-12 [email protected] Roll Dart SDK from e5add7a25b32 to 69567bd3c427 (2 revisions) (flutter/flutter#196437) 2026-11-12 [email protected] Roll Skia from 9aa2513a4ac9 to 3b71ec08218f (1 revision) (flutter/flutter#196436) If this roll has caused a breakage, revert this CL and set the roller to dry run mode using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 ...
PR #181931 (the fix for #166481) made
FlutterRenderer.createSurfaceProducer()returnSurfaceTextureSurfaceProduceron Huawei devices with API <= 29. That fallback is for plugins likevideo_player, which pass the producer's surface straight toMediaCodec. Platform views call the same method for Texture Layer Hybrid Composition, so they got the fallback too. On Huawei JNY-LX1 / Android 10 this makes a TextureView with OpenGL content inside anAndroidViewblank or frozen (#188303).This keeps platform views on
ImageReaderSurfaceProduceron API 29+, as it was from 3.29.2 to 3.41:FlutterRenderer.createPlatformViewSurfaceProducer(SurfaceLifecycle)creates a producer without the HardwareBuffer defect check. The API 29 requirement anddebugForceSurfaceProducerGlTexturesstill apply.PlatformViewsController.makePlatformViewRenderTargetuses it when the texture registry is aFlutterRenderer.createSurfaceProducer()is unchanged, so plugins keep the Video player on Android 29 device does not play media #166481 fallback.Apps do not need to change anything.
Fixes #188303. Related to #166481 and #181931.
Testing:
FlutterRendererTest: platform view producer uses ImageReader on Huawei API 29 and SurfaceTexture below API 29, plugin producers withresetInBackgroundkeep the fallback.PlatformViewsControllerTest: texture layer composition asksFlutterRendererfor the platform view producer and not for the plugin one.video_player(https://github.com/luskan/flutter_textureview_platform_view), same device and 3.47.5. With this change both the TextureView platform view and the video keep updating. With stock 3.47.5 the platform view freezes. With a process wide override to ImageReader the video fails with the Video player on Android 29 device does not play media #166481 ACodec error.Pre-launch Checklist
If you need help, consider asking for advice on the #hackers-new channel on Discord.
If this change needs to override an active code freeze, provide a comment explaining why. The code freeze workflow can be overridden by code reviewers. See pinned issues for any active code freezes with guidance.
Note: The Flutter team is currently trialing the use of Gemini Code Assist for GitHub. Comments from the gemini-code-assist bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.