fix(messaging, android): stop doing disk I/O on the main thread in the message broadcast receiver#18359
Conversation
…ving multiple notifications at the same time
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. |
Description
FlutterFirebaseMessagingReceiver.onReceive()runs on the main thread and wrote every notification message toSharedPreferences; when a broadcast receiver finishes, Android blocks the main thread until pendingSharedPreferenceswrites are flushed to disk (QueuedWork.waitToFinish), causing ANRs under I/O pressure. The receiver now hands the store write and message dispatch to a background executor viagoAsync(), so no disk I/O or binder calls happen on the main thread; the in-memory notification map update stays on the main thread, where it is read.Verified on an Android emulator with synthetic FCM broadcasts (
adb root+am broadcastto the receiver): foreground delivery toonMessage, background delivery viaFlutterFirebaseMessagingBackgroundService, and message persistence to the store all behave identically before and after the change, and thefirebase_messaginge2e suite passes. The ANR itself is a timing condition that cannot be asserted by the existing test infrastructure (no native Android unit tests in the repo, and an FCM push cannot be triggered from the Dart integration tests).Related Issues
Checklist
///).melos run analyze) does not report any problems on my PR.Breaking Change