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

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

  • การอัปเกรดเป็นส่วนขยาย ARCore สำหรับ AR Foundation ของ Unity เวอร์ชัน 1.26
  • กำหนดเป้าหมายเป็น Android SDK ระดับ 31 ในโปรเจ็กต์ Unity ไม่ว่าจะเป็นส่วนขยาย ARCore เวอร์ชันใดก็ตาม
  • กำหนดเป้าหมายเป็น 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. ใช้การเปลี่ยนแปลงต่อไปนี้กับไฟล์ที่สร้างขึ้นทั้ง 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 จะดาวน์โหลดเครื่องมือสร้างเวอร์ชัน 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>