Unity で Android 12 向けのビルド

Android 12(SDK レベル 31)をターゲットとする Android プロジェクトをビルドすると、次のようなエラーが発生することがあります。

Could not determine the dependencies of task ':launcher:compileDebugJavaWithJavac'.
> Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Manager.
> Configure project :launcher
WARNING: The option 'android.enableR8' is deprecated and should not be used anymore.
It will be removed in a future version of the Android Gradle plugin, and will no longer allow you to disable R8.
Build-tool 31.0.0 is missing DX at <android-sdk-path>/sdk/build-tools/31.0.0/dx
File ~/.android/repositories.cfg could not be loaded.
Build-tool 31.0.0 is missing DX at <android-sdk-path>/sdk/build-tools/31.0.0/dx

これは、Android Build Tools バージョン 31.0.0 と Unity ビルドシステムの互換性がないことが原因です。Android Build Tools バージョン 31.0.0 以降、DX が削除され、D8 が優先されるため、Android 向け Unity ビルドが破損する可能性があります。

このエラーは、次のような場合にトリガーされる可能性があります。

  • Unity の AR Foundation バージョン 1.26 用の ARCore Extensions へのアップグレード
  • ARCore Extensions のバージョンに関係なく、すべての Unity プロジェクトで Android SDK レベル 31 をターゲットに設定している場合
  • ARCore Extensions のバージョンに関係なく、Build Tools バージョン 31.0.0 がインストールされている Unity プロジェクトで Android SDK レベル 30 をターゲットにしている。

回避策

Google は Unity と協力して、この互換性の問題を解決しています。それまでは、手順に沿って Android 12 をターゲットとするプロジェクトをビルドしてください。

  1. Project Settings > Player > Android > Publishing Settings > Build で、次の両方を選択します。

    1. Custom Main Gradle Template
    2. Custom Launcher Gradle Template

    Gradle テンプレート オプションの両方を選択した状態で、[公開設定] の [ビルド] ペインが表示されているスクリーンショット

  2. 生成された両方のファイルに次の変更を適用します。

    • Assets/Plugins/Android/mainTemplate.gradle
    • Assets/Plugins/Android/launcherTemplate.gradle

    ファイルの先頭にある次のコメントを削除します(存在する場合)。

    // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
    

    次に、compileSdkVersionbuildToolsVersion を次のように変更します。

    buildToolsVersion '30.0.3'
    

ビルド時に、Unity は Build-Tools バージョン 30.0.3 をダウンロードし、選択した targetSdkVersion を維持しながらプロジェクトをビルドします。

Gradle カスタム ビルドを作成する

古いバージョンでビルドされた Unity バージョン 2019.42020.12020.2 では、カスタム Gradle ビルドを Gradle バージョン 6.1.1 以降に設定する必要があります。また、Android Gradle プラグイン 4.0.1 以降も必要です。

SDK 31 をターゲットとするアプリには、Gradle バージョン 6.1.1 以降が必要です。

  1. Preferences > External Tools > Android > Gradle に移動し、カスタム Gradle ビルドを Gradle 6.1.1 以降に設定します。ダウンロードについては、Gradle ビルドツールをご覧ください。
  2. 生成された両方のファイルに次の変更を適用します。

    • Assets/Plugins/Android/mainTemplate.gradle
    • Assets/Plugins/Android/launcherTemplate.gradle
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        // Must be Android Gradle Plugin 4.0.1 or later. For a list of
        // compatible Gradle versions refer to:
        // https://developer.android.com/studio/releases/gradle-plugin
        classpath 'com.android.tools.build:gradle:4.0.1'
    }
}

allprojects {
   repositories {
      google()
      jcenter()
      flatDir {
        dirs 'libs'
      }
   }
}

Android 12 をターゲットとするアプリに変更を適用する

アプリが Android 12 をターゲットとしている場合は、android:exported 属性を明示的に宣言する必要があります。Android 12 のすべての変更については、Android 12 の動作の変更点をご覧ください。

  1. Project Settings > Player > Android > Publishing Settings > BuildCustom Main Manifest を選択します。

  2. Assets/Plugins/Android/AndroidManifest.xml に次の変更を適用します。

    1. ファイルの先頭にある次のコメントを削除します(存在する場合)。

      <!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
      
    2. <activity> タグに android:exported 属性を追加します。

       <application>
           <activity android:name="com.unity3d.player.UnityPlayerActivity"
                     android:theme="@style/UnityThemeSelector"
                     android:exported="true">
               <intent-filter>
                   <action android:name="android.intent.action.MAIN" />
                   <category android:name="android.intent.category.LAUNCHER" />
               </intent-filter>
               <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
           </activity>
       </application>