いつもぶつかって何となく調べて解決してきたAndroid周りの対応


前置き

  • いつも同じようなエラーが発生する……
  • 多分Unityのversion upしたタイミングな気がしている……
  • でもその度調べて解決してるが、結局いつも原因忘れてしまっている……

環境

  • Unity2019.4.18f1
  • GoogleMobileAds-v5.4.0
  • Android Studio 4.1.3

結論

  • JDKのバージョンをテキトーなやつ指定してるとUnityでエラーになる場合がある

事象

  • GoogleMobileAdsを更新したので、Android Force Resolveを再度実施しようとした
  • そうしたら以下のようにエラーが発生……
java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
    at org.codehaus.groovy.vmplugin.VMPluginFactory.<clinit>(VMPluginFactory.java:43)
    at org.codehaus.groovy.reflection.GroovyClassValueFactory.<clinit>(GroovyClassValueFactory.java:35)
    at org.codehaus.groovy.reflection.ClassInfo.<clinit>(ClassInfo.java:109)
    at org.codehaus.groovy.reflection.ReflectionCache.getCachedClass(ReflectionCache.java:95)
    at org.codehaus.groovy.reflection.ReflectionCache.<clinit>(ReflectionCache.java:39)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerMethods(MetaClassRegistryImpl.java:209)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:107)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:85)
    at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:36)
    at org.codehaus.groovy.runtime.InvokerHelper.<clinit>(InvokerHelper.java:86)Reporting analytics data: /androidresolver/resolve/gradle/failed/fetch?unityVersion=2019.4.18f1&unityPlatform=OSXEditor&installSource=upm&version=1.2.164&scope= 'Android Resolver: Gradle Resolve: Tool Extraction Failed'
ERROR: Gradle failed to fetch dependencies.

原因と解決方法

原因

  • Javaのversionが14.0.1だったのがダメそう。1.8.0だと大丈夫そう

解決方法

大丈夫なJDKはどこ?

  • Android Studioのjava versionを確認する
$ /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home/bin/java -version
openjdk version "1.8.0_242-release"
OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)
OpenJDK 64-Bit Server VM (build 25.242-b3-6915495, mixed mode)

→ 大丈夫そうなのでこれを指定する。ただし、AndroidStudio4.2以降だとJDK11がバンドルされているとのこと。

  • UnityHub使っていれば、よしなに1.8.0をinstallされているみたいなので、AndroidStudio側も1.8.0でない場合、こちらのパスをJAVA_HOMEに指定しておくのが良さそう(あんまりキレイではないが……)
/Applications/Unity/Hub/Editor/2020.3.25f1/PlaybackEngines/AndroidPlayer/OpenJDK/bin/java -version

UnityでJDK指定

  • Preferences > External Toolsを開く
  • Android > JDKにAndroid StudioのJDKパス(/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home)を参照するようにする(※直接指定だとできなかったので、Browseから指定

ちょっと詰まった点

  • PreferencesのBrowseからだとAndroidStudio配下を参照することができなかったので、open /Applications/Android\ Studio.app/Contents/jreとかでFinderでAndroidStudio配下を開く
  • jdkのディレクトリをひとまずサイドメニューのよく使う項目に突っ込む
  • PreferencesのBrowseからよく使う項目のショートカットより選択する

上記でもダメな場合の解決方法

  • 上記の解決方法で解決してたけど、たまにUnity上で突然同じエラーでダメになってしまうケースにぶつかった
  • 自分の場合は、どうもシステム側?のusr/bin/javaを参照していたみたいだった
  • 上記の通り、UnityのPreferencesでも、JAVA_HOMEのパスとかも通しているが、どうにも変なルートでシステム側を参照しているみたいだった
  • sositeシステム側もどうやってインストールされたかが不明(システム環境設定にも、brew listにもいない状況)なので、アンインストールもしづらい
  • UnityでもFlutterでもバンドルされたJDKを基本参照するので、システム側は使わないと割り切り、1.8系を以下のようにインストールして、Unity再起動で無事解決!
brew tap AdoptOpenJDK/openjdk
brew install --cask adoptopenjdk8

解決までの道のり

  • google先生に聞くとgradleのバージョンが低いと出るかもとかあり、3.4.0を参照していそうだったので、確かに古そうと、updateを試みる

現状のgradleのバージョンを確認

cat /Applications/Unity/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/baseProjectTemplate.gradle
allprojects {
    buildscript {
        repositories {**ARTIFACTORYREPOSITORY**
            google()
            jcenter()
        }

        dependencies {
            // If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
            // See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
            // See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
            // To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
            classpath 'com.android.tools.build:gradle:3.4.0'
            **BUILD_SCRIPT_DEPS**
        }
    }
~

3.4.0っぽい!古い!

projectをexportするとgradleのアップデートが流れでできるらしい

  • Build Settingで、Export Projectをチェック
  • Exportボタンになるので押下

だがしかしexportできない!

その1. export時にエラー

原因と解決方法

原因
  • export先のpathはUnityのproject直下だとダメそう……
Invalid build path: /users/nir/git/daydayday
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUIUtility.cs:197)
解決方法
  • とりあえずprojectの上の方の階層をテキトーに指定でOK

その2. java.lang.NoClassDefFoundError

原因と解決方法

原因
  • こんな感じのエラーが発生
CommandInvokationFailure: Failed to update Android SDK package list.
/Users/nir/Library/Android/sdk/tools/bin/sdkmanager --list

stderr[
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
    at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
    at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
    at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 5 more
]
stdout[

]
exit code: 1
  • terminalで以下を打つと、確かに同じエラーが発生する……
/Users/nir/Library/Android/sdk/tools/bin/sdkmanager --list
解決方法
  • 現状のバージョンを確認
$  java -version
openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7)
OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)

$  which java
/usr/bin/java
  • Android Studio側のバージョンを確認
$ /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home/bin/java -version
openjdk version "1.8.0_242-release"
OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)
OpenJDK 64-Bit Server VM (build 25.242-b3-6915495, mixed mode)
  • bashrcに設定&適用(source ~/.bashrc
~/.bashrc
export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
  • 変更されたかを確認&再度sdkmanagerの実行確認
$ java -version
openjdk version "1.8.0_242-release"
OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)
OpenJDK 64-Bit Server VM (build 25.242-b3-6915495, mixed mode)

/Users/nir/Library/Android/sdk/tools/bin/sdkmanager --list

ここまで対応して、gradleのアップデートをしていない状態で、ふと再度Force Resolveしたら今度は行けた!なので、JDKの設定が悪いと判断した流れ。

最後に

  • 回り道した感じがしたけど、解決できてよかった……
  • Unityのアップデートの度同じエラーに出会した気がするので、JDKの設定が原因と考えると何か納得