Skip to content

android_hardware_smoke_test: Improve reliability - #191374

Merged
auto-submit[bot] merged 6 commits into
flutter:masterfrom
andywolff:apktest_reliability
Aug 21, 2026
Merged

auto-submit[bot] merged 6 commits into
flutter:masterfrom
andywolff:apktest_reliability

Conversation

@andywolff

Copy link
Copy Markdown
Contributor

Issue #191348 shows that the detection and retry behavior introduced in PR #190110 did not solve the issue.

Previously, engine cache cleanup was placed solely in @AfterClass tearDownClass(). When a test run failed mid-suite on attempt 1, JUnit aborted before @AfterClass could run. When attempt 2 launched, MainActivity retrieved the corrupted engine from cache, guaranteeing that subsequent attempts failed with blank screenshots, which matches what we see in the run history.

To fix this, we move cache cleanup to MainActivity.evictEngineCache(). FlutterActivityTest.kt invokes this cleanup during class teardown and whenever an EglInitializationException or BlankScreenshotException occurs, ensuring any retry starts with a clean engine instance.

We also reduce the retry cap in run_android_hardware_smoke_tests.dart from 3 attempts to 2 to avoid 30-minute LUCI timeouts on broken emulators, which we saw some of in tryjobs.

I think this should be an infrastructure failure. So if an unrecoverable EGL collapse occurs across both attempts, the runner logs an infrastructure failure and exits with code 2 (INFRA_FAILURE)

We also saw some logs which suggest HWUI repeatedly attempted 10-bit color format negotiation (101010-2), which fails on SwiftShader CPU drivers. This could contribute to an increased rate of EGL errors, so MainActivity.onCreate() now explicitly locks the window pixel format to PixelFormat.RGBA_8888.

Pre-launch Checklist

…king, engine cache eviction, and infrastructure failure exit codes
@andywolff andywolff added the CICD Run CI/CD label Aug 19, 2026
@andywolff

Copy link
Copy Markdown
Contributor Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the Android hardware smoke tests to improve EGL failure detection and engine cache management. It reduces retry attempts, checks both logcat and driver output for EGL errors, and introduces an engine cache eviction mechanism. Feedback recommends making the engine cache eviction synchronous when called from non-main threads to prevent race conditions during retries, and setting the window pixel format before calling super.onCreate to avoid initialization issues.

@andywolff

Copy link
Copy Markdown
Contributor Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the Android hardware smoke tests to improve reliability and EGL failure handling. Key changes include locking the window pixel format to 8-bit sRGB to prevent negotiation errors, updating the retry loop to check both logcat and driver output for EGL failures, and introducing a centralized evictEngineCache method to clear the cached Flutter engine. The review feedback suggests simplifying the concurrency logic in evictEngineCache by running it directly on the main thread and wrapping its invocations in the test class with runOnMainSync to prevent potential CI hangs.

@andywolff

Copy link
Copy Markdown
Contributor Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the Android hardware smoke tests to improve EGL/graphics failure detection and recovery. Key changes include locking the window pixel format to 8-bit sRGB in MainActivity to prevent format negotiation errors, introducing an engine cache eviction mechanism on failures, and updating the test runner to inspect both logcat and driver output for EGL pipeline collapses. Feedback suggests expanding the driver output check in the test runner to include EglInitializationException so that explicit initialization failures are correctly caught and handled.

Comment thread dev/bots/suite_runners/run_android_hardware_smoke_tests.dart Outdated
@andywolff
andywolff marked this pull request as ready for review August 19, 2026 22:11

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the Android hardware smoke tests by locking the window pixel format to 8-bit sRGB (RGBA_8888) in MainActivity to prevent SwiftShader negotiation errors, introducing a centralized engine cache eviction helper, and refactoring the retry loop in the test runner to check both logcat and driver output for EGL failures. Feedback was provided regarding the direct call to io.exit(2), which can bypass critical cleanup steps (such as restoring AndroidManifest.xml in finally blocks), suggesting throwing a custom exception instead.

Comment thread dev/bots/suite_runners/run_android_hardware_smoke_tests.dart Outdated
@andywolff
andywolff requested a review from b-luk August 20, 2026 04:24

@b-luk b-luk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM other than a small nit

Comment thread dev/bots/suite_runners/run_android_hardware_smoke_tests.dart Outdated
@andywolff
andywolff requested a review from b-luk August 20, 2026 21:22
auto-submit Bot pushed a commit to flutter/packages that referenced this pull request Aug 22, 2026
Roll Flutter from c2437523d308 to 65c9a8dc60bc (195 revisions)

flutter/flutter@c243752...65c9a8d

2026-08-22 [email protected] Roll ICU from d578f2e8b7bd to 8cc91d9b6ab9 (1 revision) (flutter/flutter#191542)
2026-08-22 [email protected] Roll Skia from 666a9b3d5cf0 to ad2106c0bb64 (3 revisions) (flutter/flutter#191527)
2026-08-22 [email protected] Roll Fuchsia Test Scripts from KaOq3EE4qJ9fnaaaK... to 0iCv10IlKfiilEBOU... (flutter/flutter#191524)
2026-08-22 [email protected] [flutter_tools] Add tests for negative lookahead regex in test runner and batch entrypoints (flutter/flutter#191438)
2026-08-22 [email protected] Roll Skia from 0c37868737fa to 666a9b3d5cf0 (2 revisions) (flutter/flutter#191518)
2026-08-21 [email protected] Revert "[input] Migrate fuchsia.ui.pointerinjector to TouchSource (#190855) (flutter/flutter#191509)
2026-08-21 [email protected] Fixes windows gallery benchmarks by forcing mobile layout (flutter/flutter#191507)
2026-08-21 [email protected] [flutter_tools] Restrict WebAssetServer source resolution to source map extensions (flutter/flutter#191501)
2026-08-21 [email protected] Roll Skia from f6900c5b8439 to 0c37868737fa (2 revisions) (flutter/flutter#191504)
2026-08-21 [email protected] Refactor `FlutterDevice.connect` and VM service discovery (flutter/flutter#191221)
2026-08-21 [email protected] [flutter_tools] Fix crash when migrating flow-style exclude lists in analysis_options.yaml (flutter/flutter#191269)
2026-08-21 [email protected] [rules] Add packages/flutter_tools/gradle/AGENTS.md rules (flutter/flutter#191486)
2026-08-21 [email protected] [flutter_tools] refactor CLI argument architecture with typed option descriptors and bundles (PoC) (flutter/flutter#191018)
2026-08-21 [email protected] tools: Extract Dart SDK to temp directory before moving to final location (flutter/flutter#191263)
2026-08-21 [email protected] [web] Move CanvasKit fragment shader classes to canvaskit/fragment_shader.dart (flutter/flutter#191451)
2026-08-21 [email protected] Roll Fuchsia Linux SDK from GCQlmt6h-esJsNubS... to ic6GjOSn-KN508XyK... (flutter/flutter#191485)
2026-08-21 [email protected] [Widget Preview] Isolate PageStorage scope in widget preview group expansion tile (flutter/flutter#191378)
2026-08-21 [email protected] [flutter_tools] Deprecate --build and --no-build flags on flutter run (flutter/flutter#191358)
2026-08-21 [email protected] Roll Skia from 70988bed1b3b to f6900c5b8439 (2 revisions) (flutter/flutter#191481)
2026-08-21 [email protected] Roll Packages from 1785501 to 252bb33 (6 revisions) (flutter/flutter#191480)
2026-08-21 [email protected] Roll Fuchsia Linux SDK from 20IJas24bZiNmCZTK... to GCQlmt6h-esJsNubS... (flutter/flutter#191415)
2026-08-21 [email protected] Roll Skia from 2ba6971bd0d1 to 70988bed1b3b (2 revisions) (flutter/flutter#191476)
2026-08-21 [email protected] Roll Skia from 1d5f72537ba6 to 2ba6971bd0d1 (2 revisions) (flutter/flutter#191473)
2026-08-21 [email protected] Roll Skia from 2c25efd2e369 to 1d5f72537ba6 (1 revision) (flutter/flutter#191472)
2026-08-21 [email protected] Roll Skia from 09b1b810850a to 2c25efd2e369 (9 revisions) (flutter/flutter#191470)
2026-08-21 [email protected] [Impeller] fix position of cached single glyph text shadows (flutter/flutter#191325)
2026-08-21 [email protected] Roll Skia from abdf8821f313 to 09b1b810850a (15 revisions) (flutter/flutter#191458)
2026-08-21 [email protected] Document that programmatic TextEditingController changes do not run input formatters (flutter/flutter#190166)
2026-08-21 [email protected] Adds new gallery benchmarks to windows (skia and impeller) (flutter/flutter#191454)
2026-08-21 [email protected] iOS: Deprecate FlutterEngine.isGpuDisabled (flutter/flutter#191393)
2026-08-21 [email protected] Revert: [web] Unskip decoration image lerp tests (flutter/flutter#191462)
2026-08-20 [email protected] android_hardware_smoke_test: Improve reliability (flutter/flutter#191374)
2026-08-20 [email protected] Don't size or offset the Android platform view before it is laid out (flutter/flutter#190895)
2026-08-20 [email protected] [iOS][add2app] Skip building SwiftPM plugins when generating CocoaPods artifacts (flutter/flutter#190736)
2026-08-20 [email protected] Optimize JSONMessageCodec UTF-8 conversion (flutter/flutter#190529)
2026-08-20 [email protected] [FML] Replace deprecated wstring_convert with Win32 APIs (flutter/flutter#191394)
2026-08-20 [email protected] SliverFillRemaining extends beyond viewport size when fillOverscroll is true (flutter/flutter#191236)
2026-08-20 [email protected] [flutter_tools] Update argParser usageLineLength when --wrap-column is passed (flutter/flutter#191264)
2026-08-20 [email protected] [flutter_tools] Fix UNC path resolution in depfile parsing on Windows (flutter/flutter#191265)
2026-08-20 [email protected] [web] Unskip decoration image lerp tests (flutter/flutter#191426)
2026-08-20 [email protected] Do not inject 'type' and 'method' into service extension responses (flutter/flutter#190946)
2026-08-20 [email protected] [flutter_tools] Fix crash in symbolize command on stream error (flutter/flutter#191273)
2026-08-20 [email protected] [flutter_tools] Prevent deletion of shared native asset hooks outputs as stale (flutter/flutter#191272)
2026-08-20 [email protected] [flutter_tools] Support package wildcard assets in app pubspec (flutter/flutter#191266)
2026-08-20 [email protected] Add SliverClipRect and SliverClipRRect (flutter/flutter#179003)
2026-08-20 [email protected] [flutter_tools] Implement Diagnostics extension slice and doctor integration (flutter/flutter#191162)
...
pull Bot pushed a commit to Mu-L/flutter that referenced this pull request Sep 3, 2026
flutter#192197)

Promotes the `Linux_android_emu_vulkan_stable
android_hardware_smoke_vulkan_instrumented_tests` and `Linux_android_emu
android_hardware_smoke_opengles_instrumented_tests` shards out of
bringup.


[PR flutter#191374
](flutter#191374) seems to have
successfully resolved the common failure modes for these tests. I'm
setting these as post-submit only because they're more expensive than
the driver tests, which already run in presubmit and should catch most
relevant problems.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant in-code documentation (doc comments with
`///`).
- [x] If this PR introduces a new feature or capability, I created and
linked a website documentation issue or PR in [flutter/website] (or
verified none is needed).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[flutter/website]: https://github.com/flutter/website
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CICD Run CI/CD

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants