AdMobとNCMBが競合する場合の対処法

Unity

筆者が作ったスマホ用ゲーム「バードドロップ」では、まずAdMobで広告を実装した状態でリリースしました。

アップデートでNCMBの QuickRanking をベースに改造したスコアランキング機能を追加。Unityのエディター上とiOS実機での動作確認を終え、Android実機用にビルドを始めると500件以上のエラーが!どうやらAdMobとNCMBの競合が起きていたようです。

過程を省いて対処法の結論はこちら(キンクリ)

筆者の環境:Unity 2019.3.5f1 AdMob Ver.4.1.0 NCMB Ver.4.0.4

Unityコンソールの赤いエラーログの多くが Duplicate class android〜、Duplicate class com.google.android〜、Duplicate class com.google.firebase〜 といった内容で、Androidライブラリ(AARファイル)が重複しているのが原因のようです。

エラーログ毎に指摘されていてる2つのファイルのうち、それぞれバージョンが小さい(NCMBで追加された)方を削除しました。

残す com.google.android.gms.play-services-basement-17.0.0.aar
削除 play-services-base-15.0.1.aar
残す com.google.android.gms.play-services-basement-17.0.0.aar
削除 play-services-basement-15.0.1.aar
残す com.google.android.gms.play-services-measurement-base-17.1.0.aar
削除 play-services-measurement-base-15.0.0.aar
残す com.google.android.gms.play-services-measurement-base-17.1.0.aar
削除 firebase-analytics-impl-16.0.0.aar
残す com.google.android.gms.play-services-tasks-17.0.0.aar
削除 play-services-tasks-15.0.1.aar
残す androidx.core.core-1.0.0.aar
削除 support-compat-26.0.2.aar

これで Build、および Build And Run を実行しても赤いエラーが0になりました。しかし、Android実機でアプリを起動するとすぐにクラッシュして 「アプリ名」が繰り返し停止しています と表示されます。

この競合問題を扱ったブログ記事をいくつか読み、一番参考になったのが yjkymさんの記事 でした。この記事では、NCMBのパッケージをインポートする際に予め不要なファイルを取り除いているのですが、上記表の6つの削除するファイルの他に、3つのファイルを除外するとありました。

firebase-common-16.0.0.aar
firebase-messaging-17.1.0.aar
support-core-utils-26.0.2.aar

試しにこの3ファイルを削除して Build And Run を実行するとアプリが正常に起動し、広告表示(バナー/インタースティシャル/リワード動画)とランキングの更新/表示ができました!yjkymさんにはカロリーメイトあげたい。

ここで一件落着とすることもできますが、この3ファイルの役割がよくわからず、気づかないところで不具合が出たらやだなぁと思ったので、1つずつファイルを元の Plugin/Android/ フォルダに戻してビルドし検証してみました。

その結果、この2ファイルは Plugin/Android/ フォルダに存在してもアプリが起動し広告表示(上記3種)とランキングの更新/表示ができました。
firebase-messaging-17.1.0.aar
support-core-utils-26.0.2.aar

しかし、firebase-common-16.0.0.aarを Plugin/Android/ フォルダに戻すと再びアプリ起動時のクラッシュが発生。

【結論】削除またはインポート時に除外するファイルはこの7つ!

play-services-base-15.0.1.aar
play-services-basement-15.0.1.aar
play-services-measurement-base-15.0.0.aar
play-services-tasks-15.0.1.aar
firebase-analytics-impl-16.0.0.aar
firebase-common-16.0.0.aar
support-compat-26.0.2.aar

※あくまで筆者の環境・動作確認した範囲なので、ご自分でエラーログの対象ファイルや実機での確認を行ってください。

追記

AndroidManifestについてはプロジェクトに存在するのがNCMBインポート時に Plugin/Android/ フォルダ へ追加されるAndroidManifest.xmlひとつだけで、内容はいじらずにビルドできました。
(package=”YOUR_PACKAGE_NAME” のまま、minSdkVersion=”14″ のまま)

GoogleMobileAdsDependenciesについても内容はいじらず、NCMBに含まれるAARのバージョンに合わせていません。
(androidPackage spec=”com.google.android.gms:play-services-ads:18.2.0″ のまま)

さらに追記

ビルドしたAPKファイルを Google Play Console にアップロードすると「デバッグ可能な APK または Android App Bundle をアップロードしました。」とのエラーが。
AndroidManifest.xml内の android:debuggable=”true” をfalseに書き換えると解決します。

Unity