【Unity】エディターを2022.3.0f1に更新したらapkを出力できなくなった

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【Unity】エディターを2022.3.0f1に更新したらapkを出力できなくなった

2023-6-2 |

Unityでエディターを2021.3.3f1から2022.3.0f1ぶ更新したらapkを出力できなくなったのをなんとかしたい!

概要

この記事では、Unityでエディターを2021.3.3f1から2022.3.0f1ぶ更新したらapkを出力できなくなったのをなんとかする手順を掲載する。

これは症状は環境によるものみたいなんですが、もし同じ症状の方がいたら試してみて下さい。

仕様書

環境

  • Unity 2022.3.0f1

手順書

apkを出力に失敗する原因がいくつもあったのでそれぞれ対応手順と共に挙げる。

Probably the SDK is read-only

エディターはデフォルトだとC:\Program Files\Unity\Hub\Editor\...にインストールされるが、このパスは読み込み限定だぞ!的な例外が発生する。

Exception while marshalling C:\Program Files\Unity\Hub\Editor\2022.3.0f1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\build-tools\32.0.0\package.xml. Probably the SDK is read-only

...

こんなん嘘でしょ。ならここにデフォルトでインストールさせない方が良いので!

気絶しそうになりながら、Editorを管理者権限が必要ない別のパスにインストールし直すことでこの例外は発生しなくなった。

シンボルが見つからない?

今度はGradleからJavaのコンパイラーが失敗してると怒られる。

> Task :unityLibrary:compileReleaseJavaWithJavac FAILED

詳細。

C:\project\Library\Bee\Android\Prj\IL2CPP\Gradle\unityLibrary\src\main\java\com\unity\androidnotifications\UnityNotificationManager.java:164: エラー: シンボルを見つけられません

...

Build.VERSION_CODES.TIRAMISU

...

PackageManager.PERMISSION_GRANTED

...

TIRAMISUってなんやねん!美味そうじゃん!
TIRAMISUはAndroidのAPIのバージョンの名前?的なものでTIRAMISU33を表してる。

なんだかJava、Gradleまわりが怪しい感じに。

33のSDKが反映されてないっぽい。何故だ。

Gradleの設定ファイルを弄って、強制的に33にする。

「Project Settings」->「Player」->「Publishing Settings」の中の「Custom Main Gradle Template」にチェックを入れる。

するとAssets/Plugins/Android/mainTemplate.gradleが生成されるので開く。
中身はこんな感じ。

apply plugin: 'com.android.library'
**APPLY_PLUGINS**

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
**DEPS**}

android {
    ndkPath "**NDKPATH**"

    compileSdkVersion **APIVERSION**
    buildToolsVersion '**BUILDTOOLS**'

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }

    defaultConfig {
        minSdkVersion **MINSDKVERSION**
        targetSdkVersion **TARGETSDKVERSION**
        ndk {
            abiFilters **ABIFILTERS**
        }
        versionCode **VERSIONCODE**
        versionName '**VERSIONNAME**'
        consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD**

    }

    lintOptions {
        abortOnError false
    }

    aaptOptions {
        noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ')
        ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~"
    }**PACKAGING_OPTIONS**
}
**IL_CPP_BUILD_SETUP**
**SOURCE_BUILD_SETUP**
**EXTERNAL_SOURCES**

21行目あたりを下記のように書き換える。

apply plugin: 'com.android.library'
**APPLY_PLUGINS**

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
**DEPS**}

android {
    ndkPath "**NDKPATH**"

    compileSdkVersion **APIVERSION**
    buildToolsVersion '**BUILDTOOLS**'

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }

    defaultConfig {
        minSdkVersion **MINSDKVERSION**
        //targetSdkVersion **TARGETSDKVERSION**
        targetSdkVersion 33
        compileSdkVersion 33
        ndk {
            abiFilters **ABIFILTERS**
        }
        versionCode **VERSIONCODE**
        versionName '**VERSIONNAME**'
        consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD**

    }

    lintOptions {
        abortOnError false
    }

    aaptOptions {
        noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ')
        ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~"
    }**PACKAGING_OPTIONS**
}
**IL_CPP_BUILD_SETUP**
**SOURCE_BUILD_SETUP**
**EXTERNAL_SOURCES**

書き換えた部分をピックアップするとこんな感じ。

        //targetSdkVersion **TARGETSDKVERSION**
        targetSdkVersion 33
        compileSdkVersion 33

これで33のSDKがビルドで使われるようになり、TIRAMISUたちの問題は解決する。

が、まだビルドに失敗する。

ライセンスに同意する

ビルドを試すと下記のように出力される。

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':unityLibrary:compileReleaseJavaWithJavac'.
> Failed to install the following Android SDK packages as some licences have not been accepted.
     platforms;android-33 Android SDK Platform 33
  To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.
  Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html

  Using Android SDK: C:\Unity\Editor\2022.3.0f1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK

33のSDKを使うにはライセンスに同意する必要がある的な感じ。インストールする時に言って欲しいわい!

sdkmanager.bat --licensesをコマンドプロンプトで実行する必要がある。

batファイルはエディターをインストールしたディレクトリの中にある。私の環境だとC:\Unity\Editor\2022.3.0f1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\tools\binの中にあった。

sdkmanager.batの実行にはJava 8以前のJavaが必要なのでAndroid Studioに含まれてるJava 8をJAVA_HOMEに設定する必要がある。

Java 9以降のバージョンがJAVA_HOMEに設定されてると下記の例外が発生するので注意。

Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema

一連のコマンドをまとめると下記のようになる。

cd C:\Unity\Editor\2022.3.0f1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\tools\bin
SET JAVA_HOME=C:\Program Files\Android\jdk\jdk-8.0.302.8-hotspot\jdk8u302-b08
sdkmanager.bat --licenses

sdkmanager.bat --licensesを実行するとライセンスが表示されるのでyで同意する。(7回表示された)

ここまで全部やってやっとapkを出力できるようなった!

まとめ(感想文)

このせいで5時間残業したぞ!(うち、プログラムの更新は5分未満)

これは何かしらサポートというかアナウンスが欲しいところ。