-
Notifications
You must be signed in to change notification settings - Fork 29.7k
Make iOS Flutter framework extension-safe #165346
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Make iOS Flutter framework extension-safe #165346
Conversation
jmagman
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mostly minor nits except for the comment about keeping the old artifact for a release cycle, even if it's identical to Flutter.framework.
| 'artifacts/engine/ios-profile/extension_safe/Flutter.xcframework/ios-arm64/Flutter.framework/Flutter', | ||
| 'artifacts/engine/ios-profile/extension_safe/Flutter.xcframework/ios-arm64_x86_64-simulator/Flutter.framework/Flutter', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sooo nice we can make this change atomically with the engine now.
| "sdk_version": "16c5032a" | ||
| } | ||
| } | ||
| }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if we should keep building these artifacts for a release (even though it doesn't really work) in case someone is using it, and then put the deprecation in the tech blog with instructions for migrating? I bet people have prototypes that "work" locally and I don't want them to be mysteriously busted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm fine either way as I expect this is a relatively quick and painless fix for users, but agreed, it seems like a good idea to give people a release worth of heads-up in the release notes.
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterSharedApplication.h
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterSharedApplication.h
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterSharedApplication.h
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterSharedApplication.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterSharedApplication.mm
Outdated
Show resolved
Hide resolved
| FML_DCHECK(self.screen); | ||
|
|
||
| // Wide Gamut is not supported for iOS Extensions due to memory limitations | ||
| // (see https://github.com/flutter/flutter/issues/165086). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch figuring out that would help with memory.
cbracken
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is exciting! Overall looks good!
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngineTest.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngineTest.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterEngineTest.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm
Outdated
Show resolved
Hide resolved
engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterSharedApplicationTest.mm
Outdated
Show resolved
Hide resolved
cbracken
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| [UIApplication sharedApplication].statusBarHidden = hidden; | ||
| #else | ||
| FML_LOG(WARNING) << "Application based status bar styling is not available in app extension."; | ||
| #endif |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So nice to not have preprocessor conditionals in the code anymore!
Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions) Manual roll requested by [email protected] flutter/flutter@1d954f4...05b5e79 2025-03-29 [email protected] Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202) 2025-03-29 [email protected] Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189) 2025-03-29 [email protected] Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185) 2025-03-29 [email protected] [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120) 2025-03-29 [email protected] Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181) 2025-03-29 [email protected] move around shaders in vertices uber 1/2 (flutter/flutter#166180) 2025-03-29 [email protected] [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998) 2025-03-28 [email protected] Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744) 2025-03-28 [email protected] Started clamping scaled antialias lines size (flutter/flutter#166149) 2025-03-28 [email protected] Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162) 2025-03-28 [email protected] Remove bringup flag for customer tests (flutter/flutter#166161) 2025-03-28 [email protected] Add the ios-reviewers review team (flutter/flutter#166034) 2025-03-28 [email protected] [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035) 2025-03-28 [email protected] [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924) 2025-03-28 [email protected] Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681) 2025-03-28 [email protected] [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520) 2025-03-28 [email protected] [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324) 2025-03-28 [email protected] [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091) 2025-03-28 [email protected] Mark Linux coverage as bringup (flutter/flutter#166144) 2025-03-28 [email protected] Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136) 2025-03-28 [email protected] [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938) 2025-03-28 [email protected] [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409) 2025-03-28 [email protected] Delete some verbose vm service logging (flutter/flutter#162709) 2025-03-28 [email protected] Get analytics welcome message under test (flutter/flutter#162627) 2025-03-28 [email protected] [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080) 2025-03-28 [email protected] Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111) 2025-03-28 [email protected] [CI] remove check for exact golden files. (flutter/flutter#166031) 2025-03-28 [email protected] Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025) 2025-03-27 [email protected] [android] only release background image readers on Android 14. (flutter/flutter#165942) 2025-03-27 [email protected] Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972) 2025-03-27 [email protected] Mark Linux customer tests as flaky (flutter/flutter#166103) 2025-03-27 [email protected] Move app link settings task configuration to kotlin (flutter/flutter#165819) 2025-03-27 [email protected] Make iOS Flutter framework extension-safe (flutter/flutter#165346) 2025-03-27 [email protected] [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005) 2025-03-27 [email protected] Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395) 2025-03-27 [email protected] add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096) 2025-03-27 [email protected] Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077) 2025-03-27 [email protected] Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060) 2025-03-27 [email protected] [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940) 2025-03-27 [email protected] Scale aa lines (flutter/flutter#165917) 2025-03-27 [email protected] Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059) 2025-03-27 [email protected] Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055) 2025-03-27 [email protected] Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046) 2025-03-27 [email protected] [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299) ...
… (#8960) Manual roll Flutter from 1d954f4e96bd to 05b5e7910544 (225 revisions) Manual roll requested by [email protected] flutter/flutter@1d954f4...05b5e79 2025-03-29 [email protected] Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202) 2025-03-29 [email protected] Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189) 2025-03-29 [email protected] Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185) 2025-03-29 [email protected] [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120) 2025-03-29 [email protected] Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181) 2025-03-29 [email protected] move around shaders in vertices uber 1/2 (flutter/flutter#166180) 2025-03-29 [email protected] [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998) 2025-03-28 [email protected] Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744) 2025-03-28 [email protected] Started clamping scaled antialias lines size (flutter/flutter#166149) 2025-03-28 [email protected] Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162) 2025-03-28 [email protected] Remove bringup flag for customer tests (flutter/flutter#166161) 2025-03-28 [email protected] Add the ios-reviewers review team (flutter/flutter#166034) 2025-03-28 [email protected] [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035) 2025-03-28 [email protected] [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924) 2025-03-28 [email protected] Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681) 2025-03-28 [email protected] [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520) 2025-03-28 [email protected] [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324) 2025-03-28 [email protected] [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091) 2025-03-28 [email protected] Mark Linux coverage as bringup (flutter/flutter#166144) 2025-03-28 [email protected] Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136) 2025-03-28 [email protected] [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938) 2025-03-28 [email protected] [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409) 2025-03-28 [email protected] Delete some verbose vm service logging (flutter/flutter#162709) 2025-03-28 [email protected] Get analytics welcome message under test (flutter/flutter#162627) 2025-03-28 [email protected] [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080) 2025-03-28 [email protected] Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111) 2025-03-28 [email protected] [CI] remove check for exact golden files. (flutter/flutter#166031) 2025-03-28 [email protected] Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025) 2025-03-27 [email protected] [android] only release background image readers on Android 14. (flutter/flutter#165942) 2025-03-27 [email protected] Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972) 2025-03-27 [email protected] Mark Linux customer tests as flaky (flutter/flutter#166103) 2025-03-27 [email protected] Move app link settings task configuration to kotlin (flutter/flutter#165819) 2025-03-27 [email protected] Make iOS Flutter framework extension-safe (flutter/flutter#165346) 2025-03-27 [email protected] [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005) 2025-03-27 [email protected] Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395) 2025-03-27 [email protected] add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096) 2025-03-27 [email protected] Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077) 2025-03-27 [email protected] Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060) 2025-03-27 [email protected] [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940) 2025-03-27 [email protected] Scale aa lines (flutter/flutter#165917) 2025-03-27 [email protected] Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059) 2025-03-27 [email protected] Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055) 2025-03-27 [email protected] Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046) 2025-03-27 [email protected] [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299) ...
…8960) Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions) Manual roll requested by [email protected] flutter/flutter@1d954f4...05b5e79 2025-03-29 [email protected] Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202) 2025-03-29 [email protected] Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189) 2025-03-29 [email protected] Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185) 2025-03-29 [email protected] [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120) 2025-03-29 [email protected] Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181) 2025-03-29 [email protected] move around shaders in vertices uber 1/2 (flutter/flutter#166180) 2025-03-29 [email protected] [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998) 2025-03-28 [email protected] Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744) 2025-03-28 [email protected] Started clamping scaled antialias lines size (flutter/flutter#166149) 2025-03-28 [email protected] Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162) 2025-03-28 [email protected] Remove bringup flag for customer tests (flutter/flutter#166161) 2025-03-28 [email protected] Add the ios-reviewers review team (flutter/flutter#166034) 2025-03-28 [email protected] [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035) 2025-03-28 [email protected] [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924) 2025-03-28 [email protected] Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681) 2025-03-28 [email protected] [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520) 2025-03-28 [email protected] [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324) 2025-03-28 [email protected] [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091) 2025-03-28 [email protected] Mark Linux coverage as bringup (flutter/flutter#166144) 2025-03-28 [email protected] Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136) 2025-03-28 [email protected] [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938) 2025-03-28 [email protected] [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409) 2025-03-28 [email protected] Delete some verbose vm service logging (flutter/flutter#162709) 2025-03-28 [email protected] Get analytics welcome message under test (flutter/flutter#162627) 2025-03-28 [email protected] [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080) 2025-03-28 [email protected] Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111) 2025-03-28 [email protected] [CI] remove check for exact golden files. (flutter/flutter#166031) 2025-03-28 [email protected] Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025) 2025-03-27 [email protected] [android] only release background image readers on Android 14. (flutter/flutter#165942) 2025-03-27 [email protected] Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972) 2025-03-27 [email protected] Mark Linux customer tests as flaky (flutter/flutter#166103) 2025-03-27 [email protected] Move app link settings task configuration to kotlin (flutter/flutter#165819) 2025-03-27 [email protected] Make iOS Flutter framework extension-safe (flutter/flutter#165346) 2025-03-27 [email protected] [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005) 2025-03-27 [email protected] Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395) 2025-03-27 [email protected] add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096) 2025-03-27 [email protected] Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077) 2025-03-27 [email protected] Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060) 2025-03-27 [email protected] [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940) 2025-03-27 [email protected] Scale aa lines (flutter/flutter#165917) 2025-03-27 [email protected] Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059) 2025-03-27 [email protected] Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055) 2025-03-27 [email protected] Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046) 2025-03-27 [email protected] [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299) ...
Our current [adoption/documentation](https://docs.flutter.dev/platform-integration/ios/app-extensions) for iOS Extensions does not currently work because it's disallowed to nest bundles (see flutter#142531). As of [Xcode 13](https://developer.apple.com/documentation/xcode-release-notes/xcode-13-release-notes/#:~:text=Linking%20Swift%20packages%20from%20application%20extension%20targets%20or%20watchOS%20applications%20no%20longer%20emits%20unresolvable%20warnings%20about%20linking%20to%20libraries%20not%20safe%20for%20use%20in%20application%20extensions%2E), linking to frameworks that contain non-extension-safe code no longer gives warnings (or blocks from App Store it seems). Therefore, it has become a runtime issue to ensure non-extension-safe code is not used. Previously, we were building and shipping 2 separate Flutter.xcframeworks. One that was extension-safe and one that was not. This PR removes the "extension_safe" framework and instead makes the entire framework extension-safe by annotating non-extension-safe code with `NS_EXTENSION_UNAVAILABLE_IOS` and ensuring that code is not used at runtime if the bundle is for an app extension. This PR also disables wide gamut for app extensions to decrease the chances of crashes (see flutter#165086). Fixes flutter#142531. --- For reference: App extensions were first evaluated in https://flutter.dev/go/app-extensions. Here is the reasoning why neither method described there is opportune. Option 1 - I did look into splitting the framework into 2 frameworks (one with all extension-safe code and one with the non-extension-safe code). However, the original idea was to use objc Categories/Extensions - this doesn’t quite fit our needs. Categories/Extensions only allow you to add new methods/properties, not override existing ones. We could hypothetically add new methods, but that would require the user to change their code to use the new methods. I also looked into subclasses which does allow overrides, but it would also require the user to change their code to use the new class. We could do method swizzling, but opinion of that on the internet is that it's not very safe. I’m of the opinion that anything that requires the user to change code isn’t super feasible due to plugins. Option 2 - We could still do the 2 frameworks but rename one to `FlutterExtentionSafe`. This works without users needing to change any code (including imports like `@import Flutter` / `#import <Flutter/Flutter.h>`). I believe the reason this works is because at compile time, it finds the `Flutter` framework on the framework search path and it imports in the headers. Then at link time, `FlutterExtentionSafe` is explicitly linked so it uses that framework first when checking for symbols and since it finds all the symbols in `FlutterExtentionSafe`, it doesn’t need/try to auto-link the `Flutter` framework (despite `Flutter` being the framework imported). This seems precarious to me since we’re relying on Xcode to not auto-link the `Flutter` framework. If for some reason `Flutter` framework did get auto-linked (such as the user using a symbol that’s not in the `FlutterExtensionSafe` framework but is in the `Flutter` framework - this is unlikely though), we’d get name collision issues ## 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 `///`). - [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. 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
…8960) Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions) Manual roll requested by [email protected] flutter/flutter@1d954f4...05b5e79 2025-03-29 [email protected] Roll Dart SDK from bcb7649e965a to b9c35e05feb5 (1 revision) (flutter/flutter#166202) 2025-03-29 [email protected] Roll Dart SDK from a7701559f616 to bcb7649e965a (1 revision) (flutter/flutter#166189) 2025-03-29 [email protected] Roll Dart SDK from 30ea8c4e622f to a7701559f616 (1 revision) (flutter/flutter#166185) 2025-03-29 [email protected] [fuchsia][sysmem2] switch to sysmem2 tokens (flutter/flutter#166120) 2025-03-29 [email protected] Roll Dart SDK from 65fe9906a916 to 30ea8c4e622f (2 revisions) (flutter/flutter#166181) 2025-03-29 [email protected] move around shaders in vertices uber 1/2 (flutter/flutter#166180) 2025-03-29 [email protected] [Impeller] optimize drawImageRect with blend and matrix color filter. (flutter/flutter#165998) 2025-03-28 [email protected] Add drawRSuperellipse support to mock_canvas. (flutter/flutter#165744) 2025-03-28 [email protected] Started clamping scaled antialias lines size (flutter/flutter#166149) 2025-03-28 [email protected] Roll Dart SDK from 4494ffead9af to 65fe9906a916 (7 revisions) (flutter/flutter#166162) 2025-03-28 [email protected] Remove bringup flag for customer tests (flutter/flutter#166161) 2025-03-28 [email protected] Add the ios-reviewers review team (flutter/flutter#166034) 2025-03-28 [email protected] [impeller] refactored LineContents to make it more testable, added tests (flutter/flutter#166035) 2025-03-28 [email protected] [Widget Inspector] Jump to source code of implementation widgets from Flutter Inspector (flutter/flutter#165924) 2025-03-28 [email protected] Make sure `LayoutBuilder` rebuild in an inactive route (flutter/flutter#154681) 2025-03-28 [email protected] [Impeller] allow newer powervr gpu to use Vulkan. (flutter/flutter#165520) 2025-03-28 [email protected] [web] Remove package:js in favor of dart:js_interop (flutter/flutter#165324) 2025-03-28 [email protected] [ Widget Previews ] Default to using Flutter Web for the widget preview environment (flutter/flutter#166091) 2025-03-28 [email protected] Mark Linux coverage as bringup (flutter/flutter#166144) 2025-03-28 [email protected] Roll Fuchsia Linux SDK from djUjSTaAtl0ETQSBR... to v7PGvypiiWLO8PbsZ... (flutter/flutter#166136) 2025-03-28 [email protected] [Impeller] split vertices uber into 2 shaders. (flutter/flutter#165938) 2025-03-28 [email protected] [flutter_tools] Fix VS Code package.json path on macOS with case-sensitive file system (flutter/flutter#163409) 2025-03-28 [email protected] Delete some verbose vm service logging (flutter/flutter#162709) 2025-03-28 [email protected] Get analytics welcome message under test (flutter/flutter#162627) 2025-03-28 [email protected] [ios][pv]fully revert the UIScreen.main deprecated API change (flutter/flutter#166080) 2025-03-28 [email protected] Roll Skia from b5b6f29d690f to 10f4cf9a817d (8 revisions) (flutter/flutter#166111) 2025-03-28 [email protected] [CI] remove check for exact golden files. (flutter/flutter#166031) 2025-03-28 [email protected] Move OpenGL context management to FlOpenGLManager (flutter/flutter#166025) 2025-03-27 [email protected] [android] only release background image readers on Android 14. (flutter/flutter#165942) 2025-03-27 [email protected] Refactor: Migrate Date picker from MaterialState and MaterialStateProperty (flutter/flutter#164972) 2025-03-27 [email protected] Mark Linux customer tests as flaky (flutter/flutter#166103) 2025-03-27 [email protected] Move app link settings task configuration to kotlin (flutter/flutter#165819) 2025-03-27 [email protected] Make iOS Flutter framework extension-safe (flutter/flutter#165346) 2025-03-27 [email protected] [ Widget Preview ] Display an error widget when an exception is thrown while defining the widget tree (flutter/flutter#166005) 2025-03-27 [email protected] Removed not working hyperlinks to ScriptCategory values (flutter/flutter#165395) 2025-03-27 [email protected] add PointerDeviceKind to ScaleStartDetails (flutter/flutter#165096) 2025-03-27 [email protected] Fix build_android_host_app_with_module_source device lab tests (flutter/flutter#166077) 2025-03-27 [email protected] Roll Skia from 11375a498f6b to b5b6f29d690f (4 revisions) (flutter/flutter#166060) 2025-03-27 [email protected] [Impeller] Move to the new location before rendering a stroke path contour containing only one point (flutter/flutter#165940) 2025-03-27 [email protected] Scale aa lines (flutter/flutter#165917) 2025-03-27 [email protected] Reapply "[ Device Lab ] Upgrade Device Lab projects to Java 18" (#166016) (flutter/flutter#166059) 2025-03-27 [email protected] Roll Fuchsia Linux SDK from iScQOaYHg2aJcF1LX... to djUjSTaAtl0ETQSBR... (flutter/flutter#166055) 2025-03-27 [email protected] Roll Skia from 67a236832d64 to 11375a498f6b (2 revisions) (flutter/flutter#166046) 2025-03-27 [email protected] [flutter_tool] Handle RPCErrorKind.kConnectionDisposed (flutter/flutter#164299) ...
Our current [adoption/documentation](https://docs.flutter.dev/platform-integration/ios/app-extensions) for iOS Extensions does not currently work because it's disallowed to nest bundles (see flutter#142531). As of [Xcode 13](https://developer.apple.com/documentation/xcode-release-notes/xcode-13-release-notes/#:~:text=Linking%20Swift%20packages%20from%20application%20extension%20targets%20or%20watchOS%20applications%20no%20longer%20emits%20unresolvable%20warnings%20about%20linking%20to%20libraries%20not%20safe%20for%20use%20in%20application%20extensions%2E), linking to frameworks that contain non-extension-safe code no longer gives warnings (or blocks from App Store it seems). Therefore, it has become a runtime issue to ensure non-extension-safe code is not used. Previously, we were building and shipping 2 separate Flutter.xcframeworks. One that was extension-safe and one that was not. This PR removes the "extension_safe" framework and instead makes the entire framework extension-safe by annotating non-extension-safe code with `NS_EXTENSION_UNAVAILABLE_IOS` and ensuring that code is not used at runtime if the bundle is for an app extension. This PR also disables wide gamut for app extensions to decrease the chances of crashes (see flutter#165086). Fixes flutter#142531. --- For reference: App extensions were first evaluated in https://flutter.dev/go/app-extensions. Here is the reasoning why neither method described there is opportune. Option 1 - I did look into splitting the framework into 2 frameworks (one with all extension-safe code and one with the non-extension-safe code). However, the original idea was to use objc Categories/Extensions - this doesn’t quite fit our needs. Categories/Extensions only allow you to add new methods/properties, not override existing ones. We could hypothetically add new methods, but that would require the user to change their code to use the new methods. I also looked into subclasses which does allow overrides, but it would also require the user to change their code to use the new class. We could do method swizzling, but opinion of that on the internet is that it's not very safe. I’m of the opinion that anything that requires the user to change code isn’t super feasible due to plugins. Option 2 - We could still do the 2 frameworks but rename one to `FlutterExtentionSafe`. This works without users needing to change any code (including imports like `@import Flutter` / `#import <Flutter/Flutter.h>`). I believe the reason this works is because at compile time, it finds the `Flutter` framework on the framework search path and it imports in the headers. Then at link time, `FlutterExtentionSafe` is explicitly linked so it uses that framework first when checking for symbols and since it finds all the symbols in `FlutterExtentionSafe`, it doesn’t need/try to auto-link the `Flutter` framework (despite `Flutter` being the framework imported). This seems precarious to me since we’re relying on Xcode to not auto-link the `Flutter` framework. If for some reason `Flutter` framework did get auto-linked (such as the user using a symbol that’s not in the `FlutterExtensionSafe` framework but is in the `Flutter` framework - this is unlikely though), we’d get name collision issues ## 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 `///`). - [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. 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

Our current adoption/documentation for iOS Extensions does not currently work because it's disallowed to nest bundles (see #142531).
As of Xcode 13, linking to frameworks that contain non-extension-safe code no longer gives warnings (or blocks from App Store it seems). Therefore, it has become a runtime issue to ensure non-extension-safe code is not used.
Previously, we were building and shipping 2 separate Flutter.xcframeworks. One that was extension-safe and one that was not.
This PR removes the "extension_safe" framework and instead makes the entire framework extension-safe by annotating non-extension-safe code with
NS_EXTENSION_UNAVAILABLE_IOSand ensuring that code is not used at runtime if the bundle is for an app extension.This PR also disables wide gamut for app extensions to decrease the chances of crashes (see #165086).
Fixes #142531.
For reference:
App extensions were first evaluated in https://flutter.dev/go/app-extensions. Here is the reasoning why neither method described there is opportune.
Option 1 -
I did look into splitting the framework into 2 frameworks (one with all extension-safe code and one with the non-extension-safe code). However, the original idea was to use objc Categories/Extensions - this doesn’t quite fit our needs. Categories/Extensions only allow you to add new methods/properties, not override existing ones. We could hypothetically add new methods, but that would require the user to change their code to use the new methods.
I also looked into subclasses which does allow overrides, but it would also require the user to change their code to use the new class.
We could do method swizzling, but opinion of that on the internet is that it's not very safe.
I’m of the opinion that anything that requires the user to change code isn’t super feasible due to plugins.
Option 2 -
We could still do the 2 frameworks but rename one to
FlutterExtentionSafe. This works without users needing to change any code (including imports like@import Flutter/#import <Flutter/Flutter.h>). I believe the reason this works is because at compile time, it finds theFlutterframework on the framework search path and it imports in the headers. Then at link time,FlutterExtentionSafeis explicitly linked so it uses that framework first when checking for symbols and since it finds all the symbols inFlutterExtentionSafe, it doesn’t need/try to auto-link theFlutterframework (despiteFlutterbeing the framework imported).This seems precarious to me since we’re relying on Xcode to not auto-link the
Flutterframework. If for some reasonFlutterframework did get auto-linked (such as the user using a symbol that’s not in theFlutterExtensionSafeframework but is in theFlutterframework - this is unlikely though), we’d get name collision issuesPre-launch Checklist
///).If you need help, consider asking for advice on the #hackers-new channel on Discord.