Flutter — 在升级到 Flutter SDK 3.35.1 后,如何将 Android SDK 从 35 升级到 36

欢迎关注我的公众号OpenFlutter,感谢

我最近加入了一个新项目👩‍💻。在等待客户端将我添加到主源代码期间,我运行了由一位同事在 GitHub 上发布的 Flutter 示例代码库项目。这个项目使用了 Flutter SDK 3.35.1 。在执行过程中,我注意到一些警告,表明某些库需要 Android SDK 36

我最近加入了一个新项目👩‍💻。在等待客户将我添加到主源代码期间,我运行了一位同事在 GitHub 上发布的 Flutter 示例代码库项目。这个项目使用了 Flutter SDK 3.35.1 。在执行过程中,我注意到一些警告,表明某些库需要 Android SDK 36

我联系了作者,请他帮忙将 Flutter 项目从 Android SDK 35 升级到 36。因为我在之前的项目中处理过类似的 SDK 升级,所以我记得一开始有多么令人困惑------不知道该选择哪个版本、依赖关系是什么,或者如何做出正确的决定而不浪费太多时间。

这就是为什么,在这篇文章中,我将一步一步地带你完成整个过程。我的目标是分享一套清晰的规则,以便下次你遇到同样的情况时,能更有信心地选择正确的版本,并顺利地应用升级。

让我们开始吧!🚀

这是项目当前的配置(在 Copilot 的帮助下):

csharp 复制代码
Aspect | Value/Config |  
|-----------------------|------------------------------------------------------------|  
| Flutter SDK | 3.35.1 |  
| CocoaPods (iOS) | platform :ios, '13.0' |  
| Android Gradle Plugin | Flutter plugin |  
| Gradle Version | 8.10.2 |  
| AGP Version | (Managed by Flutter/Gradle, compatible with Gradle 8.10.2) |  
| compileSdkVersion | 35 |  
| minSdkVersion | 26 |  
| targetSdkVersion | 35 |  
| Java/Kotlin | Java 17 / JVM 17

迁移步骤

基于 Android 的当前要求,以下是主要步骤:

  • 升级到 Android API 36
  • 添加对 16KB 页大小的支持
  • 启用 Edge-to-Edge 支持

实现

1. 升级到 Android API 36

步骤 1. 在 Android Studio 中安装 Android 16 SDK(通过 SDK 管理器)

你可以在 Android Studio 中手动安装 Android 16 SDK。

步骤 2. 更新 compileSdkVersiontargetSdkVersion

步骤 3. 升级 Android 构建工具和依赖项

为了查看 AGP (Android Gradle Plugin)Kotlin 的兼容版本,我通常会先阅读发布说明------例如,Flutter 3.35 的新功能

在这份文档中,有关于与 Android SDK 相关的具体改动说明,如下图所示。

接下来,我们来检查哪个 Gradle 版本与 Flutter 3.35.1 兼容。

验证这一点的最快方法是查看 wrapper/gradle-wrapper.properties 文件。

如果你想知道为什么项目正在使用这个版本,你可以直接在 Android Studio 中打开 Android 项目。就我个人而言,我使用 FVM(Flutter 版本管理器)来管理版本,这能让所有东西保持一致性,更轻松。

接下来,我们来审查当前配置的值,并确定需要更新哪些内容:

csharp 复制代码
Android Gradle Plugin | Flutter plugin + Google Services + Crashlytics |  
| Gradle Version | 8.10.2 |  
| AGP Version | ??? (Managed by Flutter/Gradle, compatible with Gradle 8.10.2) |  
| compileSdkVersion | 35 -> 36 |  
| minSdkVersion | 26 |  
| targetSdkVersion | 35 -> 36  
| Java/Kotlin | Java 17 / JVM 17

为了验证哪些 AGP 版本与 Android SDK 36 兼容,我查阅了官方文档 👉 Android API level 所需工具的最低版本

为了更清晰地理解,同样值得阅读这部分 👉 升级 Gradle

经过验证,我们可以将它总结为以下图表:

依赖 最低版本要求
Flutter 3.35.1 Gradle ≥ 8.10.2
Android SDK 36 AGP ≥ 8.9.1
AGP 8.9.1 Gradle ≥ 8.11.1

所以,我们今天需要的解决方案是,同时使用 AGP 8.9.1Gradle 8.11.1------这与 Flutter 3.35.1 完全兼容。一旦你理解了这些版本要求,你就能逐步解决在 Flutter 或 Android 项目中升级 SDK 时出现的典型问题。🧭

好消息是,你不需要手动搜索和调整每一个配置值。Android Studio 已经提供了一个工具来让这件事变得更容易。只需前往:Android Studio → Tools → AGP Upgrade Assistant... → 选择版本 8.9.1

完成迁移后,你可以检查本地历史记录来回顾文件更改。通常,你会看到以下文件发生了更新:

  • wrapper/gradle-wrapper.properties
  • settings.gradle

现在是时候清理并重建应用,看看有没有什么东西会坏掉了:

shell 复制代码
flutter clean  
flutter pub get

在这个项目中,我甚至不需要单独运行这两个命令------只需要一个 make sync 命令就搞定了。相当方便!这个代码库的设置非常便捷,让我不需要敲太多字。

⚠️ 但等等......弹出了一个警告!

vbnet 复制代码
Warning: Flutter support for your project's Kotlin version (2.0.20) will soon be dropped. Please upgrade your Kotlin version to a version of at least 2.1.0 soon.  
Alternatively, use the flag "--android-skip-build-dependency-validation" to bypass this check.  
  
Potential fix: Your project's KGP version is typically defined in the plugins block of the `settings.gradle` file (/Users/ngoclan/techtus_base_flutter/android/settings.gradle), by a plugin with the id of org.jetbrains.kotlin.android.  
If you don't see a plugins block, your project was likely created with an older template version, in which case it is most likely defined in the top-level build.gradle file (/Users/ngoclan/techtus_base_flutter/android/build.gradle) by the ext.kotlin_version property.

这个警告基本上是说你可以绕过它来隐藏这条消息😅,但更好的做法是尝试将 Kotlin 版本升级到 2.1.0

在这样做之前,请确保查阅发布说明,了解语法或行为上的变化。对于大多数不依赖大量原生代码的 Flutter 项目来说,升级并不会造成任何大问题。然而,对于那些有大量 Kotlin 原生代码的项目,你应该格外小心,并彻底审查所有变更。

😗 一旦所有事情都搞定,你可能还会看到一些小的警告,但在现阶段,这都不是关键问题。

现在,项目在以下配置下成功运行:

  • Flutter SDK: 3.35.1
  • Android SDK: 36
  • AGP: 8.9.1
  • Gradle: 8.11.1
  • Kotlin: 2.1.0
  • JVM: 17

要了解更多关于 Kotlin 兼容性的细节,请查阅官方文档。

2. 支持 16KB 页大小

如果你在管理项目的 Google Play Console ,你可能已经注意到最近收到一个关于支持 16KB 页大小的新要求通知,如下图所示:

在这个 Flutter 项目中,我碰巧立即遇到了这个问题------特别是与 Isar 库(一个开源的本地数据库解决方案)相关。

解决这个问题的过程有点漫长,所以我已经把整个过程写在了另一篇文章里!

你也可以直接查看 PR中的配置更改。

dart 复制代码
// Edge to Edge  
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);

3. 支持 Edge-to-Edge(全屏显示)

由于这个项目是从 SDK 35 升级到 36,所以配置已经就位。你可以参考:

旧版 Android 上的 Edge-to-Edge

如果你想在旧设备上模拟同样的效果,你需要在 Android 和 Flutter 中额外添加配置。然而,从 Flutter 3.35.1 开始,当你调用适当的 API 时,Flutter 会自动处理 Edge-to-Edge。

如果你的屏幕已经包裹在 SafeArea 中,那你基本上是安全的。

但如果你只使用了 固定的内边距值**,那情况可能会出问题------比如,在 Android 15+ 上,你的 UI 元素可能会被 NavigationBar 遮挡。**

以下是一些需要注意的情况:

  • 浮动操作按钮 (Floating Action Buttons)
  • 底部导航栏 (BottomNavigationBar)
  • 硬编码的底部内边距
  • 底部抽屉中的按钮

测试并调整内边距

  • 在 Android 15+ 设备/模拟器上运行你的应用。
  • 检查屏幕顶部和底部的重叠情况。
  • 在需要的地方增加 padding 或使用 SafeArea,确保 UI 元素没有被遮挡。

此外,我发现 Android Studio 提供了一个非常详细的 SDK 升级清单,涵盖了你需要注意的所有组件。你可以通过 Tools → Android SDK Upgrade Assistant 来访问它。让我们试一试吧!

参考文档

如果你想深入了解,以下是我在升级过程中参考的关键资源:

相关推荐
暖风19994 小时前
Promise是什么?
前端
EndingCoder4 小时前
安装Node.js与NPM包管理器
前端·npm·node.js
字节架构前端4 小时前
基于Rust和WebTransport打造的云游戏音视频引擎
前端
Hilaku4 小时前
面试官:BFF 它到底解决了什么问题?又带来了哪些新问题?
前端·javascript·面试
江城开朗的豌豆4 小时前
React函数组件与类组件:从疑惑到真香的心路历程
前端·javascript·react.js
2301_818732064 小时前
创建vue3项目,npm install后,运行报错,已解决
前端·npm·node.js
一支鱼4 小时前
从一个前端程序员的角度来看iPhone 17 与 iOS 26 的 Web 性能与交互革新
前端·ios·产品
前端Hardy4 小时前
HTML&CSS:高颜值歌词播放器
前端·javascript·css
Kisang.4 小时前
【HarmonyOS】HMRouter关键原理-动态import
前端·华为·typescript·harmonyos·鸿蒙