Android Studio 运行 Flutter iOS 真机白屏,但 Xcode 和命令行正常的排查记录

Android Studio 运行 Flutter iOS 真机白屏,但 Xcode 和命令行正常的排查记录

最近在调试一个 Flutter 项目时遇到一个比较迷惑的问题:

同一台 iOS 26 真机,同一个 Flutter 工程:

  • 用 Xcode 运行,正常
  • 用命令行 flutter run,正常
  • 用 Android Studio 点运行,安装成功,但启动后白屏

一开始很容易怀疑是 iOS 26 兼容性、Flutter 版本、Pods、缓存或者原生启动代码的问题。但最后发现,根因其实是 Android Studio Flutter 插件默认带上的一个启动参数:--start-paused。

问题现象

环境大概是:

  • Flutter 3.47.1
  • Xcode 26.6
  • iOS 26 真机
  • Android Studio + Flutter 插件

Android Studio 运行后,App 会成功安装到 iPhone 上,也能启动,但界面一直白屏。

同样的项目,用 Xcode 跑正常;用命令行直接跑也正常:

bash 复制代码
/Users/mt/Desktop/zhiboyi/dev/.fvm/flutter_sdk/bin/flutter run \
  --device-id=00008130-001E5D382461401C \
  lib/main.dart

这说明项目本身、iOS 工程配置、Pods、签名、设备连接,大概率都不是根因。

关键线索

查看 Android Studio 日志后,发现它实际执行的命令类似这样:

css 复制代码
/Users/mt/Desktop/zhiboyi/dev/.fvm/flutter_sdk/bin/flutter \
  --no-color run \
  --machine \
  --track-widget-creation \
  --device-id=00008130-001E5D382461401C \
  --start-paused \
  --dart-define=flutter.inspector.structuredErrors=true \
  --devtools-server-address=http://127.0.0.1:9100 \
  lib/main.dart

重点是这个参数:

css 复制代码
--start-paused

Android Studio 为了接入 Debugger,会让 Flutter 以暂停模式启动。也就是说 Dart isolate 启动后会先暂停,等 IDE 的 debugger 连接并发送 resume。

如果这个 resume 没有成功,Flutter 首帧就不会正常绘制,表现出来就是 App 已经打开,但一直白屏。

复现方式

为了确认问题是不是 Android Studio 本身导致的,可以直接在命令行加上同样的参数:

bash 复制代码
/Users/mt/Desktop/zhiboyi/dev/.fvm/flutter_sdk/bin/flutter run \
  --device-id=00008130-001E5D382461401C \
  --start-paused \
  lib/main.dart

结果命令行也复现了白屏。

到这里就基本可以确定:

问题不是 Android Studio 缓存,也不是项目代码,而是 --start-paused 这条 Flutter debug 启动路径在当前 iOS 真机环境下没有正确 resume。

解决方案

在 Android Studio 的 Flutter Run Configuration 里,找到:

arduino 复制代码
Additional run args

加上:

css 复制代码
--no-start-paused

然后重新运行。

最终 Android Studio 仍然可以正常安装和启动 App,但不会让 Dart isolate 一开始暂停,白屏问题解决。

为什么 Xcode 没问题?

因为 Xcode 运行 Flutter iOS 工程时,走的是 Xcode scheme 和 iOS 原生启动流程,不会像 Android Studio Flutter 插件那样自动附加 --start-paused。

普通命令行 flutter run 默认也不会带这个参数,所以也正常。

真正有问题的是这种启动方式:

arduino 复制代码
flutter run --start-paused

它依赖 debugger attach 后恢复 isolate。一旦这个过程在 iOS 26 真机上失败或不稳定,就会出现白屏。

排查建议

如果你也遇到类似问题,可以按这个顺序排查:

  1. 先确认命令行不带 --start-paused 是否正常。
  2. 再用命令行手动加 --start-paused 复现。
  3. 如果加了就白屏,基本可以确认是 debug attach/resume 问题。
  4. 在 Android Studio 的 Additional run args 中加入:
css 复制代码
--no-start-paused
  1. 如果需要稳定调试,也可以临时使用命令行运行,或者用 Xcode/Flutter DevTools 组合排查日志。

总结

这次问题的关键不在 iOS 页面代码,也不在 Flutter 首屏逻辑,而在启动参数。

Android Studio Flutter 插件默认会用类似下面的方式运行 debug:

css 复制代码
flutter run --machine --start-paused ...

在某些 iOS 26 真机环境下,--start-paused 会导致 isolate 没有被恢复,App 停在首帧之前,看起来就是白屏。

最终解决方式很简单:

arduino 复制代码
Additional run args: --no-start-paused

如果你的 Flutter iOS 真机调试也出现"Android Studio 白屏,但 Xcode 和命令行正常",可以优先检查 Android Studio 实际执行的 Flutter run 参数。

相关推荐
恋猫de小郭1 小时前
Flutter 的文字为什么比 SwiftUI 更细?问题主要在 Skia 的 256 项查找表里
android·前端·flutter
JMchen16 小时前
【Jetpack 内核实战 02】ViewModel:生命周期管理与数据持久化核心实战
kotlin·android studio·android jetpack
好的佩奇19 小时前
Dart 之类型系统
flutter·dart
恋猫de小郭1 天前
Dart 3.15 新特性:this 终于支持类型提升了
android·前端·flutter
FungLeo2 天前
成为全栈·Flutter App 篇·主题与可访问性:深浅色、大字号和触控体验
flutter·移动开发·深色模式·可访问性·成为全栈·大字号适配
用户95421573334853 天前
只是选个照片,怎么留下了这么多访问记录?Flutter 图片选择器排查与优化实录
flutter
FungLeo3 天前
成为全栈·Flutter App 篇·第四批复盘:复用了什么,移动端又新增了什么
flutter·移动开发·跨端开发·成为全栈·api契约·全栈复盘
jason.zeng@15022073 天前
使用vscode+flutter开发android程序(入门)
android·vscode·flutter
jason.zeng@15022073 天前
Flutter 项目标准分层目录(repository/dto/page,对齐后端思想)
flutter