在 Android 12+ 中,REST API 调用在 flutter 中非常慢,在 WiFi 中需要 10 秒,而在移动数据中则不到一秒

Joh*_*n_S 6 android flutter flutter-http

我遇到了 Flutter Android 12+ 版本的问题。使用 Flutter http 插件(版本:0.13.5)进行应用程序消费 REST API 调用。所有API调用都是带有域名的HTTPS服务调用。API 调用需要 10 多秒才能提供响应,而相同的 API 调用在移动数据网络中只需要不到一秒。我尝试使用 Java Client 和 Postman 进行相同的 API 调用,所有响应仅花费不到一秒的时间就得到响应。

\n

在故障排除过程中,我使用Wifi网络测试了以下场景

\n
    \n
  1. 我使用 IP 地址而不是域执行 API 服务调用,只花了不到一秒的时间(HTTP 插件中禁用了 SSL 验证)
  2. \n
  3. 使用连接 keep-alive: true 测试 API 调用,然后第一次调用花费了 10+ 秒,之后后续调用只花费了不到一秒
  4. \n
  5. 一个有趣的事实是,我仅在 Android 12+ 中遇到了问题,Android 11 设备在 WiFi 网络上运行,并且服务呼叫花费了不到一秒的时间。
  6. \n
\n

现在我明白基于 Wifi 的 API 调用总是需要 10 秒 + 实际服务调用时间(例如 400 毫秒,因此相当于 10.400 秒)。

\n

这个问题有什么具体原因吗?

\n
flutter doctor -v\n[\xe2\x88\x9a] Flutter (Channel stable, 3.3.6, on Microsoft Windows [Version 10.0.22000.1219], locale en-US)\n    \xe2\x80\xa2 Flutter version 3.3.6 on channel stable at C:\\Applns\\flutter\n    \xe2\x80\xa2 Upstream repository https://github.com/flutter/flutter.git\n    \xe2\x80\xa2 Framework revision 6928314d50 (6 weeks ago), 2022-10-25 16:34:41 -0400\n    \xe2\x80\xa2 Engine revision 3ad69d7be3\n    \xe2\x80\xa2 Dart version 2.18.2\n    \xe2\x80\xa2 DevTools version 2.15.0\n\n[!] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)\n    \xe2\x80\xa2 Android SDK at C:\\Users\\Siju\\AppData\\Local\\Android\\sdk\n    X cmdline-tools component is missing\n      Run `path/to/sdkmanager --install "cmdline-tools;latest"`\n      See https://developer.android.com/studio/command-line for more details.\n    X Android license status unknown.\n      Run `flutter doctor --android-licenses` to accept the SDK licenses.\n      See https://flutter.dev/docs/get-started/install/windows#android-setup for more details.\n\n[\xe2\x88\x9a] Chrome - develop for the web\n    \xe2\x80\xa2 Chrome at C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe\n\n[\xe2\x88\x9a] Visual Studio - develop for Windows (Visual Studio Community 2022 17.4.1)\n    \xe2\x80\xa2 Visual Studio at C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\n    \xe2\x80\xa2 Visual Studio Community 2022 version 17.4.33110.190\n    \xe2\x80\xa2 Windows 10 SDK version 10.0.22000.0\n\n[\xe2\x88\x9a] Android Studio (version 2021.2)\n    \xe2\x80\xa2 Android Studio at C:\\Program Files\\Android\\Android Studio\n    \xe2\x80\xa2 Flutter plugin can be installed from:\n       https://plugins.jetbrains.com/plugin/9212-flutter\n    \xe2\x80\xa2 Dart plugin can be installed from:\n       https://plugins.jetbrains.com/plugin/6351-dart\n    \xe2\x80\xa2 Java version OpenJDK Runtime Environment (build 11.0.12+7-b1504.28-7817840)\n\n[\xe2\x88\x9a] Connected device (4 available)\n    \xe2\x80\xa2 2201116SI (mobile) \xe2\x80\xa2 b75ac32a6d34 \xe2\x80\xa2 android-arm64  \xe2\x80\xa2 Android 12 (API 31)\n    \xe2\x80\xa2 Windows (desktop)  \xe2\x80\xa2 windows      \xe2\x80\xa2 windows-x64    \xe2\x80\xa2 Microsoft Windows [Version 10.0.22000.1219]\n    \xe2\x80\xa2 Chrome (web)       \xe2\x80\xa2 chrome       \xe2\x80\xa2 web-javascript \xe2\x80\xa2 Google Chrome 107.0.5304.123\n    \xe2\x80\xa2 Edge (web)         \xe2\x80\xa2 edge         \xe2\x80\xa2 web-javascript \xe2\x80\xa2 Microsoft Edge 107.0.1418.62\n\n[\xe2\x88\x9a] HTTP Host Availability\n    \xe2\x80\xa2 All required HTTP hosts are available\n
Run Code Online (Sandbox Code Playgroud)\n

Joh*_*n_S 3

该问题是由于flutter HTTP客户端中的IPv4/IPv6 DNS解析造成的。在 HTTP 服务调用期间,dart 客户端尝试使用 IPv6 地址而不是 IPv4 进行 DNS 解析,其中 DNS 服务器不支持 IPV6 版本,因此它会等待 10 秒后回退到 IPv4 并建立连接。许多 Flutter 开发人员在 Flutter git 存储库中报告了此问题。

所有这些问题都得到了整合,并在 Flutter git 存储库中报告了一个新功能(https://github.com/flutter/flutter/issues/116537

更新Flutter 功能请求已关闭,并在 dart SDK 中提出新功能请求https://github.com/dart-lang/sdk/issues/50868