Flutter 构建 Android 时出现 POM prolog 错误怎么办?
结论
日志显示,构建在 Gradle 解析依赖的 POM 文件时失败。先检查这些文件是否损坏,以及仓库请求返回的是不是 HTML、代理提示页或其他非 XML 内容。
计算机崩溃后缓存可能损坏,但目前没有文件内容作为证据,还不能确认。多个 Google Maven 依赖和 Maven Central 依赖同时解析失败,也需要检查代理、镜像和网络访问情况。
shared_preferences_android 是本次报错所在的项目,单凭这一点不能判断该插件存在缺陷。当前错误也没有指向模拟器尺寸或 Visual Studio 的安装状态。
这个错误表示什么
POM 是 Maven 依赖的 XML 元数据文件。Content is not allowed in prolog. 表示 XML 解析器在文档开头附近遇到了不允许的内容。这里的 prolog 指 XML 文档的前导部分,与 Prolog 编程语言无关。
例如,如果某个 .pom 文件实际保存了下面的内容,就无法作为正常的 Maven POM 解析:
<html>
<body>Proxy authentication required</body>
</html>
这只是示例,并不代表已经确认你的文件包含这些内容。Resetting to invalid mark 也需要结合实际响应和完整堆栈判断,单凭这句话无法确定原因。
Web 版本能够运行,也不能证明 Android 构建依赖正常,因为 Web 构建没有覆盖这条 Gradle 依赖解析路径。
1. 单独运行 Gradle,保留完整错误
在项目的 android 目录执行:
./gradlew --stop
./gradlew assembleDebug --refresh-dependencies --stacktrace --info
Windows PowerShell 使用:
.\gradlew.bat --stop
.\gradlew.bat assembleDebug --refresh-dependencies --stacktrace --info
运行前关闭 IDE 中仍在执行的构建,并确认 Gradle 没有启用离线模式。
--refresh-dependencies 会重新检查依赖,但不保证所有本地文件都会重新下载。如果某个 POM 仍然出现解析错误,下一步就检查那个具体文件。
2. 检查报错 POM 的本地缓存
Gradle 的用户目录默认是 ~/.gradle;Windows 通常是 %USERPROFILE%\.gradle。如果设置了 GRADLE_USER_HOME,应检查该目录。
下载的依赖通常位于:
caches/modules-2/files-2.1/<group>/<artifact>/<version>/<hash>/
例如,可以寻找:
com.android.tools.build/gradle-settings-api/8.13.1/
com.android.tools/sdk-common/31.13.1/
org.jetbrains.kotlin/kotlin-gradle-plugin/2.3.0/
打开其中报错的 .pom 文件,检查是否存在:
- HTML 页面、登录提示、代理错误或 JSON 错误信息。
- 文档开头的异常字符、二进制内容或明显截断。
- 空文件,或与正常 Maven POM 明显不符的内容。
正常 POM 应是完整的 XML 文档,根元素通常为 <project>。文件开头不一定有 <?xml ...?> 声明,不能只凭是否包含声明判断文件好坏。
如果确认某个缓存文件异常,先停止 Gradle,删除该依赖对应的版本缓存目录,再重新运行带有 --refresh-dependencies 的构建。只清理已经定位的依赖版本,既便于确认问题来源,也能减少不必要的重新下载。
3. 检查仓库实际返回的内容
可以在临时目录中直接下载日志里的 POM,检查响应头和正文。例如:
curl --location --fail \
--dump-header pom-headers.txt \
--output gradle-settings-api-8.13.1.pom \
'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-settings-api/8.13.1/gradle-settings-api-8.13.1.pom'
同样检查日志中的 Maven Central URL:
https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/2.3.0/kotlin-gradle-plugin-2.3.0.pom
检查响应状态、重定向目标和文件正文。即使返回 200,正文也可能是网关提示页,所以不能只看状态码。
如果下载结果异常,应检查网络登录状态、VPN、代理、公司网关或自定义 Maven 镜像。如果返回 404,再核实依赖坐标、版本和实际访问的仓库地址,不能继续按缓存损坏处理。
如果 curl 下载正常而 Gradle 仍失败,需要比较两者的代理设置。Gradle 可能通过项目或用户目录中的 gradle.properties 单独配置了代理,例如:
systemProp.https.proxyHost=proxy.example.com
systemProp.https.proxyPort=8080
这里的主机和端口只是配置形式示例,不应直接复制使用。还应检查用户目录下的 Gradle 初始化脚本是否改写了仓库地址。
4. 为什么 flutter clean 和重建 android 目录没有解决
flutter clean 主要清理项目构建产物,不会清空 Gradle 用户目录中的依赖缓存。重新创建 android 目录也不会自动移除这些缓存或用户级代理配置。
如果问题来自全局依赖缓存或仓库响应,执行这两种操作后仍可能出现相同错误。
恢复正常下载后,回到 Flutter 项目根目录执行:
flutter pub get
flutter run
5. 再检查配置和版本问题
给出的 build.gradle.kts 已声明 google() 和 mavenCentral()。插件解析还可能受 settings.gradle.kts 中的 pluginManagement 等配置影响,单凭这份文件无法确认所有仓库配置。
现有日志不足以认定 Kotlin 2.3.0 或 Android Gradle Plugin 8.13.1 不兼容。应先让 POM 正常下载和解析;如果随后出现明确的版本兼容性错误,再结合 Gradle Wrapper、JDK 和插件配置处理。
另外,粘贴的 pubspec.yaml 缺少 YAML 层级缩进。如果实际文件也是这样,需要修正;如果只是粘贴时丢失缩进,则无需据此修改。这个问题应单独核对,不能用它解释当前日志中的 POM XML 解析失败。
备注:内容仅供参考。
