背景
約7ヶ月振りに Android アプリのアップデートを行うことになり、ついでに Android Gradle Plugin (8.2.1 → 8.5.2) とライブラリのアップデートを行ったところ、アプリの起動時に以下のエラーが発生しました。
Manifest merger failed : Attribute property#android.adservices.AD_SERVICES_CONFIG@resource value=(@xml/gma_ad_services_config) from [com.google.android.gms:play-services-ads-lite:23.3.0] AndroidManifest.xml:92:13-59
is also present at [com.google.android.gms:play-services-measurement-api:22.0.2] AndroidManifest.xml:32:13-58 value=(@xml/ga_ad_services_config).
Suggestion: add 'tools:replace="android:resource"' to <property> element at AndroidManifest.xml to override.
どうやら Google Services と AdMob のライブラリ間で設定が競合しているために発生しており、AGP 8.3 以降で顕在化したようです。
この問題は既にGoogleの開発チームに報告されていますが、2024年8月現在、まだ解決には至っていません。
対応
この競合を回避するには、AndroidManifest.xml の <application>
内に以下のプロパティを追加することで対応できます。
<property
android:name="android.adservices.AD_SERVICES_CONFIG"
android:resource="@xml/gma_ad_services_config"
tools:replace="android:resource" />
複数のライブラリが同じプロパティ (android.adservices.AD_SERVICES_CONFIG
) を定義しているとき、それぞれが異なるリソースを参照している場合があります。この状況では、ビルド時にどのリソースを使用すべきかが決まらないため、競合が発生します。
この場合、tools:replace="android:resource"
を指定することで、そのプロパティが定義される際に他の競合するリソースを無視し、指定されたリソース (@xml/gma_ad_services_config
) を優先して使用するように指示します。これにより、複数の定義のうちどれを使うかが明確になるため、競合が解消されます。
しかしこれは優先するリソースを指定しているだけであり、一時的な解決策に過ぎません。根本的な解決は、Google による修正を待つ必要があります。
参考