Skip to content

解决 "unexpected element <queries> found in <manifest>" 错误

问题描述

在 Android 项目构建过程中突然出现以下错误:

unexpected element <queries> found in <manifest>

这个错误通常发生在引入 Android 11(API 级别 30)新增的 <queries> 清单元素时,但项目中使用的 Android Gradle Plugin (AGP) 版本无法识别此新元素。

背景知识

Android 11 引入了 <queries> 元素来处理包可见性限制,允许应用声明需要与之交互的其他应用。但较旧的构建工具无法识别这个新元素。

解决方案

方法一:更新 Android Gradle Plugin(推荐)

这是最直接有效的解决方法。根据您当前使用的 AGP 版本,升级到对应的修复版本:

当前版本系列修复版本
3.3.x3.3.3+
3.4.x3.4.3+
3.5.x3.5.4+
3.6.x3.6.4+
4.0.x4.0.1+
gradle
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.1' // 使用合适的版本
        // 其他依赖...
    }
}

方法二:更新 Gradle 版本

更新 AGP 后,通常也需要更新 Gradle 版本以确保兼容性:

properties
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip

兼容性参考

  • AGP 4.0.1+ 需要 Gradle 6.1.1+
  • AGP 4.1.x+ 需要 Gradle 6.5+

方法三:清理和重建

更新构建工具后,执行清理操作:

bash
# 清理并重新构建
./gradlew clean assembleDebug

# 对于 React Native 项目
cd android && ./gradlew clean && cd .. && npx react-native run-android

方法四:检查清单文件结构

确保 <queries> 元素位于正确的位置:

xml
<manifest>
    <!-- 其他元素 -->
    <queries>
        <!-- 查询声明 -->
    </queries>
    
    <application>
        <!-- 应用组件 -->
    </application>
</manifest>

注意

<queries> 应该位于 <manifest> 根元素下,而不是在 <application> 元素内部。

特殊情况处理

对于 Android 10 及以下设备,即使使用了正确的构建工具,运行时仍可能出现警告:

Unknown element under <manifest>: queries at Binary XML file line #11

这是由于设备上的清单解析器无法识别 <queries> 元素。可以使用 tools:targetApi 属性标记:

xml
<queries xmlns:tools="http://schemas.android.com/tools"
         tools:targetApi="30">
    <!-- 查询声明 -->
</queries>
高级解决方案

如果上述方法无效,可以考虑:

  1. 删除 android/.gradle 目录后重新构建
  2. 在 Android Studio 中执行 "Invalidate Caches / Restart"
  3. 检查依赖库是否包含过时的清单文件

总结

"unexpected element <queries> found in <manifest>" 错误主要是由于构建工具版本过旧导致的。通过更新 Android Gradle Plugin 和 Gradle 版本到合适的修复版本,可以解决这个问题。

场景解决方案
常规 Android 项目更新 AGP 到 3.3.3+/3.4.3+/3.5.4+/3.6.4+/4.0.1+
React Native 项目更新 AGP 并执行清理操作
Flutter 项目更新 AGP 和 Gradle 版本
运行时警告使用 tools:targetApi 属性

保持构建工具更新是预防此类问题的最佳实践。