👋

Unity HubがインストールしたAndroid SDKでAPI levelが不足する場合 (Windows)

2021/08/18に公開

課題

プロジェクトが要求するAPI levelのplatform-toolsがUnityのビルトインSDKに含まれていない場合、最終的にUnityException: Required API level ~.というエラーになります。

補足

  • 新しいUnityバージョンでは、API levelが不足する場合に表示されるダイアログのアップデートを選ぶことで、この課題が自動的に解決されます。
    • Unity 2021.3.14f1 (LTS)で確認
  • Javaバージョンの不整合で、自動的な解決がエラーしてしまうことがあるようです。
    • これは、UnityバージョンにビルトインされているJavaが使われず、パスが通してあるJavaが使われてしまうことが原因と思われます。
    • 後述のJavaの実行でエラーする場合を参照してください。

補足2

別の解決例1
  • できる限り新しいバージョンのUnityエディタをインストールします。
  • 以下のフォルダから対応レベルのフォルダをコピーします。
    • C:\Program Files\Unity\Hub\Editor\<version>\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\platforms
    • C:\Program Files\Unity\Hub\Editor\<version>\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\build-tools
別の解決例2
  • Android Studioをインストールします。
  • SDKマネージャでSDKのパスを確認して、Sdk\platformsSdk\build-toolsから、対応レベルのフォルダを以下へコピーします。
    • C:\Program Files\Unity\Hub\Editor\<version>\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\platforms
    • C:\Program Files\Unity\Hub\Editor\<version>\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\build-tools

解決例

環境

  • Windows 10、Windows 11
  • Unity 2020.3.16f1 (LTS)、Unity 2021.3.32f1 (LTS)
  • Target API Level: Android 11.0 (API level 30)

対処

  • UnityのPreferenceで、ビルトインSDKのインストール先を特定します。
    • C:\Program Files\Unity\Hub\Editor\2021.3.32f1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK
  • 管理者権限のあるコマンドプロンプトを開き、カレントディレクトリをSDKフォルダに移動して、tools\bin\sdkmanager "platform-tools" "platforms;android-33"を実行します。
    • インストール状況は、tools\bin\sdkmanager --listで確認できます。

Javaの実行でエラーする場合

エラーの例
>tools\bin\sdkmanager --list
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:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        ... 5 more
  • 上記コマンドの実行でJavaがエラーする場合は、ビルトインJavaにパスを通します。
    • path "C:\Program Files\Unity\Hub\Editor\2021.3.32f1\Editor\Data\PlaybackEngines\AndroidPlayer\OpenJdk\bin"

参考

https://developer.android.com/studio/command-line/sdkmanager?hl=ja

Discussion