【发布时间】:2020-11-08 04:49:45
【问题描述】:
突然间,我在我的 Android 项目中遇到了这个构建错误:
unexpected element <queries> found in <manifest>
我该如何解决?
【问题讨论】:
标签: android flutter android-gradle-plugin android-manifest manifest
突然间,我在我的 Android 项目中遇到了这个构建错误:
unexpected element <queries> found in <manifest>
我该如何解决?
【问题讨论】:
标签: android flutter android-gradle-plugin android-manifest manifest
Android Gradle 插件需要了解新的清单元素,尤其是 对于清单合并过程。如果插件有混淆的趋势 在清单合并中看到它无法识别的元素,扔掉 构建问题中的错误。
在这种情况下,Android 11 引入了 <queries> 作为清单元素,而旧版本的 Android Gradle 插件不知道该元素。
从清单合并中发生的事实意味着只需升级依赖项
可能会导致这个错误。例如,如果您升级到最新
com.awesome:awesome-library 的版本,它包含一个 <queries> 元素
在其清单中,您可能会因构建中的上述错误而崩溃,
即使您的代码没有任何其他更改。
Google 发布了一系列补丁版本的 Android Gradle 插件来解决这个问题:
3.3.33.4.33.5.43.6.44.0.1如果您正在使用 3.3.* 到 4.0.* 系列中的现有插件,请升级
到该列表中的相关补丁版本(或更高版本),您不应该再
遇到该错误(例如,classpath 'com.android.tools.build:gradle:4.0.1')。
如果您使用的是 Android Studio 4.1 或更高版本,请使用匹配的
Android Gradle 插件(例如,在4.1.* 系列中),你应该没问题
任何变化。那些插件版本已经知道<queries>。
请参阅this Android Developers Blog post 了解更多信息。
【讨论】:
我在 Flutter 中遇到过这个问题,但我相信这个解决方案适用于 Flutter 和原生 android 开发者。
按照这些步骤进行
删除android文件夹内的.gradle文件夹即android>.gradle
在项目build.gradle文件中,根据上面链接中的博客适当升级你的类路径,例如我升级到classpath 'com.android.tools.build:gradle:4.0.1'
也升级分发网址。它在 android>gradle>gradle-wrapper.properties 文件中适当。比如我把它升级到distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
您可以使缓存无效并重新启动您的 android studio。确保您有良好的互联网连接,因为它会下载新的 gradle 文件。
谢谢。
【讨论】:
两天前我突然在 Android Studio 4.1.1 上也遇到了同样的问题。我通过升级 build gradle 版本解决了这个问题。
项目的 build.gradle 文件中之前的设置是:
classpath("com.android.tools.build:gradle:3.5.3")
当前设置:
classpath("com.android.tools.build:gradle:3.5.4")
问题马上就解决了。 :)
【讨论】:
要了解为什么会发生这种情况,请参阅上述@CommonsWare 的回答
这是因为 <queries> 标签引入了适用于 Android 11 及更高版本 (SDK 30+) 的新包可见性选项。因此,您需要使用包含此更改的版本更新您的 build.gradle。以下是支持的 gradle 选项列表。
处理这些错误的最佳解决方案是升级您的 Android Gradle 插件 和 Update 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’
}
如果指定的插件版本尚未下载,Gradle 会在您下次构建项目时下载它或点击 工具 > Android > 将项目与 Gradle 同步Android Studio 菜单栏中的文件。
更新 Gradle
通过编辑 YourAppDirectory/android/gradle/wrapper/gradle-wrapper.properties 文件中的 Gradle 分发参考来指定 Gradle 版本。
不要忘记在您的gradle-wrapper.properties 中更新您的ditributionUrl。例如,对于 gradle 4.0.1,您应该:
...
distributionUrl = https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
...
不过,我们知道并非所有人都准备好升级到最新版本,而且您可能依赖于旧版本的 Gradle 或与 4.1 不兼容的库。
【讨论】:
我在react-native-image-crop-picker 库中遇到了这个错误,我通过如上所述更新 gradle 版本解决了这个问题。
原来是:
classpath("com.android.tools.build:gradle:3.5.3")
更新到:
classpath("com.android.tools.build:gradle:3.5.4")
我跑了一个:
cd android && ./gradlew clean && cd .. && npx react-native run-android
然后它工作正常。
【讨论】:
由于 Android 11 中 package visibility 的新默认设置和功能需要添加 <queries>,因此您必须更新您的 android gradle 插件。
Google 已为此处列出的当前版本添加了一些补丁:
https://developer.android.com/studio/releases/gradle-plugin.html?buildsystem=cmake#4-0-0
如果你想使用更新版本的 android gradle,你应该从这里搜索兼容的包装器:
https://developer.android.com/studio/releases/gradle-plugin.html?buildsystem=cmake#updating-gradle
【讨论】:
将您的 Gradle 版本更新到 4.0.1+
android/gradle/wrapper/gradle-wrapper.properties 将分发 URL 更新为: distributionUrl=https://services.gradle.org/distributions/gradle-6.7-all.zip
android/build.gradle 更新 gradle 插件: 类路径'com.android.tools.build:gradle:4.1.2'
到 4.0.1+ 这里是 4.1.2,Gradle 版本到 6.5+
【讨论】: