如何修复“在 <manifest> 中发现的意外元素 <queries>”错误?

Com*_*are 142 android manifest android-manifest android-gradle-plugin flutter

突然间,我在我的 Android 项目中遇到了这个构建错误:

unexpected element <queries> found in <manifest>
Run Code Online (Sandbox Code Playgroud)

我如何解决它?

Com*_*are 280

Android Gradle 插件需要了解新的清单元素,尤其是清单合并过程。如果插件在清单合并中看到它无法识别的元素,它会感到困惑,抛出问题中的构建错误。

在这种情况下,Android 11<queries>作为清单元素引入,而旧版本的 Android Gradle 插件不知道该元素。

清单合并发生这种情况的事实意味着简单地升级依赖项可能会导致此错误。例如,如果您升级到最新版本的com.awesome:awesome-library,并且它<queries>的清单中包含一个元素,即使您的代码没有任何其他更改,您也可能会因构建中的上述错误而崩溃。

谷歌发布了一系列 Android Gradle 插件的补丁版本来解决这个问题:

  • 3.3.3
  • 3.4.3
  • 3.5.4
  • 3.6.4
  • 4.0.1

如果您使用的是3.3.*直通4.0.*系列中的现有插件,请从该列表升级到相关的补丁版本(或更高版本),并且您不应再遇到该错误(例如,classpath 'com.android.tools.build:gradle:4.0.1')。

如果您使用的是 Android Studio 4.1 或更高版本,以及匹配的 Android Gradle 插件(例如,在4.1.*系列中),则无需任何更改就可以了。那些插件版本已经知道<queries>.

有关更多信息,请参阅此 Android 开发人员博客文章

  • 完美的解释! (7认同)
  • “Google 发布了一系列 Android Gradle 插件的补丁版本来解决这个问题”如果您不想修复与升级 gradle 插件版本相关的问题,这是非常好的说明。 (3认同)
  • @Waseem,这也为我解决了这个问题,经过几个小时的头痛 (3认同)
  • 拯救了我的一天。遇到问题一周了。谢谢。 (2认同)

Buk*_*mi 71

我在颤振中遇到了这个问题,但我相信这个解决方案适用于颤振和原生 android 开发。

按着这些次序

  1. 阅读这个简短的博客以获得一些理解:点击这里
  1. 删除 android 文件夹中的 .gradle 文件夹即 android>.gradle

  2. 在项目 build.gradle 文件中,根据上面链接中的博客适当升级你的类路径,例如我升级到 classpath 'com.android.tools.build:gradle:4.0.1'

  3. 也升级分发 url。它在 android>gradle>gradle-wrapper.properties 文件中。例如我升级到distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

  4. 您可以使缓存无效并重新启动您的 android studio。确保您有良好的互联网连接,因为它会下载新的 gradle 文件。

谢谢。

  • 这也适用于本机反应,非常有用 (5认同)

Par*_*iya 40

对于颤振

要了解为什么会发生这种情况,请参阅上面的@CommonsWare 的回答

这是因为<queries>在 Android 11 及更高版本 (SDK 30+) 中引入了新的包可见性选项。因此,您需要build.gradle使用包含此更改的版本更新您的版本。以下是支持的 gradle 选项列表。

处理这些错误的最佳解决方案是升级您的Android Gradle 插件更新 Gradle

您必须将 Gradle 版本更新为具有最新查询标签(Android 11 引入)的兼容版本之一。

更新 Android Gradle 插件

YourAppDirectory/android/build.gradle 文件中指定插件版本。插件版本适用于该 Android Studio 项目内置的所有模块。以下示例将插件设置为版本 4.0.1:

buildscript {
    repositories {
        // Gradle 4.1 and higher include support for Google's Maven repo using
        // the google() method. And you need to include this repo to download
        // Android Gradle plugin 3.0.0 or higher.
        google()
        ...
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.1’
    }
Run Code Online (Sandbox Code Playgroud)

如果指定的插件版本尚未下载,Gradle 会在您下次构建项目时下载它,或者从 Android Studio 菜单栏中单击工具> Android > 将项目与 Gradle 文件同步

更新 Gradle

通过编辑YourAppDirectory/android/gradle/wrapper/gradle-wrapper.properties 文件中的 Gradle 分发参考来指定 Gradle 版本 。

不要忘了更新ditributionUrlgradle-wrapper.properties也是如此。例如,对于 gradle 4.0.1,你应该有:

...
distributionUrl = https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
...
Run Code Online (Sandbox Code Playgroud)

我们知道并不是每个人都准备好升级到最新版本,而且您可能依赖旧版本的 Gradle 或与 4.1 不兼容的库。


小智 34

两天前,我突然在 Android Studio 4.1.1 上也遇到了同样的问题。我通过升级构建 gradle 版本解决了这个问题。

项目的 build.gradle 文件中的先前设置是:

classpath("com.android.tools.build:gradle:3.5.3")
Run Code Online (Sandbox Code Playgroud)

当前设置:

classpath("com.android.tools.build:gradle:3.5.4")
Run Code Online (Sandbox Code Playgroud)

问题立马消失了。:)


小智 17

修复错误非常简单。将您的 android studio 更新到最新版本并使用最新的稳定 Gradle 插件版本。目前,我使用Android Studio 4.1.3版和Gradle 插件 6.8.2

请你们注意事项,使用查询,你应该写查询代码出来的应用程序标签内部没有应用标签

欲了解更多信息,请参见下面的照片

https://i.stack.imgur.com/ks0AY.jpg

  • 非常重要**大家请注意,对于使用查询,您应该在应用程序标签外而不是在应用程序标签内编写查询代码** (13认同)

小智 16

我在react-native-image-crop-picker库中遇到了这个错误,我通过更新 Gradle 版本解决了这个问题,如前面的答案中所述。

它是:

classpath("com.android.tools.build:gradle:3.5.3")
Run Code Online (Sandbox Code Playgroud)

更新为:

classpath("com.android.tools.build:gradle:3.5.4")
Run Code Online (Sandbox Code Playgroud)

我跑了一个:

cd android && ./gradlew clean && cd .. && npx react-native run-android
Run Code Online (Sandbox Code Playgroud)

然后就工作正常了。