Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

現在スマートフォン向けに開発している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

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
Unityのトラブルシューティングを見てみると、コンフリクトを起こしたライブラリを消すかAndroidManifestのの要素に'tools:replace="android:value"'を追加すれば解決しそうだった。
私は、AndroidManifestに要素を追加する方法では上手くこのエラーを解決できなかったので、前者のコンフリクトを起こしたライブラリを消すことにした。

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

無題1.png

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

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

無題2.png

ビルドエラーその2

上のエラーが解決したのは良いのだが、すぐに別のエラーが起きた。

無題3.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

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

無題4.png

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

最後に

  • 全てのプラグインに言えるが、ライブラリのバージョン違いによるエラーは高確率で発生する。
  • 特にGoogle AdmobやFirebaseなどはUnityでよく使うと思うので、これらに付属しているライブラリとのコンフリクトは最初に疑った方がいいかもしれない。
gamu
プログラミングしたり絵を描いたり3Dモデルを作ったり、広く浅く活動しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした