Skip to content

Conversation

@gaaclarke
Copy link
Member

@gaaclarke gaaclarke commented Jul 8, 2025

Started querying the app state for the gpu disabled sync switch when starting an engine without a view controller

fixes #166668

Testing: Integration test is not possible since it would require manipulation of the operating system and killing / restoring the app. Unit tests would require executing in the background or mocking out background detection which is pretty contrived and will complicate engine initialization. The simple cases will be covered with integration tests like the wide gamut devicelab tests which loads an image at startup and grabs a screenshot of it.

Pre-launch Checklist

If you need help, consider asking for advice on the #hackers-new channel on Discord.

…starting an engine without a view controller
@github-actions github-actions bot added platform-ios iOS applications specifically engine flutter/engine related. See also e: labels. team-ios Owned by iOS platform team labels Jul 8, 2025
@gaaclarke
Copy link
Member Author

gaaclarke commented Jul 8, 2025

This PR was tested manually with the following setup. The issue doesn't have reproduction code so I'm not sure this covers all cases:

Steps:

  1. Launch the app (profile or release)
  2. Background the app
  3. Kill the app
  4. Click on the notification to relaunch the app
  5. Verify the image is not magenta

I can't reproduce the original bug. I've tried variations where I lock the screen too as suggested in #166668 (comment) but I can't get it. According to #166668 (comment) the problem is non-deterministic though.

import Flutter
import UIKit
import UserNotifications
import OSLog

@main
@objc class AppDelegate: FlutterAppDelegate, FlutterPluginRegistrant {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    pluginRegistrant = self
    UNUserNotificationCenter.current().delegate = self
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
        if granted {
            print("Notification permission granted.")
        } else {
            print("Notification permission denied.")
        }
    }
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

  override func applicationDidEnterBackground(_ application: UIApplication) {
    let content = UNMutableNotificationContent()
    content.title = "Counter App"
    content.body = "You have been away for 10 seconds."
    content.sound = UNNotificationSound.default

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)
    let request = UNNotificationRequest(identifier: "backgroundNotification", content: content, trigger: trigger)

    UNUserNotificationCenter.current().add(request) { (error) in
        if let error = error {
            print("Error scheduling notification: \(error)")
        }
    }
  }

  override func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    completionHandler([.alert, .badge, .sound])
  }

  func register(with registry: any FlutterPluginRegistry) {
    GeneratedPluginRegistrant.register(with: registry)
  }
}

Comment on lines +851 to +855
self.isGpuDisabled = self.viewController
? self.viewController.stateIsBackground
: FlutterSharedApplication.application &&
FlutterSharedApplication.application.applicationState ==
UIApplicationStateBackground;
Copy link
Member Author

Choose a reason for hiding this comment

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

Maintains existing behavior for app extensions.

Copy link
Contributor

Choose a reason for hiding this comment

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

In app extensions, the FlutterSharedApplication.application is unavailable and you have to use the Scene instead. Should this attempt to use the Scene if the application is unavailable?

: [self isSceneStateMatching:UISceneActivationStateBackground];

Copy link
Member Author

Choose a reason for hiding this comment

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

In app extensions, the FlutterSharedApplication.application is unavailable and you have to use the Scene instead. Should this attempt to use the Scene if the application is unavailable?

It does check for the scene in self.viewController.stateIsBackground. So the question is really, "Can you have an app extension that is in a background state with an engine that doesn't have an associated view controller, which needs GPU access?" For that situation we can say for this PR that we do whatever we used to do, there is no change. I don't know if that situation is practical or possible. For example, I know memory requirements for app extensions is tight so you may not even be able to fit a second engine.

Copy link
Member

Choose a reason for hiding this comment

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

Here is a question: is there actually a code path to this code which sets viewController? I am trying to figure this out by looking at the code and I can't - I am starting to suspect it is always nil and can't be used at this point

e.g. ShareViewController calls [engine run] (which calls createShell) before it calls [self initWithEngine:...] which sets viewController.

Copy link
Member Author

Choose a reason for hiding this comment

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

Here is a question: is there actually a code path to this code which sets viewController?

These API's are hard to reason about because they are public. Anyone could be doing anything with them (eg add-to-app). For the simple case of loading a FlutterViewController from a storyboard, it looks like the view controller will be nil:

The FlutterViewController can be created before the FlutterEngine (

), but there is nothing that forces that.

What that means to me is that it's safest to construct the PR like this so we don't break any add-to-app cases and we have a workaround for people if it becomes problematic. For app extensions, I'm skeptical that app extensions can be initialized while an app is in the background. I think the more prudent thing is to keep the existing behavior for that.

@gaaclarke gaaclarke marked this pull request as ready for review July 8, 2025 17:50
@gaaclarke gaaclarke requested a review from a team as a code owner July 8, 2025 17:50
@gaaclarke gaaclarke requested review from mraleph and vashworth July 8, 2025 17:51
@mraleph
Copy link
Member

mraleph commented Jul 9, 2025

I actually managed to reproduce this today, after struggling through different variations yesterday. The key here is that the app (at least on iOS26 which I have installed on both available to me iOS devices) even when started in background due to notification arriving seems to initially have GPU access but then looses it after some delay. So any tests which submit GPU work fast enough will actually succeed.

Device log with some additional debug printing added
error	09:21:00.286984+0200	Runner	[IMPORTANT:flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm(852)] self.viewController is nil: true)
error	09:21:00.287022+0200	Runner	[IMPORTANT:flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm(854)] is_background = false
error	09:21:00.287046+0200	Runner	[IMPORTANT:flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm(856)] self.isGpuDisabled = false
error	09:21:00.287067+0200	Runner	[IMPORTANT:flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm(857)] _isGpuDisabled = false
error	09:21:00.290009+0200	Runner	[IMPORTANT:flutter/shell/common/shell.cc(484)] Shell(0x10253de00) is created: is_gpu_disabled=false
error	09:21:00.308737+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(104)] ImageDecoderImpeller
error	09:21:00.310656+0200	Runner	[IMPORTANT:flutter/shell/common/shell.cc(2277)] Shell::SetGpuAvailability(kAvailable)
default	09:21:00.321254+0200	Runner	didFinishLaunchingWithOptions
default	09:21:00.329514+0200	Runner	Notification permissions granted.
error	09:21:00.347043+0200	Runner	application.applicationState: BACKGROUND
error	09:21:00.352838+0200	Runner	application.applicationState: BACKGROUND
default	09:21:14.537918+0200	Runner	From Flutter: main start
default	09:21:14.540038+0200	Runner	From Flutter: after sleep
default	09:21:14.540108+0200	Runner	From Flutter: main
error	09:21:14.584093+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(450)] GPU IS ENABLED: uploading
error	09:21:14.584254+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(450)] GPU IS ENABLED: uploading
error	09:21:14.584322+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(314)] UnsafeUploadTextureToPrivate
error	09:21:14.584374+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(314)] UnsafeUploadTextureToPrivate
error	09:21:14.586091+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(450)] GPU IS ENABLED: uploading
error	09:21:14.586180+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(314)] UnsafeUploadTextureToPrivate
error	09:21:14.589119+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(450)] GPU IS ENABLED: uploading
error	09:21:14.589180+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(314)] UnsafeUploadTextureToPrivate
error	09:21:14.590120+0200	Runner	[ERROR:flutter/impeller/renderer/backend/metal/command_buffer_mtl.mm(113)] Impeller validation: >>>>>>>
Impeller command buffer could not be committed!
Insufficient Permission (to submit GPU work from background) (00000006:kIOGPUCommandBufferCallbackErrorBackgroundExecutionNotPermitted)
Domain: MTLCommandBufferErrorDomain Code: not permitted
<<<<<<<
error	09:21:14.590229+0200	Runner	[ERROR:flutter/lib/ui/painting/image_decoder_impeller.cc(403)] GPU Error submitting image decoding command buffer.
error	09:21:14.590557+0200	Runner	[ERROR:flutter/impeller/renderer/backend/metal/command_buffer_mtl.mm(113)] Impeller validation: >>>>>>>
Impeller command buffer could not be committed!
Insufficient Permission (to submit GPU work from background) (00000006:kIOGPUCommandBufferCallbackErrorBackgroundExecutionNotPermitted)
Domain: MTLCommandBufferErrorDomain Code: not permitted
<<<<<<<
error	09:21:14.590682+0200	Runner	[ERROR:flutter/lib/ui/painting/image_decoder_impeller.cc(403)] GPU Error submitting image decoding command buffer.
error	09:21:14.590842+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(450)] GPU IS ENABLED: uploading
error	09:21:14.590897+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(314)] UnsafeUploadTextureToPrivate
error	09:21:14.591265+0200	Runner	[ERROR:flutter/impeller/renderer/backend/metal/command_buffer_mtl.mm(113)] Impeller validation: >>>>>>>
Impeller command buffer could not be committed!
Insufficient Permission (to submit GPU work from background) (00000006:kIOGPUCommandBufferCallbackErrorBackgroundExecutionNotPermitted)
Domain: MTLCommandBufferErrorDomain Code: not permitted
<<<<<<<
error	09:21:14.591329+0200	Runner	[ERROR:flutter/lib/ui/painting/image_decoder_impeller.cc(403)] GPU Error submitting image decoding command buffer.
error	09:21:14.591761+0200	Runner	[ERROR:flutter/impeller/renderer/backend/metal/command_buffer_mtl.mm(113)] Impeller validation: >>>>>>>
Impeller command buffer could not be committed!
Insufficient Permission (to submit GPU work from background) (00000006:kIOGPUCommandBufferCallbackErrorBackgroundExecutionNotPermitted)
Domain: MTLCommandBufferErrorDomain Code: not permitted
<<<<<<<
error	09:21:14.591819+0200	Runner	[ERROR:flutter/lib/ui/painting/image_decoder_impeller.cc(403)] GPU Error submitting image decoding command buffer.
error	09:21:14.592096+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(450)] GPU IS ENABLED: uploading
error	09:21:14.592189+0200	Runner	[IMPORTANT:flutter/lib/ui/painting/image_decoder_impeller.cc(314)] UnsafeUploadTextureToPrivate
error	09:21:14.592294+0200	Runner	[ERROR:flutter/impeller/renderer/backend/metal/command_buffer_mtl.mm(113)] Impeller validation: >>>>>>>
Impeller command buffer could not be committed!
Insufficient Permission (to submit GPU work from background) (00000006:kIOGPUCommandBufferCallbackErrorBackgroundExecutionNotPermitted)
Domain: MTLCommandBufferErrorDomain Code: not permitted
<<<<<<<
error	09:21:14.592354+0200	Runner	[ERROR:flutter/lib/ui/painting/image_decoder_impeller.cc(403)] GPU Error submitting image decoding command buffer.

Here is the setup that eventually allowed me to reproduce it:

  • Make an iOS app which can receive background notifications. In Signing & Capabilities give the app Background fetch, Background processing and Remote notifications in Background Modes as well as Push notifications. Follow official Apple guidelines:
  • Add a bunch of logging using os_log, so that it is easy to see in the Console in real time when things go south.
  • Make a simple app which just shows 11 simple PNG images in a column
  • IMPORTANT: put a 1 second delay in main using dart:io sleep
void main() {
  sleep(const Duration(seconds: 1));
  runApp(
    Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          for (var i = 0; i <= 10; i++)
            Image(image: AssetImage('assets/icon$i.png')),
        ],
      ),
    ),
  );
}

Once you have the app, you do the following:

  • Run Console on the side and start streaming device logs.
  • Build and run the app on real device in release mode. Remember device token (which you get in application(_:didRegisterForRemoteNotificationsWithDeviceToken:) after you call registerForRemoteNotifications). You will need this token to send notifications to the app using Push Notification Console.
  • Move away from the app and kill it using App Switcher. If you are building custom engine you can add os_log to Shell::~Shell and make sure that the app is dead (you will see log in Console).
  • Send notification to the app. Important: it must be background notification (i.e. {"aps":{"content-available": 1}, ...}). If it not a background notification (e.g. the one that presents a badge) the app is not woken up by the OS until you click on the notification banner itself (at least that what I see in the logs).

That's it: if you have enough logging you will see in Console that the app starts, initializes Flutter engine with incorrect value for is_gpu_disabled, runs Dart main and starts submitting GPU work. If you don't have sleep in main it will actually succeed to submit all the work and all will be great. But with sleep some of those tasks will actually fail and reproduce our elusive bug.

I have tested this code and it seems to do the trick. Now we correctly detect that we are running in background.

Copy link
Contributor

@vashworth vashworth left a comment

Choose a reason for hiding this comment

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

LGTM

@gaaclarke gaaclarke added this pull request to the merge queue Jul 11, 2025
Merged via the queue into flutter:master with commit 3e9ab91 Jul 11, 2025
173 of 174 checks passed
@gaaclarke gaaclarke deleted the gpu-disabled-start-state branch July 11, 2025 16:38
@jtmcdole
Copy link
Member

Is there a way to generate a notification for iOS through tooling and if so, should we add a test to the device lab to make sure we don't regress?

@gaaclarke
Copy link
Member Author

Is there a way to generate a notification for iOS through tooling and if so, should we add a test to the device lab to make sure we don't regress?

I don't think we have a mechanism that can kill processes. In our reproduction we are using the app switcher to kill the process.

engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Jul 11, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Jul 11, 2025
justinmc pushed a commit to justinmc/flutter that referenced this pull request Jul 11, 2025
…ter#171785)

Started querying the app state for the gpu disabled sync switch when
starting an engine without a view controller

fixes flutter#166668

Testing: Integration test is not possible since it would require
manipulation of the operating system and killing / restoring the app.
Unit tests would require executing in the background or mocking out
background detection which is pretty contrived and will complicate
engine initialization. The simple cases will be covered with integration
tests like the wide gamut devicelab tests which loads an image at
startup and grabs a screenshot of it.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [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 documentation (doc comments with `///`).
- [ ] 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.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[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
[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
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Jul 12, 2025
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Jul 12, 2025
Roll Flutter from 43657f3baa17 to 35f197f1e5f5 (39 revisions)

flutter/flutter@43657f3...35f197f

2025-07-12 [email protected] Roll Fuchsia Linux SDK from 8aoEy1hp2a9HI1pt-... to xQlbHCUI33kDvkew8... (flutter/flutter#172060)
2025-07-12 [email protected] Add RSuperellipse support to Web (global cache) (flutter/flutter#171489)
2025-07-12 [email protected] Fix grammar: Change 'A' to 'An' before IOSSystemContextMenuItemData (flutter/flutter#172019)
2025-07-11 [email protected] Manual roll Dart to b21dca1b89ff (flutter/flutter#172038)
2025-07-11 [email protected] Roll Skia from 2ea2ba09ef85 to 92354f64e37f (1 revision) (flutter/flutter#172039)
2025-07-11 [email protected] Fix CheckedPopupMenuItem semantics to use menuItemCheckbox role with checked state (flutter/flutter#171749)
2025-07-11 [email protected] adds gemini.md to `engine` and `licenses_cpp` (flutter/flutter#172022)
2025-07-11 [email protected] [Web] Implement disabling interactive selection (flutter/flutter#171935)
2025-07-11 [email protected] [tool] Make google3 have to override feature flags (flutter/flutter#171933)
2025-07-11 [email protected] License cpp 710 (flutter/flutter#171989)
2025-07-11 [email protected] add content description to tooltip-only nodes for android (flutter/flutter#171541)
2025-07-11 [email protected] [Web a11y]Update table cell to use LabelRepresentation.sizedSpan  (flutter/flutter#172013)
2025-07-11 [email protected] [ Tool ] Enable `omit_obvious_*_types` and `specify_nonobvious_*_types` lints (flutter/flutter#172018)
2025-07-11 [email protected] Add SemanticsLabelBuilder for Accessible Label Concatenation (flutter/flutter#171683)
2025-07-11 [email protected] Run tests on either macOS 14 or 15 (flutter/flutter#171076)
2025-07-11 [email protected] Roll Skia from db1a5550c848 to 2ea2ba09ef85 (1 revision) (flutter/flutter#172017)
2025-07-11 [email protected] [Cupertino] Make some widgets no longer use RSuperellipse (flutter/flutter#171830)
2025-07-11 [email protected] Detach the resource context from the IO thread only if the shell's IO manager is no longer being used by any other spawned shells (flutter/flutter#171554)
2025-07-11 [email protected] Started querying the app state for the gpu disabled sync switch (flutter/flutter#171785)
2025-07-11 [email protected] License_cpp 7/02 (flutter/flutter#171558)
2025-07-11 [email protected] [web] Refactor clipboard. (flutter/flutter#171427)
2025-07-11 [email protected] Require 64-bit Windows (flutter/flutter#171925)
2025-07-11 [email protected] Run hot_reload_with_asset_web_test.dart on Mac/Windows (flutter/flutter#171280)
2025-07-11 [email protected] Roll Skia from da7e3eae7c2b to db1a5550c848 (2 revisions) (flutter/flutter#171999)
2025-07-11 [email protected] Roll Skia from 26571c3b1771 to da7e3eae7c2b (2 revisions) (flutter/flutter#171997)
2025-07-11 [email protected] Roll Skia from 34a40032ff0a to 26571c3b1771 (1 revision) (flutter/flutter#171995)
2025-07-11 [email protected] Roll Fuchsia Linux SDK from lO64ePNEGrGzs-MFC... to 8aoEy1hp2a9HI1pt-... (flutter/flutter#171993)
2025-07-10 [email protected] Remove redundant ThemeData(useMaterial3: true) from tests (flutter/flutter#171569)
2025-07-10 [email protected] [Android 16] Updated linux_android_emu to a 36 AVD in framework CI (flutter/flutter#169121)
2025-07-10 [email protected] [iOS] Add Live Text option to system context menu (flutter/flutter#170969)
2025-07-10 [email protected] Roll Skia from dc3da09ca905 to 34a40032ff0a (1 revision) (flutter/flutter#171982)
2025-07-10 [email protected] feat: Expose FocusNode of FocusTraversalGroup (flutter/flutter#171979)
2025-07-10 [email protected] `CupertinoDatePicker` and `CupertinoTimerPicker` new onChanged behavior (flutter/flutter#170793)
2025-07-10 [email protected] Manual roll Dart SDK from 8d69b07b9d9d to 07ea3aaaadf0 (32 revisions) (flutter/flutter#171969)
2025-07-10 [email protected] Style: Rename pageBuilder with builder in showCupertinoSheet (flutter/flutter#170625)
2025-07-10 [email protected] Roll Skia from bdb8bfcde7f3 to dc3da09ca905 (3 revisions) (flutter/flutter#171971)
2025-07-10 [email protected] Feat: Add foreground color for cupertino button (flutter/flutter#170898)
2025-07-10 [email protected] Roll Skia from 0fef076beec3 to bdb8bfcde7f3 (34 revisions) (flutter/flutter#171964)
2025-07-10 [email protected] Run stateless_stateful_hot_reload_web_test.dart on Mac/Windows (flutter/flutter#171283)

If this roll has caused a breakage, revert this CL and stop the roller
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.

...
@mraleph
Copy link
Member

mraleph commented Jul 14, 2025

Regarding automatically testing this... We should be able to terminate the app via the debugger connection or via test automation e.g. XCUIApplication.terminate() - I don't think that's the hardest part.

I think setting up notifications is probably more challenging infrastructurally (because it requires APN authentication, these secrets need to be stored somewhere). Maybe setting up using background tasks is more viable.

gaaclarke added a commit to gaaclarke/flutter that referenced this pull request Jul 14, 2025
…ter#171785)

Started querying the app state for the gpu disabled sync switch when
starting an engine without a view controller

fixes flutter#166668

Testing: Integration test is not possible since it would require
manipulation of the operating system and killing / restoring the app.
Unit tests would require executing in the background or mocking out
background detection which is pretty contrived and will complicate
engine initialization. The simple cases will be covered with integration
tests like the wide gamut devicelab tests which loads an image at
startup and grabs a screenshot of it.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [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 documentation (doc comments with `///`).
- [ ] 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.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[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
[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
@gaaclarke gaaclarke added the cp: stable cherry pick this pull request to stable release candidate branch label Jul 14, 2025
flutteractionsbot pushed a commit to flutteractionsbot/flutter that referenced this pull request Jul 14, 2025
…ter#171785)

Started querying the app state for the gpu disabled sync switch when
starting an engine without a view controller

fixes flutter#166668

Testing: Integration test is not possible since it would require
manipulation of the operating system and killing / restoring the app.
Unit tests would require executing in the background or mocking out
background detection which is pretty contrived and will complicate
engine initialization. The simple cases will be covered with integration
tests like the wide gamut devicelab tests which loads an image at
startup and grabs a screenshot of it.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [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 documentation (doc comments with `///`).
- [ ] 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.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[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
[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
@gaaclarke
Copy link
Member Author

I think setting up notifications is probably more challenging infrastructurally (because it requires APN authentication, these secrets need to be stored somewhere). Maybe setting up using background tasks is more viable.

My reproduction attempts used local notifications which doesn't require any authentication. Even if you did get them, how would you click on them to relaunch the app though and get a connection to the new process in order to grab the screenshot.

@mraleph
Copy link
Member

mraleph commented Jul 14, 2025

I am not sure local notifications (those you click on) would do that - AFAIK they don't start the app in background, but in foreground. It is prerequisite for the reproduction that the app must be completely dead and it should start from scratch in background.

I also think we can probably avoid screenshotting. Just kick off decoding of images into ui.Image and listen for errors - there should be none.

azatech pushed a commit to azatech/flutter that referenced this pull request Jul 28, 2025
…ter#171785)

Started querying the app state for the gpu disabled sync switch when
starting an engine without a view controller

fixes flutter#166668

Testing: Integration test is not possible since it would require
manipulation of the operating system and killing / restoring the app.
Unit tests would require executing in the background or mocking out
background detection which is pretty contrived and will complicate
engine initialization. The simple cases will be covered with integration
tests like the wide gamut devicelab tests which loads an image at
startup and grabs a screenshot of it.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [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 documentation (doc comments with `///`).
- [ ] 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.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[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
[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
vashworth pushed a commit to vashworth/packages that referenced this pull request Jul 30, 2025
…r#9602)

Roll Flutter from 43657f3baa17 to 35f197f1e5f5 (39 revisions)

flutter/flutter@43657f3...35f197f

2025-07-12 [email protected] Roll Fuchsia Linux SDK from 8aoEy1hp2a9HI1pt-... to xQlbHCUI33kDvkew8... (flutter/flutter#172060)
2025-07-12 [email protected] Add RSuperellipse support to Web (global cache) (flutter/flutter#171489)
2025-07-12 [email protected] Fix grammar: Change 'A' to 'An' before IOSSystemContextMenuItemData (flutter/flutter#172019)
2025-07-11 [email protected] Manual roll Dart to b21dca1b89ff (flutter/flutter#172038)
2025-07-11 [email protected] Roll Skia from 2ea2ba09ef85 to 92354f64e37f (1 revision) (flutter/flutter#172039)
2025-07-11 [email protected] Fix CheckedPopupMenuItem semantics to use menuItemCheckbox role with checked state (flutter/flutter#171749)
2025-07-11 [email protected] adds gemini.md to `engine` and `licenses_cpp` (flutter/flutter#172022)
2025-07-11 [email protected] [Web] Implement disabling interactive selection (flutter/flutter#171935)
2025-07-11 [email protected] [tool] Make google3 have to override feature flags (flutter/flutter#171933)
2025-07-11 [email protected] License cpp 710 (flutter/flutter#171989)
2025-07-11 [email protected] add content description to tooltip-only nodes for android (flutter/flutter#171541)
2025-07-11 [email protected] [Web a11y]Update table cell to use LabelRepresentation.sizedSpan  (flutter/flutter#172013)
2025-07-11 [email protected] [ Tool ] Enable `omit_obvious_*_types` and `specify_nonobvious_*_types` lints (flutter/flutter#172018)
2025-07-11 [email protected] Add SemanticsLabelBuilder for Accessible Label Concatenation (flutter/flutter#171683)
2025-07-11 [email protected] Run tests on either macOS 14 or 15 (flutter/flutter#171076)
2025-07-11 [email protected] Roll Skia from db1a5550c848 to 2ea2ba09ef85 (1 revision) (flutter/flutter#172017)
2025-07-11 [email protected] [Cupertino] Make some widgets no longer use RSuperellipse (flutter/flutter#171830)
2025-07-11 [email protected] Detach the resource context from the IO thread only if the shell's IO manager is no longer being used by any other spawned shells (flutter/flutter#171554)
2025-07-11 [email protected] Started querying the app state for the gpu disabled sync switch (flutter/flutter#171785)
2025-07-11 [email protected] License_cpp 7/02 (flutter/flutter#171558)
2025-07-11 [email protected] [web] Refactor clipboard. (flutter/flutter#171427)
2025-07-11 [email protected] Require 64-bit Windows (flutter/flutter#171925)
2025-07-11 [email protected] Run hot_reload_with_asset_web_test.dart on Mac/Windows (flutter/flutter#171280)
2025-07-11 [email protected] Roll Skia from da7e3eae7c2b to db1a5550c848 (2 revisions) (flutter/flutter#171999)
2025-07-11 [email protected] Roll Skia from 26571c3b1771 to da7e3eae7c2b (2 revisions) (flutter/flutter#171997)
2025-07-11 [email protected] Roll Skia from 34a40032ff0a to 26571c3b1771 (1 revision) (flutter/flutter#171995)
2025-07-11 [email protected] Roll Fuchsia Linux SDK from lO64ePNEGrGzs-MFC... to 8aoEy1hp2a9HI1pt-... (flutter/flutter#171993)
2025-07-10 [email protected] Remove redundant ThemeData(useMaterial3: true) from tests (flutter/flutter#171569)
2025-07-10 [email protected] [Android 16] Updated linux_android_emu to a 36 AVD in framework CI (flutter/flutter#169121)
2025-07-10 [email protected] [iOS] Add Live Text option to system context menu (flutter/flutter#170969)
2025-07-10 [email protected] Roll Skia from dc3da09ca905 to 34a40032ff0a (1 revision) (flutter/flutter#171982)
2025-07-10 [email protected] feat: Expose FocusNode of FocusTraversalGroup (flutter/flutter#171979)
2025-07-10 [email protected] `CupertinoDatePicker` and `CupertinoTimerPicker` new onChanged behavior (flutter/flutter#170793)
2025-07-10 [email protected] Manual roll Dart SDK from 8d69b07b9d9d to 07ea3aaaadf0 (32 revisions) (flutter/flutter#171969)
2025-07-10 [email protected] Style: Rename pageBuilder with builder in showCupertinoSheet (flutter/flutter#170625)
2025-07-10 [email protected] Roll Skia from bdb8bfcde7f3 to dc3da09ca905 (3 revisions) (flutter/flutter#171971)
2025-07-10 [email protected] Feat: Add foreground color for cupertino button (flutter/flutter#170898)
2025-07-10 [email protected] Roll Skia from 0fef076beec3 to bdb8bfcde7f3 (34 revisions) (flutter/flutter#171964)
2025-07-10 [email protected] Run stateless_stateful_hot_reload_web_test.dart on Mac/Windows (flutter/flutter#171283)

If this roll has caused a breakage, revert this CL and stop the roller
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.

...
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 14, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 14, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 15, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 15, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 16, 2025
ksokolovskyi pushed a commit to ksokolovskyi/flutter that referenced this pull request Aug 19, 2025
…ter#171785)

Started querying the app state for the gpu disabled sync switch when
starting an engine without a view controller

fixes flutter#166668

Testing: Integration test is not possible since it would require
manipulation of the operating system and killing / restoring the app.
Unit tests would require executing in the background or mocking out
background detection which is pretty contrived and will complicate
engine initialization. The simple cases will be covered with integration
tests like the wide gamut devicelab tests which loads an image at
startup and grabs a screenshot of it.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [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 documentation (doc comments with `///`).
- [ ] 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.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[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
[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
mboetger pushed a commit to mboetger/flutter that referenced this pull request Sep 18, 2025
…ter#171785)

Started querying the app state for the gpu disabled sync switch when
starting an engine without a view controller

fixes flutter#166668

Testing: Integration test is not possible since it would require
manipulation of the operating system and killing / restoring the app.
Unit tests would require executing in the background or mocking out
background detection which is pretty contrived and will complicate
engine initialization. The simple cases will be covered with integration
tests like the wide gamut devicelab tests which loads an image at
startup and grabs a screenshot of it.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [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 documentation (doc comments with `///`).
- [ ] 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.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[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
[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
lucaantonelli pushed a commit to lucaantonelli/flutter that referenced this pull request Nov 21, 2025
…ter#171785)

Started querying the app state for the gpu disabled sync switch when
starting an engine without a view controller

fixes flutter#166668

Testing: Integration test is not possible since it would require
manipulation of the operating system and killing / restoring the app.
Unit tests would require executing in the background or mocking out
background detection which is pretty contrived and will complicate
engine initialization. The simple cases will be covered with integration
tests like the wide gamut devicelab tests which loads an image at
startup and grabs a screenshot of it.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [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 documentation (doc comments with `///`).
- [ ] 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.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[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
[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

cp: stable cherry pick this pull request to stable release candidate branch engine flutter/engine related. See also e: labels. platform-ios iOS applications specifically team-ios Owned by iOS platform team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Google3 Bug]: iOS, Images replaced with pink fill when coming out of background

4 participants