Mem-build untuk Android 12 dengan Unity

Saat mem-build project Android yang menargetkan Android 12 (SDK level 31), Anda mungkin mengalami error berikut:

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

Hal ini disebabkan oleh inkompatibilitas antara Android Build Tools versi 31.0.0 dan sistem build Unity. Mulai Android Build Tools versi 31.0.0, DX telah dihapus dan diganti dengan D8, yang menyebabkan kerusakan pada build Unity untuk Android.

Error ini dapat dipicu dalam skenario berikut:

  • Mengupgrade ke ARCore Extensions untuk AR Foundation Unity versi 1.26,
  • Menargetkan Android SDK level 31 di project Unity apa pun, terlepas dari versi Ekstensi ARCore,
  • Menargetkan Android SDK level 30 di project Unity apa pun saat Build Tools versi 31.0.0 diinstal, terlepas dari versi Ekstensi ARCore.

Solusi

Kami bekerja sama dengan Unity untuk mengatasi inkompatibilitas ini. Sementara itu, ikuti petunjuk untuk membuat project yang menargetkan Android 12:

  1. Di Project Settings > Player > Android > Publishing Settings > Build, pilih:

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

    Screenshot yang menampilkan panel Publishing Settings, Build dengan kedua opsi
Template Gradle dipilih

  2. Terapkan perubahan berikut ke kedua file yang dihasilkan:

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

    Jika ada, hapus komentar berikut di bagian atas file:

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

    Kemudian, ubah compileSdkVersion dan buildToolsVersion sebagai berikut:

    buildToolsVersion '30.0.3'
    

Saat mem-build, Unity akan mendownload Build-Tools versi 30.0.3 dan menggunakannya untuk membuat project Anda dengan tetap mempertahankan targetSdkVersion yang dipilih.

Membuat build Gradle kustom

Di Unity versi 2019.4, 2020.1, dan 2020.2, yang dibuat dengan versi lama, Anda harus menetapkan build Gradle kustom ke Gradle versi 6.1.1 atau yang lebih baru. Anda juga memerlukan Plugin Android Gradle 4.0.1 atau yang lebih baru.

Aplikasi yang menargetkan SDK 31 memerlukan Gradle Versi 6.1.1 atau yang lebih baru.

  1. Buka Preferences > External Tools > Android > Gradle, lalu tetapkan build Gradle kustom ke Gradle 6.1.1 atau yang lebih baru. Lihat Alat build Gradle untuk download.
  2. Terapkan perubahan berikut ke kedua file yang dihasilkan:

    • 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'
      }
   }
}

Menerapkan perubahan untuk aplikasi yang menargetkan Android 12

Jika aplikasi menargetkan Android 12, Anda harus mendeklarasikan atribut android:exported secara eksplisit. Untuk semua perubahan di Android 12, lihat Perubahan perilaku di Android 12.

  1. Di Project Settings > Player > Android > Publishing Settings > Build, pilih Custom Main Manifest.

  2. Terapkan perubahan berikut ke Assets/Plugins/Android/AndroidManifest.xml:

    1. Jika ada, hapus komentar berikut di bagian atas file:

      <!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
      
    2. Tambahkan atribut android:exported ke tag <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>