naichi's lab

3日後の自分(他人)への書き置き

【unity、Android】AdMob導入済みプロジェクトにGoogleAnalyticsを入れたらビルドエラー(Unable to convert classes into dex format)

f:id:naichilab:20161130021717p:plain

AdMob導入済みプロジェクトのGoogle Analyticsを入れたらビルドが通らなくなった。

iOSもエラーしてるけどまずはAndroidビルドエラーを解決したい。

環境

  • Google Mobile Ads Unity Plugin v3.0.5
    • 半年前ぐらいに入れた今では古いやつ
  • GoogleAnalyticsV4.unitypackage (v0.5-beta)
  • Unity 5.5.0f2

エラーメッセージ

CommandInvokationFailure: Unable to convert classes into dex format.
/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/bin/java -Xmx2048M -Dcom.android.sdkmanager.toolsdir="/Users/naichi/Library/Android/sdk/tools" -Dfile.encoding=UTF8 -jar "/Applications/Unity/PlaybackEngines/AndroidPlayer/Tools/sdktools.jar" -

stderr[
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzlu;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzlv;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzlw;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzlx;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzly;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzlz;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzma;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzmb;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzmc;

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Translation has been interrupted
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:613)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at SDKMain.main(SDKMain.java:129)
Caused by: java.lang.InterruptedException: Too many errors
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:605)
    ... 9 more
]

Lcom/google/android/gms/internal/zzlu みたいなのが重複してるっていってるけどなんのことやら。 どこにいるんだこれは。

ググる

なんかGoogle AnalyticsのResolverは古いからAdMobプラグインのやつで上書きしろっていってる。 まじかよ・・・?

AdMob and Google Analytics packages conflict · Issue #299 · googleads/googleads-mobile-unity · GitHub

確かにAdMobプラグインをだいぶ前に入れた後、つい最近GoogleAnalyticsプラグインを入れた。

試す

1. Assets/PlayServicesResolver/* を消す

2. 最新のAdMobプラグインをダウンロード

Releases · googleads/googleads-mobile-unity · GitHub

3.1.2まで上がってた

3. ダウンロードしたAdMobプラグインをインポート

f:id:naichilab:20161130014607p:plain

かなり変わってるな・・・

これ聞かれたけどOK押した f:id:naichilab:20161130014728p:plain

4. Assets/GoogleMobileAds/Editor/AdMobDependenies.cs に下記を追加

似たような箇所があるけど修正じゃなくて追加

Google.VersionHandler.InvokeInstanceMethod(
    svcSupport, "DependOn",
    new object[] { "com.google.android.gms", "play-services-analytics",
            "LATEST" },
    namedArgs: new Dictionary<string, object>() { 
       {"packageIds", new string[] { 
        "extra-google-m2repository",
        "extra-android-m2repository"} } 
    });

5. エディタ上で実行->エラー

KeyNotFoundException: The given key was not present in the dictionary.
System.Collections.Generic.Dictionary`2[System.String,System.Collections.Generic.HashSet`1[System.String]].get_Item (System.String key) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:150)
Google.JarResolver.PlayServicesSupport.ResolveDependencies (Boolean useLatest)
GooglePlayServices.ResolverVer1_1.DoResolutionNoAndroidPackageChecks (Google.JarResolver.PlayServicesSupport svcSupport, System.String destinationDirectory, Google.JarResolver.OverwriteConfirmation handleOverwriteConfirmation)
GooglePlayServices.ResolverVer1_1+<DoResolution>c__AnonStorey1.<>m__0 ()
GooglePlayServices.ResolverVer1_1.DoResolution (Google.JarResolver.PlayServicesSupport svcSupport, System.String destinationDirectory, Google.JarResolver.OverwriteConfirmation handleOverwriteConfirmation, System.Action resolutionComplete)
GooglePlayServices.PlayServicesResolver.Resolve (System.Action resolutionComplete)
GooglePlayServices.PlayServicesResolver.AutoResolve ()
UnityEditor.EditorApplication.Internal_CallUpdateFunctions () (at /Users/builduser/buildslave/unity/build/artifacts/generated/common/editor/EditorApplicationBindings.gen.cs:197)

6. Unity終了

7. 古いライブラリ削除

  • Assets/Plugins/Android/play-services-*.aar を全部削除

    f:id:naichilab:20161130020519p:plain

  • ProjectSettings/ から下記2ファイルを削除

    • GoogleAarExplodeCache.xml
    • GoogleDependencyAdMobUnity.xml

    f:id:naichilab:20161130020703p:plain

8. Unity再起動

一度再起動しても Assets/Plugins/Android/play-service-* が出てこなかったのでもう一度再起動。

f:id:naichilab:20161130021256p:plain

お、綺麗にバージョンが揃った。

最初はどれか9.4が混ざってたきがする。

9. ローカルビルド

成功したあああああああああ

10. CloudBuild

これも成功したーーーー

めでたしめでたし。