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 以降、D8 に置き換えて DX が削除されました。これにより、Android 用の Unity ビルドが破損します。

このエラーは、次のシナリオでトリガーされる可能性があります。

  • Unity の AR Foundation バージョン 1.26 向けの ARCore 拡張機能へのアップグレード、
  • ARCore 拡張機能のバージョンに関係なく、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.

    [Publishing Settings] の [Build] ペインで、両方の 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. android:exported 属性<activity> タグに追加します。

       <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>