Monacaチームの小田川です。
Androidビルドを行った際に、下記のようなエラーが発生する場合があります。
Element xxx at AndroidManifest.xml:xx:x-xx duplicated with element declared at AndroidManifest.xml:xx:x-xx
上記のエラーは、複数のCordovaプラグインが、AndroidManifest.xmlに対して同じ項目の設定を行なっているために、設定の重複が発生したエラーになります。
Android OSのバージョンアップの際には、仕様変更が発生するケースが多くあります。仕様変更の内容によっては、Cordovaプラグイン側でも対応が必要になります。このような場合、仕様変更に対応しているCordovaプラグインと対応してないCordovaプラグインが存在する可能性があり、特に開発が終了しているCordovaプラグインを使い続けているような場合は、上記のようなエラーが発生する可能性が大きくなります。
今回は、AndroidManifest.xmlに対する設定の重複エラー対応について説明していきたいと思います。
AndroidManifest.xmlの設定について
今回説明するAndroidManifest.xmlに対する設定の重複について、Cordova側の仕様として、複数のCordovaプラグインが、AndroidManifest.xmlに対して同じ項目の設定を行なっている場合、設定内容が同じ場合は、対象の設定は重複とは判断されずにビルドを行うことができます。
具体例として、下記のCordovaプラグインのplugin.xmlでは、AndroidManifest.xmlに対してandroid.hardware.location.gps
設定が行われています。
cordova-plugin-geolocation@4.0.2までのplugin.xmlでは、下記の設定が行われています。また、cordova-plugin-googlemaps@2.7.1のplugin.xmlでも下記の設定が行われています。
<uses-feature android:name="android.hardware.location.gps" />
上記のCordovaプラグインバージョンの場合は、正常にビルドを行うことができます。
cordova-plugin-geolocation@4.1.0からは、上記の設定は、下記のように変更されています。
<uses-feature android:name="android.hardware.location.gps" android:required="$GPS_REQUIRED" />
変更された設定では、android:required
属性が追加されているため、cordova-plugin-googlemapsの設定内容とは異なる形になりました。同じandroid.hardware.location.gpsに対する設定ですが、設定されている属性が異なるため、ビルドの際に別の設定と判断され、下記のような設定重複エラーが発生します。
Element uses-feature#android.hardware.location.gps at AndroidManifest.xml:22:5-66 duplicated with element declared at AndroidManifest.xml:18:5-90
設定重複エラーの対応方法
今回のようなAndroidManifest.xmlに対する重複設定エラーに対応する場合は、下記のような対応を行う必要があります。
- 重複している設定を削除する。
- 重複している設定を同じ設定にする。
重複している設定を削除する場合
Cordovaプラグインに設定されている重複設定を削除する場合、最新のAndroid OSに対応している場合があるため、基本的に更新日が新しい方のCordovaプラグインの設定を残し、更新日が古い方のCordovaプラグインの設定を削除します。
今回の例の場合、cordova-plugin-geolocation@4.1.0は、2020年11月6日にリリースされたバージョンになり、cordova-plugin-googlemapsは、2020年4月9日に2.7.1がリリースされて以降、最新版は、リリースされていません。そのため、今回は、cordova-plugin-googlemaps@2.7.1側の設定を削除したカスタム版のCordovaプラグインを作成し、作成したカスタム版のCordovaプラグインを利用する形になります。
cordova-plugin-googlemaps側の重複設定を削除したカスタム版のCordovaプラグインを利用することで、ビルド時の設定重複エラーに対応することができます。
重複している設定を同じ設定にする場合
Cordovaプラグインに設定されている重複設定を同じ設定にする場合も、最新のAndroid OSに対応している場合があるため、基本的に更新日が新しい方のCordovaプラグインの設定に合わせます。今回の例の場合では、cordova-plugin-geolocation@4.1.0の設定に合わせたcordova-plugin-googlemapsのカスタム版Cordovaプラグインを作成する形になります。
今回の例の場合、cordova-plugin-geolocation@4.1.0では、下記のようにandroid:required属性が追加され、属性の値に変数が指定されています。
<uses-feature android:name="android.hardware.location.gps" android:required="$GPS_REQUIRED" />
この変数$GPS_REQUIRED
の設定は、plugin.xmlに下記のように設定されています。
<preference name="GPS_REQUIRED" default="true"/>
cordova-plugin-googlemaps@2.7.1のplugin.xmlに設定されている
<uses-feature android:name="android.hardware.location.gps" />
を
<uses-feature android:name="android.hardware.location.gps" android:required="$GPS_REQUIRED" />
に変更し、上記のpreference設定を追加したカスタム版のCordovaプラグインを作成して利用する形になります。
Monacaでpreference設定で指定されている変数を利用する場合は、MonacaクラウドIDEのCordovaプラグイン管理画面から対象のCordovaプラグインの設定画面を表示し、インストールパラメータに設定を追加することで、利用することができます。
cordova-plugin-geolocationとcordova-plugin-googlemapsのインストールパラメータに同じ設定を追加することで、ビルド時の重複エラーに対応することができます。
おわりに
Androidビルドの際に、今回のようなAndroidManifest.xmlに対する設定の重複エラーが発生した場合、対象のCordovaプラグイン側で対応できていない場合は、利用者側でカスタム版のCordovaプラグインを作成する必要があるため、対応の難易度が高くなります。
今回例に挙げたcordova-plugin-googlemapsは、Google Mapを使用する際に古くから利用されていたCordovaプラグインのため、利用しているユーザも多いと思いますが、現状、3年以上更新が行われていないため、開発がストップしている状態になっています。このような更新が行われていないCordovaプラグインを利用し続けている場合、突然ビルドエラーが発生するケースも多いため、サードパーティー製Cordovaプラグインを利用している場合は、一度、現在も更新が行われているか確認してみてください。
また、cordova-plugin-media-captureやcordova-plugin-cameraの最新版でもandroid:maxSdkVersion
属性が追加される変更が行われています。そのため、今回のようなAndroidManifest.xmlに対する設定の重複エラーが発生する可能性があります。
AndroidManifest.xmlに対する設定の重複エラーが発生した場合は、今回の例を参考にカスタム版のCordovaプラグインを作成して対応してみてください。