Androidプロジェクトにおける「unexpected element <queries> found in <manifest>」エラーの解決方法
問題の概要
Androidプロジェクトのビルド時に以下のエラーが発生することがあります:
unexpected element <queries> found in <manifest>
このエラーは、Android 11で導入された<queries>
要素を古いバージョンのAndroid Gradle Plugin(AGP)が認識できない場合に発生します。依存ライブラリがこの新しい要素を含むマニフェストを使用している場合でも、メインのプロジェクトでこのエラーが発生する可能性があります。
原因
Android 11では、パッケージの可視性を制御するために<queries>
要素が導入されました。しかし、古いバージョンのAndroid Gradle Pluginはこの新しい要素を認識しないため、マニフェストのマージ処理中にエラーが発生します。
注意点
この問題は、直接的にプロジェクトのマニフェストに<queries>
を追加していなくても発生します。依存ライブラリがAndroid 11の機能を使用している場合、そのライブラリのマニフェストに<queries>
要素が含まれている可能性があります。
解決方法
方法1: Android Gradle Pluginのアップデート
最も確実な解決方法は、Android Gradle Pluginを適切なバージョンにアップデートすることです。
プロジェクトのルートにあるbuild.gradle
ファイルを開き、以下のように依存関係を更新します:
buildscript {
dependencies {
// 使用しているAGPのメジャーバージョンに応じて対応バージョンを選択
classpath 'com.android.tools.build:gradle:4.0.1' // 最小推奨バージョン
// または最新の安定版
// classpath 'com.android.tools.build:gradle:7.4.2'
}
}
対応バージョンの選択
使用しているAGPのメジャーバージョンに応じて、以下の対応バージョンが利用可能です:
- 3.3.x系列:3.3.3以上
- 3.4.x系列:3.4.3以上
- 3.5.x系列:3.5.4以上
- 3.6.x系列:3.6.4以上
- 4.0.x系列:4.0.1以上
現在はより新しいバージョン(7.x系列や8.x系列)も利用可能です。
方法2: Gradle Distributionの更新
gradle-wrapper.properties
ファイルも更新する必要がある場合があります:
# android/gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
// プロジェクトレベルのbuild.gradle
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2'
}
}
# gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
方法3: クリーンビルドの実行
変更を適用した後、プロジェクトをクリーンビルドします:
# コマンドラインから実行する場合
./gradlew clean
./gradlew build
# React Nativeプロジェクトの場合
cd android && ./gradlew clean && cd .. && npx react-native run-android
方法4: Android Studioの更新
使用しているAndroid Studio自体も最新バージョンに更新してください。古いIDEは新しいGradleプラグインと互換性の問題がある場合があります。
互換性に関する注意点
デバイス互換性
AGP 8.xを使用している場合、Android 10などの古いOSバージョンで実行すると、次の警告が表示されることがあります:
Unknown element under <manifest>: queries at Binary XML file line #11
これはデバイスのマニフェストパーサーが<queries>
要素を認識できないためで、ビルド時のマージエラーとは異なります。この場合は警告であり、アプリの動作には影響しません。
詳細情報
<queries>
要素はAndroid 11のパッケージ可視性機能の一部として導入されました。この機能により、アプリは他のアプリとより安全に連携できるようになります。
詳細はAndroid Developers Blog(英語)を参照してください。
まとめ
「unexpected element <queries> found in <manifest>」エラーは、Android Gradle Pluginを適切なバージョンに更新することで解決できます。プロジェクトの互換性を維持しつつ、最新のAndroid機能に対応するために、定期的なプラグインの更新を推奨します。