สร้างมาเพื่อ Android 12 ด้วย Unity

เมื่อสร้างโปรเจ็กต์ Android ที่กําหนดเป้าหมายเป็น Android 12 (SDK ระดับ 31) คุณอาจพบข้อผิดพลาดต่อไปนี้

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 เวอร์ชัน 31.0.0 กับระบบบิลด์ Unity ใน Android Build Tools เวอร์ชัน 31.0.0 เราได้นำ DX ออกเพื่อเปลี่ยนไปใช้ D8 ส่งผลให้บิลด์ Unity สำหรับ Android เสียหาย

ข้อผิดพลาดนี้อาจเกิดขึ้นในสถานการณ์ต่อไปนี้

  • การอัปเกรด ARCore Extensions สำหรับ AR Foundation ของ Unity เวอร์ชัน 1.26
  • การกําหนดเป้าหมาย Android SDK ระดับ 31 ในโปรเจ็กต์ Unity ใดก็ได้ ไม่ว่า ARCore Extensions จะเป็นเวอร์ชันใดก็ตาม
  • การกำหนดเป้าหมาย Android SDK ระดับ 30 ในโปรเจ็กต์ Unity ใดก็ตามขณะที่ติดตั้งเครื่องมือสร้างเวอร์ชัน 31.0.0 ไว้ โดยไม่คำนึงถึงเวอร์ชันของส่วนขยาย ARCore

วิธีแก้ปัญหา

เรากำลังร่วมมือกับ Unity เพื่อแก้ไขปัญหาการไม่เข้ากันได้นี้ ในระหว่างนี้ ให้ทําตามวิธีการสร้างโปรเจ็กต์ที่กําหนดเป้าหมายเป็น Android 12

  1. ใน Project Settings > Player > Android > Publishing Settings > Build ให้เลือกทั้ง 2 รายการต่อไปนี้

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

    ภาพหน้าจอแสดงการตั้งค่าการเผยแพร่ แผงการสร้างที่เลือกทั้งตัวเลือกเทมเพลต Gradle และเทมเพลต

  2. ใช้การเปลี่ยนแปลงต่อไปนี้กับทั้ง 2 ไฟล์ที่สร้างขึ้น

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

    นำความคิดเห็นต่อไปนี้ที่ด้านบนของไฟล์ออก (หากมี)

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

    จากนั้นแก้ไข compileSdkVersion และ buildToolsVersion ดังนี้

    buildToolsVersion '30.0.3'
    

เมื่อสร้าง Unity จะดาวน์โหลด Build-Tools เวอร์ชัน 30.0.3 และใช้เพื่อสร้างโปรเจ็กต์ขณะที่ยังคง targetSdkVersion ที่เลือกไว้

สร้างบิลด์ Gradle ที่กําหนดเอง

ใน Unity เวอร์ชัน 2019.4, 2020.1 และ 2020.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. ใช้การเปลี่ยนแปลงต่อไปนี้กับไฟล์ที่สร้างขึ้นทั้ง 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 > Build ให้เลือก Custom 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>