AndroidビルドのAndroidManifest.xml設定重複エラーについて

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-capturecordova-plugin-cameraの最新版でもandroid:maxSdkVersion属性が追加される変更が行われています。そのため、今回のようなAndroidManifest.xmlに対する設定の重複エラーが発生する可能性があります。

AndroidManifest.xmlに対する設定の重複エラーが発生した場合は、今回の例を参考にカスタム版のCordovaプラグインを作成して対応してみてください。