Repository navigation
[flutter_tools] Fix Use dependency graph to determine plugin initialization order - #191591
Merged
Merged
Conversation
…on order (#99153) ## Description Sorts plugins in dependency order using a topological sort (Kahn's algorithm) so that dependent plugins are registered after their dependencies during plugin registrant generation and `.flutter-plugins-dependencies` creation. Previously, `findPlugins`, `refreshPluginsList`, `build_swift_package`, and `_resolvePluginImplementationsByPlatform` sorted plugins alphabetically by name, ignoring inter-plugin dependencies and causing dependent plugins to potentially initialize before their dependencies. ## Related Issues Fixes #99153 ## Tests - Added `Refreshing the plugin list sorts plugins by dependency order` in `packages/flutter_tools/test/general.shard/plugins_test.dart`. - Added `group('sortByDependencies')` unit tests for topological sorting invariants and cycle handling. - Added registrant injection dependency ordering tests for Linux and Windows in `plugins_test.dart`.
Contributor
There was a problem hiding this comment.
Code Review
This pull request replaces alphabetical plugin sorting with a dependency-based sorting mechanism (sortByDependencies) to ensure dependencies are initialized before dependent plugins. Comprehensive tests have been added to verify this behavior. Feedback suggests optimizing the topological sorting loop in sortByDependencies to prevent redundant additions during dependency cycles and to reduce sorting overhead.
Avoid redundant additions in dependency cycles and batch sort newly available dependents.
…al plugin ordering Reflects that dependency plugins (plugin_b, plugin_c, plugin_d) are sorted before dependent plugin_a.
…ency_management_test
Member
|
Reason for revert: broke |
Contributor
|
Successfully created revert PR: #193686 |
This was referenced Oct 2, 2026
auto-submit Bot
pushed a commit
to flutter/packages
that referenced
this pull request
Oct 2, 2026
flutter/flutter@e89fd0a...d03768e 2026-10-02 [email protected] Roll Skia from 7b7326917e77 to 9e88bf828078 (8 revisions) (flutter/flutter#193694) 2026-10-02 [email protected] [Widget Preview] Provide descriptive error when widget preview is unconstrained (flutter/flutter#193005) 2026-10-02 [email protected] Roll Dart SDK from 0e7642b85457 to ac1a97aae47d (26 revisions) (flutter/flutter#193692) 2026-10-02 [email protected] Remove unused Fuchsia sysmem header files (flutter/flutter#193244) 2026-10-02 [email protected] [Windows] Preserve composing extent in setEditingState (flutter/flutter#189968) 2026-10-02 [email protected] [docs] Make Border.symmetric docs more explicit about their arguments (flutter/flutter#193222) 2026-10-02 [email protected] [Embedder] Support render texture for vulkan (flutter/flutter#188855) 2026-10-02 [email protected] Updated Remaining Engine Defaults to SDK 37 (flutter/flutter#190429) 2026-10-02 [email protected] Document that enableSuggestions: false can disable keyboard languages on Android (flutter/flutter#192714) 2026-10-02 [email protected] [flutter_tools] Explicitly track host CPU architecture in command result analytics (flutter/flutter#191836) 2026-10-02 [email protected] [web] Preserve DOM focus on role update and honor isAccessibilityFocusBlocked (flutter/flutter#192963) 2026-10-02 [email protected] [flutter_tools] Include base href in web hot reload script paths (flutter/flutter#193678) 2026-10-02 [email protected] [Impeller] Deduplicate GLES render pass state (flutter/flutter#193427) 2026-10-02 [email protected] Roll Skia from f2d68e0b8863 to 7b7326917e77 (16 revisions) (flutter/flutter#193676) 2026-10-01 [email protected] Fix analysis failures due to missing `const` (flutter/flutter#193685) 2026-10-01 [email protected] Removes a11y_assessment app (flutter/flutter#193671) 2026-10-01 [email protected] test: configure Xvfb and openbox for windowing_test (flutter/flutter#193529) 2026-10-01 [email protected] Sync CHANGELOG.md from stable (flutter/flutter#193666) 2026-10-01 [email protected] Avoid using relative path in Process.start (flutter/flutter#193664) 2026-10-01 [email protected] [AGP 9.1.0 Migration #6] Deliver Flutter assets as a generated assets source directory on the app path (flutter/flutter#192488) 2026-10-01 [email protected] ci(bringup): android_java17_build_android_host_app_with_module_aar is green (flutter/flutter#193580) 2026-10-01 [email protected] [flutter_tools] Fix Use dependency graph to determine plugin initialization order (flutter/flutter#191591) 2026-10-01 [email protected] [flutter_tools] Migrate DaemonCommand and Daemon domains to constructor DI (flutter/flutter#193542) 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 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #99153
Summary
Flutter Issue Investigation: #99153
Issue: #99153 - Use dependency graph to determine plugin initialization order
Status: Resolved
Scope:
packages/flutter_tools1. Overview and Problem Statement
When Flutter generates native plugin registrants (such as
GeneratedPluginRegistrant.java,GeneratedPluginRegistrant.m,generated_plugin_registrant.cc,web_plugin_registrant.dart) and plugin dependency files (.flutter-plugins-dependencies), plugins were previously sorted purely alphabetically by plugin name (left.name.compareTo(right.name)).While alphabetical sorting ensured deterministic registrant generation, it did not take into account dependencies between plugins. If
plugin_adepended onplugin_z,plugin_awould be registered and initialized beforeplugin_z, leading to potential initialization order bugs when a plugin depends on services or state initialized by another plugin.2. Root Cause Analysis
findPlugins&refreshPluginsList:findPluginscollected plugins in arbitrary traversal order fromcomputeTransitiveDependencies.refreshPluginsListsortedpluginsalphabetically (plugins.sort((Plugin left, Plugin right) => left.name.compareTo(right.name));)._resolvePluginImplementationsByPlatform:pluginImplementations.sort((Plugin left, Plugin right) => left.name.compareTo(right.name));), overriding any topological order._writeFlutterPluginsListand Registrant Generators:3. Solution & Architecture
Topological Sort (
sortByDependencies)Implemented
sortByDependencies(Iterable<Plugin> plugins)inpackages/flutter_tools/lib/src/flutter_plugins.dart:plugin.dependencies. Non-plugin dependencies (e.g.,flutter,meta, external packages) are filtered out.Call Site Updates
findPluginsto returnsortByDependencies(plugins)._resolvePluginImplementationsByPlatformto sort platform implementations usingsortByDependencies(pluginResolution.values).plugins.sortinrefreshPluginsListandpackages/flutter_tools/lib/src/commands/build_swift_package.dart.4. Automated Testing and Verification
Regression & Unit Tests Added
Refreshing the plugin list sorts plugins by dependency orderinpackages/flutter_tools/test/general.shard/plugins_test.dart.group('sortByDependencies')inplugins_test.dart:returns empty list when input is emptyreturns single element list as-issorts independent plugins alphabeticallysorts direct dependency before dependent pluginsorts multi-level linear dependency chainsorts diamond dependency graphignores non-plugin dependencieshandles dependency cycle deterministically without throwing or hangingGenerated Linux plugin files sorts by dependency orderGenerated Windows plugin files sorts by dependency orderVerification Results
dart formatcleanly applied across all modified files.dart analyze --fatal-infos packages/flutter_tools: Passed with 0 errors, 0 warnings, 0 infos.dart test packages/flutter_tools/test/general.shard/plugins_test.dart: All 97 tests passing.Verification