【Unity】NCMBを導入したプロジェクトのビルドで躓いたこと

現在スマートフォン向けに開発しているUnityのプロジェクトにNCMBを導入した時に躓いたことを書き残しておきます。

# 開発環境
- Windows 10 Home
- Unity 2017.4.2f2
- Google Mobile Ads Unity Plugin v3.13.1 導入済み
- NCMB Unity SDK 3.2.2 導入済み

# ビルドエラーその1
NCMBを導入したプロジェクトをAndroidにスイッチングしてビルドしたらエラーが出た。
エラーの内容はこんな感じ。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/225590/701167b5-66f9-c02f-d6ee-5b59e8b617c9.png)

```text
CommandInvokationFailure: Gradle build failed. 
C:\Program Files\Java\jdk1.8.0_112\bin\java.exe -classpath 
"C:\Program Files\Unity2017.4.2f2\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib\gradle-launcher-4.0.1.jar" 
org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx2048m" "assembleRelease"

stderr[
MY_UNITY_PROJECT_PATH\Temp\gradleOut\src\main\AndroidManifest.xml:28:13-35 Error:
	Attribute meta-data#android.support.VERSION@value value=(26.1.0) from [:com.android.support.support-compat-26.1.0:] AndroidManifest.xml:28:13-35
	is also present at [:support-compat-26.0.2:] AndroidManifest.xml:28:13-35 value=(26.0.2).
	Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:26:9-28:38 to override.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':processReleaseManifest'.
> Manifest merger failed : Attribute meta-data#android.support.VERSION@value value=(26.1.0) from [:com.android.support.support-compat-26.1.0:] AndroidManifest.xml:28:13-35
  	is also present at [:support-compat-26.0.2:] AndroidManifest.xml:28:13-35 value=(26.0.2).
  	Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:26:9-28:38 to override.
```

## 解決策
[Unity - Manual : Gradle troubleshooting](https://docs.unity3d.com/Manual/android-gradle-troubleshooting.html#colliding-attributes)
Unityのトラブルシューティングを見てみると、コンフリクトを起こしたライブラリを消すかAndroidManifestの<meta-data>の要素に'tools:replace="android:value"'を追加すれば解決しそうだった。
私は、AndroidManifestに要素を追加する方法では上手くこのエラーを解決できなかったので、前者のコンフリクトを起こしたライブラリを消すことにした。

"support"でプロジェクト内を検索したところ、以下のようなファイルが見つかった。

![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/225590/f6de93f9-2975-2fe4-9a01-d546f0752f9e.png)

26.0.2と26.1.0の2つのバージョンのライブラリがあり、これらがコンフリクトを起こしている可能が高い。
26.0.2の方の3つを削除してみたところ、無事このエラーは解決することができた。

ちなみに、これらのライブラリは、NCMBのパッケージ内に共存している！
もしかしたら、下の3つは最初からインポートしない方がいいかもしれない。

![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/225590/1bbd8c24-fe08-8393-d882-8f4bb88d3a4e.png)

# ビルドエラーその2
上のエラーが解決したのは良いのだが、すぐに別のエラーが起きた。

![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/225590/dee05744-5044-c1d5-c685-d10a8691c9ed.png)

```
CommandInvokationFailure: Gradle build failed. 
C:\Program Files\Java\jdk1.8.0_112\bin\java.exe -classpath "C:\Program Files\Unity2017.4.2f2\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib\gradle-launcher-4.0.1.jar" org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx2048m" "assembleRelease"

stderr[

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':transformClassesWithDexForRelease'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/common/internal/zzaa;

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED in 10s
]
stdout[
The setTestClassesDir(File) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use the setTestClassesDirs(FileCollection) method instead.
The getTestClassesDir() method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use the getTestClassesDirs() method instead.
The ConfigurableReport.setDestination(Object) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use the method ConfigurableReport.setDestination(File) instead.
```

## 解決策
```com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/common/internal/zzaa;```という文章から、google mobile service(Admob)の何かと重複している可能性が高い。

[https://teratail.com/questions/102139](https://teratail.com/questions/102139)

上の質問を参考にしてplay-servicesと付いているライブラリを検索してみると、

![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/225590/60c79592-6fa8-6ec1-0963-aa07568f18d6.png)

どうやら、今回は事前に導入していたAdmobのライブラリとバージョンがコンフリクトしているようだった。
という訳で、11.0.0のライブラリを全て削除してみると、今度こそビルドが成功した。やったぜ。

# 最後に
- 全てのプラグインに言えるが、ライブラリのバージョン違いによるエラーは高確率で発生する。
- 特にGoogle AdmobやFirebaseなどはUnityでよく使うと思うので、これらに付属しているライブラリとのコンフリクトは最初に疑った方がいいかもしれない。