Posted by Matthew Forsythe Director - Product Management, Android App Safety
We recently announced new developer verification requirements, which serve as an additional layer of defense in our ongoing effort to keep Android users safe. We know that security works best when it accounts for the diverse ways people use our tools. This is why we announced this change early: to gather input and ensure our solutions are balanced. We appreciate the community's engagement and have heard the early feedback â specifically from students and hobbyists who need an accessible path to learn, and from power users who are more comfortable with security risks. We are making changes to address the needs of both groups.
To understand how these updates fit into our broader mission, it is important to first look at the specific threats we are tackling.
Why verification is important
Keeping users safe on Android is our top priority. Combating scams and digital fraud is not new for us â it has been a central focus of our work for years. From Scam Detection in Google Messages to Google Play Protect and real-time alerts for scam calls, we have consistently acted to keep our ecosystem safe.
However, online scams and malware campaigns are becoming more aggressive. At the global scale of Android, this translates to real harm for people around the world â especially in rapidly digitizing regions where many are coming online for the first time. Technical safeguards are critical, but they cannot solve for every scenario where a user is manipulated. Scammers use high-pressure social engineering tactics to trick users into bypassing the very warnings designed to protect them.
For example, a common attack we track in Southeast Asia illustrates this threat clearly. A scammer calls a victim claiming their bank account is compromised and uses fear and urgency to direct them to sideload a "verification app" to secure their funds, often coaching them to ignore standard security warnings. Once installed, this app â actually malware â intercepts the victim's notifications. When the user logs into their real banking app, the malware captures their two-factor authentication codes, giving the scammer everything they need to drain the account.
While we have advanced safeguards and protections to detect and take down bad apps, without verification, bad actors can spin up new harmful apps instantly. It becomes an endless game of whack-a-mole. Verification changes the math by forcing them to use a real identity to distribute malware, making attacks significantly harder and more costly to scale. We have already seen how effective this is on Google Play, and we are now applying those lessons to the broader Android ecosystem to ensure there is a real, accountable identity behind the software you install.
Supporting students and hobbyists
We heard from developers who were concerned about the barrier to entry when building apps intended only for a small group, like family or friends. We are using your input to shape a dedicated account type for students and hobbyists. This will allow you to distribute your creations to a limited number of devices without going through the full verification requirements.
Empowering experienced users
While security is crucial, weâve also heard from developers and power users who have a higher risk tolerance and want the ability to download unverified apps.
Based on this feedback and our ongoing conversations with the community, we are building a new advanced flow that allows experienced users to accept the risks of installing software that isn't verified. We are designing this flow specifically to resist coercion, ensuring that users aren't tricked into bypassing these safety checks while under pressure from a scammer. It will also include clear warnings to ensure users fully understand the risks involved, but ultimately, it puts the choice in their hands. We are gathering early feedback on the design of this feature now and will share more details in the coming months.
Getting started with early access
Today, weâre excited to start inviting developers to the early access for developer verification in Android Developer Console for developers that distribute exclusively outside of Play, and will share invites to the Play Console experience soon for Play developers. We are looking forward to your questions and feedback on streamlining the experience for all developers.
Watch our video below for a walkthrough of the new Android Developer Console experience and see our guides for more details and FAQs.
We are committed to working with you to keep the ecosystem safe while getting this right.
A Quick Start Guide To Writing An Inciting Incident
Define An Inciting Incident
The inciting incident in a story is the moment when something happens (usually a negative something involving conflict or that causes conflict) that turns your main character’s world upside down. You can set up your story briefly with a normal day for this character. Then we understand what’s at stake when we realise that the next day is different.
In some books, more time is given to this setting up of the protagonistâs âordinary worldâ. If you want to do this, make sure it is important – and that it adds to characterisation and the plot.
Then we have the moment â a beginning point â where everything changes. It is irreversible. The character knows that something is different. (Use the senses here.) They can no longer ignore it, if that is what they have been doing. This something has consequences for your character and things cannot carry on as they always have.
In hindsight, it is easy to identify. If they were recounting the story, this is where they would begin. This would be an inciting incident.
The character has to decide what they are going to do next. The inciting moment is vital because it gives your protagonist a story goal. This goal creates a series of scenes that you can build into a plot that moves towards an ending that answers the questions posed by this moment.
Orient The Reader
You want to get the reader oriented in the inciting incident.
Where are we?
Whatâs going on?
Whoâs involved?
When is it happening?
Why is this happening? (If the story needs it. Usually, we discover the why it’s important throughout the story.)
Introduce the characters by giving us their names and telling us where they are. Readers who feel confused go somewhere else.
By Genre
In a romance, it is usually when the two lovers meet for the first time. In a detective story, it is when a crime (usually a murder) has been committed and the detective has to solve it. In a thriller, it is when a crime is about to be committed and the protagonist has to try to stop it. In an adventure story, it is when something happens that forces the protagonist to leave home and confront it. In a fantasy, the protagonist is chosen to go on a quest. In a Western, a stranger comes to town. In horror, your protagonist comes face to face with the monster. (Find out more about different genres here: Fictional Pillars For Writers)
In The Fault in Our Stars by John Green, Hazel, who is dying of cancer, is sent to a support group by her mother because she believes Hazel is depressed. Hazelâs life changes because of the boy she meets there.
In Life After Life by Kate Atkinson, Sylvie has a stillborn baby, and we go back to moments before the birth, again and again, until Ursula is born alive.
In The Hunger Games by Suzanne Collins, Katniss volunteers to take her sister’s place in the games. She is taken from her home and sent to the Capitol. Will she be able to win?
In The Goldfinch by Donna Tartt, Theo Deckerâs mother is killed in a bomb explosion in a museum. Everything changes for the worse in a moment.
In Gone Girl by Gillian Flynn, Amy Dunne disappears from her home. Her husband, Nickâs life is turned upside down.
In A Heart Full of Headstones by Ian Rankin, John Rebus is in the dock, accused of a crime that could jail him for the rest of his life. The author takes us back in time to find out why.
What Happens After The Inciting Incident?
We want the main character to react. We donât want them to be frozen or indifferent. We want them to plot a course of action to solve the problem that has been presented by this incident. We donât want the protagonist to wallow in passive mode, unable to seize control. They must get up and do something.
This where the story starts.
After The Inciting Incident
If it’s a good moment, we read on. We now have a plot and the reader has something to follow. We want to find out how they solved the problem, what they faced (include the antagonist here), how they felt, and what they learned about themselves.
Congrats to all GSoC 2025 contributors and mentors! This yearâs projects have made a real impact on the Kotlin ecosystem and the contributions are already being integrated, used, and appreciated. Thank you all for your hard work!
Letâs take a closer look at this yearâs projects:
IntelliJ Platform Gradle Plugin â Gradle Reporting and Parallel Verifications
âGSoC was the perfect opportunity to give back to the tools I use daily and move from user to contributor because I’d already been building IntelliJ plugins myself.â
For Victoria Alajemba, a Software Engineer from Nigeria studying in Paris, GSoC was a bridge between learning and impact. Working on the IntelliJ Platform Gradle Plugin, she integrated Gradleâs Problems API and Reporting API, creating richer, standardized reports and exploring parallel verification for faster builds. Guided by Jakub Chrzanowski from JetBrains, she strengthened key workflows used by thousands of plugin developers.
Improving Configuration Cache in Key Gradle Plugins
âWorking with my mentors was an amazing experience. They provided invaluable guidance, from high-level architectural advice to detailed feedback on pull requests.â
Mentors: Oleg Nenashev (ex-Gradle), Rafael Chaves (Gradle), Rodrigo Oliveira (Gradle)
Hailing from Cairo, Nouran Atef spent her summer making Gradle builds faster and more reliable. Her project tackled Configuration Cache compatibility across major community plugins, refactoring them to remove bottlenecks and enable smarter caching. She contributed fixes, documentation, and patterns now adopted across plugins, boosting performance for developers everywhere.
Enhanced Kotlin Code Quality Reporting with Gradle Problem API: Integration with Detekt and Ktlint
âParticipating in GSoC opened my eyes to the open-source community. Collaboration, communication, and more Kotlin all helped me grow into a better, well-rounded engineer. To anyone considering GSoC, especially beginners, I would say to apply! It is very beginner friendly and you can acquire valuable skills that you would not easily gain elsewhere.â
Mentors: DonĂĄt CsikĂłs and Reinhold Degenfellner (both from Gradle)
Based in New York City, Android Engineer Vanessa Johnson spent her summer improving how Kotlin developers experience code quality. Her project integrated the Gradle Problems API into popular tools like Detekt and Ktlint, unifying error reporting across consoles, IDEs, and HTML reports for cleaner, more actionable feedback.
Support Android and iOS Targets in Kotlin Multiplatform for Gemini Using Vertex AI in Firebase
âGSoC ultimately strengthened my passion for the developer experience and mobile infrastructure, inspiring me to keep building tools that make complex technologies more accessible.â
As one of the first Firebase libraries with native Kotlin Multiplatform (KMP) support, Seanâs project bridges Android and iOS with a shared Gemini-powered Firebase AI layer. His modular SDK and Swift-Kotlin bridge simplify AI feature integration across platforms, answering one of the top community requests for Firebase. Mentored by Matt Dyor from Google, Seanâs work lays the foundation for future official KMP-compatible Firebase libraries.
Gradle Convention Plugin for Developing Jenkins Plugins
âThe moment that acceptance email landed in my inbox, I couldnât stop smiling. Working with my mentors was one of the most rewarding parts of this journey.
â
Mentors: Oleg Nenashev (ex-Gradle), Rahul Somasunderam (Netflix), Steve Hill (Netflix)
For Aarav Mahajan, a computer engineering student from Punjab, India, it wasnât just writing a Gradle plugin â it was about expanding whatâs possible for Jenkins developers and modernizing plugin development for Gradle.
The Gradle Convention Plugin introduces a clean, Kotlin-first way to build, test, and publish Jenkins plugins, standardizing best practices, automating checks, and bringing long-requested Gradle parity to the community.
Maven Central Publishing Plugin for Gradle (New APIs)
âGSoC really broadened my perspective. It taught me what it takes to build, promote, and grow an open-source project, which is especially meaningful since becoming a maintainer is one of my long-term goals.â
Yongjun Hong set out to make publishing to Maven Central easier. His new Gradle plugin brings modern Kotlin DSL support, automatic validation, and smart inheritance of shared metadata, turning a tedious, error-prone process into a smooth, consistent workflow. Mentored by Oleg Nenashev, Yongjun delivered a tool that not only simplifies multi-module publishing, but also improves build reliability and compliance â a small change that will save countless hours for open-source maintainers.
Build a Modern, Compiler-Integrated Kotlin Language Server
âIt was incredibly rewarding to see my work tested, reviewed, and used by others in the community.â
Mentors: Shauvik Roy Choudhary, Ryan U, Michael Noah, Claudia Babescu (all from Uber)
From picking up Kotlin from scratch to building a compiler-integrated Language Server with the new Analysis API, Hemramâs project expanded the boundaries of Kotlin tooling.
Working with mentors from Uber and the Kotlin Foundation, he delivered a modern, open foundation for editor integrations and future AI-assisted tools for the Kotlin Language Server Protocol.
Thank you to our contributors and mentors from the Kotlin Foundation member companies and other great partners supporting open-source â Google, Gradle, Uber, Netflix, and JetBrains â and to everyone who reviewed issues, gave feedback, and merged PRs.
If you are considering taking part in GSoC, check out the blogs from this yearâs contributors â theyâre full of insights on writing strong proposals and what the program can teach you.
If youâd like to go deeper, check out the linked contributor posts and repos above.
To stay up to date on the next GSoC or other ways to contribute to Kotlin, join our GSoC channel on Slack.
Hi, Flutter community! My name is Emma Twersky, and I am unbelievably excited to be your new lead for Flutter and Dart DevRel. Iâm not just here to talk about new features; Iâm here for this community. The number one reason Iâm here is for the incredible culture we have. If you havenât read it, check out Flutter culture and how to preserve it. Itâs all about being open, modest, and respectful, all while building fantastic cross-platform apps, and thatâs what Flutter and Dart are all about. Iâm so excited to be a part of this community, and I canât wait to share all that weâre working on.
Speaking of fantastic cross-platform apps, our friends over at NotebookLM have been going viral with their Flutter app this year. We visited them to hear about how Flutter accelerated their launch, check it out:
In fact, you can listen to the Audio Overview of this blog post (and all its linked sources) in NotebookLM.
Still with me? Then hold onto your keyboards, because Flutter 3.38 and Dart 3.10 are now available, and they are HOT. These releases are packed with usability enhancements and improvements to our developer tooling. And yes, that includes AI.
Building the future of apps with Google AI and the âFuture of appsâ series
Weâve got a whole Flutter Flight Plans series dropping this month and next to show you how to build the next generation of apps with Flutter, Firebase, and Gemini.
Building dynamic UI with Flutter GenUI: The new Flutter GenUI SDK is here to help you build dynamic UI that adapts based on your userâs intent. Donât believe me? Watch the video, âGetting started with GenUIâ, then check out the genui package to see it in action.
The easiest way to build with AI: Weâve built a sample app powered by Firebase AI logic that helps you create a nice launching point for integrating AI features into your app. This sample app covers features such as using multi-modal content generation, in addition to the Gemini conversational live API. Get your hands dirty in the Flutter AI Playground.
Build multi-platform Flutter apps with Gemini CLI: Head to the docs to jump into the Flutter extension for Gemini CLI.
Productivity and platform power: Whatâs new in Flutter 3.38 and Dart 3.10
Now for the main event. Hereâs whatâs new and why you should be excited.
Dart 3.10 highlights: More expressive, concise, and robust code.
Dot shorthands: Less typing, more coding. Instead of MainAxisAlignment.start, you can now just write .start. Check out the dot shorthands page to learn more.
Build hooks: Now stable! Compile native code or bundle native assets directly with your Dart package. Get all the details in the hooks page or watch the Build hooks video.
And more! Thereâs a new analyzer plugin system. You can use this system to write your own analysis rules and employ IDE quick fixes. Use the new Deprecated annotation for deprecating specific functionalities.
Framework & UI: OverlayPortal is more powerful than ever, and predictive back gesture is now default on Android. Weâre also still polishing up Material and Cupertino.
This release cycle, our community has been as active as ever, with a host of valuable contributions. Here are just a few examples:
Windows display properties: Thanks to @9AZX, you can now get detailed display information on Windows, including monitor lists, display sizes, refresh rates, and DPI.
New convenience constructors:@ahmeddhus added a SliverGrid.list constructor, providing a cleaner API for creating grids from a list of widgets.
Enhanced gesture handling: @houssemeddinefadhli81 introduced an onLongPressUp callback to the InkWell widget to specifically handle the release of a long press gesture.
More flexible widgets:@iamtoricool added a maxCount parameter to the Badge.count constructor, and @rkishan516 added a momentary variant to CupertinoSlidingSegmentedControl.
Important fixes: We also saw crucial fixes for scrolling behavior from @manu-sncf and @yiiim, focus issues from @romaingyh, and more.
đ Letâs be real: this community is everything. Youâre the reason Flutter is what it is today, and beyond OSS contributions to Flutterâs core, weâre constantly blown away by what you create. In this release, weâre putting the spotlight on Kilian and the framework, Jaspr. Where Flutterâs web support is great for applications, Jaspr is a traditional DOM-based (HTML/CSS) web framework that is built on top of Dart. It is a great complement to Flutter web for when you want a Dart-based solution to build sites.
We were so impressed that we migrated our entire documentation infrastructureâââboth dart.dev and docs.flutter.devâââover to it. Pretty cool, right? Weâve asked Kilian and the team to share the full story in a future blog post, so youâll be hearing from them soon. In the meantime, we recommend that you try it out yourself!
Get started!
So, what are you waiting for? Upgrade to Flutter 3.38 and Dart 3.10 and letâs build the future together.
Welcome back to our regularly schedule quarterly release, Flutter 3.38. This update is all about boosting your productivity and refining the developer experience with dot shorthands and updates to Widget Previews. Thanks to our community, this release includes 825 total commits from 145 unique contributors, with 37 being first time contributors. Letâs dig into whatâs in this release.
Dot shorthands
Write more concise Dart code! Weâre excited to announce a new Dart featureâââdot shorthands! Shorthands reduces boilerplate by letting you omit types that Dart can infer.
For example, you can use shorthands to write .start instead of MainAxisAlignment.start .
This feature is on by default in Dart 3.10 and Flutter 3.38. For more information, check out the dot shorthands page on dart.dev. You can also read about this and more (like Dart hooks!) in the Dart 3.10 release blog post.
Web
Web development configuration files
The flutter run command now supports a configuration file for web settings. This enables you to specify host, port, certificate, and header information in a web_dev_config.yaml file at the root of your project. Check the file in so everyone on your team debugs with the same settings. For more information, visit setting up a web development configuration file.
Web development proxy settings
Along with existing command line flags, the web dev config file also supports new proxy settings. Proxy settings make it possible to forward requests to configured paths to another server. This makes it easier to develop a web client that connects to dynamic endpoints on the same host.
Stateful hot reload is now enabled by default when running with -d web-server and you open the link to your Flutter application in a browser. This even works with multiple browsers connected at the same time.
As with -d chrome, this feature can be temporarily disabled using the --no-web-experimental-hot-reload flag. The ability to disable the feature will be removed in a future release so, if you encounter problems in your development workflow, please file a bug using Dartâs web hot reload issue template. For more information, see the hot reload on the web documentation.
Framework
This release includes a number of powerful new capabilities and refinements across the framework, giving developers more granular control over advanced UI, navigation, and platform interactions.
Developers now have more power when creating pop-ups, dialogs, and other floating UI elements with OverlayPortal. It is now possible to render a child in any Overlay up the widget tree using OverlayPortal.overlayChildLayoutBuilder (#174239), making it easier to show an app-wide notification or other UI that needs to escape the layout constraints of its parent widget. The underlying Overlay.of method was also made more robust and efficient (#174315).
For a more modern Android navigation experience, predictive back route transitions are now enabled by default in MaterialApp (#173860). When a user performs the back gesture, they now see a preview of the home screen as the current route animates away. In addition, the default page transition has been updated to FadeForwardsPageTransitionsBuilder from ZoomPageTransitionsBuilder to reflect native behavior.
This release also deepens desktop integration. On Windows, developers can now access a list of connected displays and query detailed properties for each, such as resolution, refresh rate, and physical size (#164460). This enables the creation of applications with sophisticated window management features.
Finally, the framework itself is now more resilient. Errors that occur in widget lifecycle callbacks (such as didUpdateWidget) are now handled more gracefully, preventing them from causing cascading failures in the element tree (#173148). ResizeImage now correctly implements equality, which makes image caching and comparison more predictable by ensuring that identical ResizeImage providers are treated the same (#172643).
On the web, UI polish continues with a fix to RSuperellipse that prevents rendering errors when corner radii are larger than the widget itself (#172254), instead, such cases will be treated to produce the pill shape as expected.
For international users, detecting the browserâs preferred locale is now more robust. The engine now uses the standard Intl.Locale web API to parse browser languages, replacing the previous manual and more fragile implementation (#172964). This change leads to more reliable locale detection and a better experience for a global audience.
An Android-specific bug (#171973) has been resolved, primarily affecting Samsung devices with hardware keyboards. Previously, after a user interacted with a TextField, the Android Input Method Editor (IME) could get stuck in a stale state. This caused the IME to mistakenly intercept âEnterâ or âSpaceâ key presses, preventing non-text widgets like a Checkbox or Radio button from receiving the event. The fix ensures that the InputMethodManager is correctly reset when the text connection closes, clearing the IMEâs stale state and restoring predictable hardware keyboard interaction for users.
Material and Cupertino updates
The Material and Cupertino libraries continue to evolve with a focus on API consistency and polished user experiences. This release brings a major API migration, new widget capabilities, and numerous refinements that make building beautiful, functional UIs more straightforward.
Building on the deprecation of MaterialState, this release continues the internal migration to the more unified WidgetState. This provides a consistent, expressive way to define a widgetâs appearance across different interaction states, such as pressed, hovered, or disabled, and requires no change for existing apps. This migration has been applied to a wide range of widgets and their themes, including IconButton, ElevatedButton, Checkbox, and Switch (#173893). The new API also adds power and flexibility; for instance, IconButton now includes a statesController property (#169821) that allows for programmatic control over its visual states, opening the door to more custom and interactive designs.
This release also introduces several new features and convenience APIs. The Badge.count constructor now includes a maxCount parameter (#171054) to easily cap the displayed count (for example, showing â99+â instead of â100â).
For finer-grained gesture control, the InkWell widget now features an onLongPressUp callback (#173221), useful for triggering actions that should only complete when the user lifts their finger.
The Cupertino library also continues its journey toward better iOS fidelity. The CupertinoSlidingSegmentedControl adds an isMomentary property (#164262) to allow the control to trigger actions without persisting a selection. To better match native iOS behavior, the CupertinoSheet now features a subtle âstretchâ effect when dragged upward while fully expanded (#168547).
Finally, this release is packed with refinements that polish the behavior of core components. Highlights include a fix for DropdownMenuFormField to correctly clear its text field when a form is reset (#174937) and updates to SegmentedButton to improve focus handling (#173953) and ensure its border correctly reflects the widgetâs state (#172754).
Decoupling Material and Cupertino
Weâve been doing a lot of planning for decoupling the Material and Cupertino libraries from the framework. The following list includes several discussions around some recently published design docs.
Improving the release process for flutter/packages, which will include Material and Cupertino after decoupling.
This release brings a number of fixes that make building complex scrolling layouts, especially those using SliverMainAxisGroup and SliverCrossAxisGroup, more robust and predictable.
Developers using these widgets to group multiple slivers will find that gesture handling is now more reliable. Hit-testing for taps and other pointer events on slivers within these groups is now correctly calculated, ensuring that user interactions behave as expected (#174265).
Several other fixes contribute to more accurate scrolling behavior within a SliverMainAxisGroup. Over-scrolling issues when using a pinned header are resolved (#173349), calling showOnScreen to reveal a sliver now works correctly (#171339), and the internal scroll offset calculation is more precise (#174369).
For developers building custom scroll views, the new SliverGrid.list constructor (#173925) offers a cleaner way to create a grid from a simple list of children.
This release also improves focus navigation for keyboard and D-pad users in complex layouts. In nested scroll views with different scroll axes (such as a vertical list of horizontal carousels), directional focus navigation is now more predictable, preventing the focus from jumping unexpectedly between sections (#172875).
Accessibility: a more inclusive experience for all users
Making applications accessible to all users is a cornerstone of the Flutter framework. This release continues that commitment by giving developers more programmatic control, improving the experience for international users, and polishing the accessibility of core widgets.
For developers building complex applications, this release introduces the ability to turn on accessibility by default on iOS by using WidgetsFlutterBinding.instance.ensureSemantics (#174163). Debugging accessibility issues is now easier, as debugDumpSemanticsTree includes additional text input validation results information to help diagnose problems more quickly (#174677).
For advanced accessibility in sliver-based scrolling views, the new SliverSemantics widget (#167300) is now available. Much like the existing Semantics widget, developers can use SliverSemantics inside a CustomScrollView to annotate portions of their sliver tree with specific semantic information. This is particularly useful for annotating headers, assigning semantics roles, and adding descriptive labels to slivers for screen readers, providing a more understandable and accessible experience for users.
Finally, the accessibility of core widgets continues to be refined. The CupertinoExpansionTile is now accessible by default (#174480), and the AutoComplete widget now announces the status of search results to the user (#173480). Other improvements, such as larger touch targets in the TimePicker (#170060), contribute to a more accessible out-of-the-box experience.
iOS
We are happy to confirm that Flutter fully supports the latest platform releases: iOS 26, Xcode 26, and macOS 26, all of which were released in September. This ensures you can immediately begin developing and testing your apps on Appleâs newest operating systems and tooling.
You might have already noticed significant quality-of-life improvement for iOS developers shipped in the last release in Flutter, addressing a long-standing user annoyance: the requirement for the Xcode application to launch automatically when running Flutter apps on physical devices using flutter run. Weâve introduced a new deployment method using the Xcode 26 command line tool, devicectl, for app installation, launch, and debugging. This transition eliminates the need to invoke the Xcode application during deployment, and relies solely on command-line Xcode build tools in most cases. If you see problems, you can disable this deployment method with flutter config --no-enable-lldb-debugging, and please file an issue to let us know!
Previously, this feature relied on Xcode automation which became unstable and flakey on Xcode 26, especially when running consecutive commands. If you are now developing for the newest Apple releases, we strongly recommend updating your version of Flutter to 3.38 or higher.
UIScene Lifecycle Migration
Flutter 3.38 includes essential support for the Apple-mandated UIScene lifecycle. This is a critical, proactive update following Appleâs announcement at WWDC25: âIn the release following iOS 26, any UIKit app built with the latest SDK will be required to use the UIScene life cycle, otherwise it will not launch.â
To ensure your iOS Flutter applications remain compatible and launch successfully on future iOS releases, a migration is required.
Migrating Flutter applications
All existing iOS Flutter applications must migrate to the new lifecycle. You have two paths to complete this migration:
Manual migration: Follow the manual migration instructions provided on Flutterâs website.
Automatic migration (Experimental): Enable an experimental feature to handle the migration automatically. This will be enabled by default in a future release. Run the following command:
flutter config --enable-uiscene-migration
Migrating Flutter plugins
Flutter plugins that rely on application lifecycle events must be updated to use the UIScene lifecycle events. Plugin developers should refer to the migration guide. Plugins that have not migrated will display warnings in a future release.
Migrating embedded Flutter (Optional)
For projects that embed Flutter within a native host application, migrating is optional but highly recommended. Adopting Flutterâs new UIScene APIs using the add to app migration guide, enables scene lifecycle events for your plugins, ensuring compatibility with the Flutter ecosystem
Android
16KB page size compatibility
Upgrading to Flutter 3.38 is essential preparation for Google Playâs 16 KB page size compatibility requirement. Starting November 1, 2025, apps targeting Android 15 and higher must support 16 KB pages. This change ensures your app runs correctly on high-RAM devices, offering performance benefits like up to 30% faster launches. Flutter 3.38 updates the default Android ndkVersion to NDK r28, the minimum required for native code to achieve the proper alignment for 16 KBÂ support.
Memory fixes
Flutter 3.38 fixes a significant memory leak impacting all Flutter apps on Android. The issue (introduced in 3.29.0) occurred when Activities were destroyed upon exit, as configured by developer settings or when Activities were killed by the system due to low memory.
Android dependency updates
It can often be a challenge to figure out the right combination of versions for Android dependencies that will work for your app, including Gradle, the Android Gradle Plugin (AGP), the Kotlin Gradle Plugin (KGP), Java, and others. For the Flutter 3.38 release, we tested and confirmed compatibility in our continuous integration (CI) environment with the following set of Android dependency versions:
Java 17: required minimum version for Android development in Flutter 3.38.
AGP 8.11.1: the newest Android Gradle Plugin version compatible with KGPÂ 2.2.20.
Gradle 8.14: this version works with the chosen versions of Java, KGP, and AGP. Note that Gradle 8.13 is the minimum version required for AGPÂ 8.11.1.
To ensure that your application seamlessly across Flutter releases, we strongly encourage you to use the API level variables vended by the Flutter SDK in your build files. The configured values for this release are:
flutter.compileSdkVersion (APIÂ 36)
flutter.targetSdkVersion (APIÂ 36)
flutter.minSdkVersion (API 24) or higher
Engine
Performance overlay
The performance overlay has been refactored to be more efficient, reducing its rendering time on both Skia and Impeller backends. This means you get more accurate performance data with less overhead. (#176364)
Vulkan and OpenGLÂ ES
Numerous fixes and improvements to the Vulkan and OpenGL ES backends improve stability and performance on a wider range of devices. This includes better handling of pipeline caches (#176322), fence waiters (#173085), and image layout transitions (#173884).
Renderer unification
Work continues to unify the CanvasKit and Skwasm renderers. This release includes significant refactoring to share more code between the two, which will lead to a more consistent experience and faster development in the future (#174588).
Thread merging
The ability to opt-out of thread merging has been removed from iOS and Android. For more information, check out the great thread merge video.
DevTools and IDEs
Experimental Widget PreviewsâââUpdates
Flutter 3.35 introduced Widget Previews, an experimental feature ready for early feedback from the community. The Flutter 3.38 release brings significant improvements to Widget Previews, including:
IDE integration: Both our VSCode and Intellij / Android Studio plugins are updated with initial support for Widget Previews. You can now view your previews directly within your IDE for a more seamless development experience.
Widget Previews embedded in VSCode.
When used within an IDE, the widget preview environment is configured by default to filter the displayed previews based on the currently selected source file:
Widget preview environment theming and control improvements: The widget preview environment now supports light and dark modes, as well as custom IDE color schemes to match your development environment. Controls within the widget preview environment have also been adjusted to use less space, leaving more room available for rendering previews.
Custom theming support for the Widget Previews environment.
Preview extensibility: The Preview annotation class is no longer marked as final and can now be extended to create custom Preview annotations, allowing for less boilerplate for common preview types.
An example of a custom BrightnessPreview annotation.
MultiPreview support: A new MultiPreview base class allows for creating multiple Preview variations from a single, custom annotation.
Preview groups: A new group parameter in the Preview class allows the grouping of related previews.
An example of multiple âBrightnessâ previews in a preview group.
Reduced restrictions around @Preview annotation arguments: Private constants are now supported as arguments to Preview annotations. Function arguments (such as wrapper and theme) are still required to have public, statically accessible names.
Widget Previews is still an experimental feature, and your feedback is critical in shaping its future. The APIs and user experience are not yet stable and will change as we learn from you.
Based on early feedback, more enhancements are planned to improve the widget preview experience, including:
Flutter DevTools Widget Inspector support: The Widget Inspector is being updated to support inspecting previews within the widget preview environment. We plan to embed the inspector directly within the widget previewer, making it easily accessible regardless of your development environment.
Multi-project support in IDEs: The widget previewer currently only supports displaying previews contained within a single project or Pub workspace. Weâre actively investigating options to support IDE sessions with multiple Flutter projects (issue #173550).
Startup performance improvements: Opportunities for performance improvements are being investigated to reduce initial startup times, including:
Launching a precompiled widget preview environment after the first run
Parallelizing preview detection logic to better handle large projects
To get started, check out the documentation and let us know what you think!
Important Note: Thereâs a known issue where the Widget Previewer can crash or stop updating after a flutter pub get. If you encounter this issue, run flutter pub get in your project and restart your IDE. See #178317 for details.
DevTools updates
Flutter 3.38 contains fixes for some of the top pain points users called out in the 2025 DevTools user survey, including:
Network Panel Improvements
Made it easier to understand when the panel is recording network traffic. (#9495)
Fixed issues around copy-pasting network requests. (#9472, #9482, #9485, #8588)
Flutter Inspector fixes
Fixed a bug where selecting a widget sometimes opened the underlying framework source code instead of the userâs source code. (#176530)
Fixed a bug occasionally preventing interaction with the the top buttons in the Inspector panel. (#9327)
Deprecations and breaking changes
This release includes several important deprecations and breaking changes as part of the ongoing effort to modernize and improve the Flutter framework.
Key build and tooling changes have been made that might affect custom build scripts. The version file at the root of the Flutter SDK has been removed in favor of a new flutter.version.json file located in bin/cache (#172793). Additionally, the AssetManifest.json file is no longer generated by default (#172594).
Other notable changes include:
For more predictable behavior, a SnackBar that includes an action will no longer auto-dismiss (#173084).
The OverlayPortal.targetsRootOverlay constructor is deprecated in favor of the more flexible OverlayPortal(overlayLocation: OverlayChildLocation.rootOverlay).
Several properties on CupertinoDynamicColor, such as withAlpha and withOpacity, are now deprecated in favor of standard Color methods (#171160).
Flutter 3.38 requires Java 17 as the minimum version for Android, matching the Gradle 8.14 (July 2025 release) minimum requirement.
For more details and migration guidance on these and other changes, check out the breaking changes page.
Outro
Flutter 3.38 is focused on making your day-to-day development faster and more enjoyable. These enhancements aim to streamline the way you build. We are incredibly grateful for the hard work and feedback from every community member who contributed to this release.
For a comprehensive list of all the changes, be sure to check out the detailed breaking changes and release notes. To get a free boost to your productivity, simply run flutter upgrade!
Whatâs new in Flutter 3.38 was originally published in Flutter on Medium, where people are continuing the conversation by highlighting and responding to this story.
Where Will Events Be Held For The Copilot Studio User Group?
We've Decided To Use Microsoft GroupMe Event Groups For Hosting Virtual Chat Based Events
Where Can I Access The Event Group?
You Can Access It Here Events Will Be Published Through The â Space Where We Will Be Using GroupMe Event Groups To Host Events That Are Chat-Based Virtual Events For Members That Canât Physically Attend In Person For Events