Tạo bản dựng cho Android 12 bằng Unity

Khi tạo một dự án Android nhắm đến Android 12 (SDK cấp 31), bạn có thể gặp lỗi sau:

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

Nguyên nhân là do sự không tương thích giữa Bộ công cụ xây dựng Android phiên bản 31.0.0 và hệ thống xây dựng Unity. Kể từ Bộ công cụ xây dựng Android phiên bản 31.0.0, DX đã bị xoá và thay vào đó là D8, dẫn đến sự cố trong các bản dựng Unity dành cho Android.

Lỗi này có thể xảy ra trong các trường hợp sau:

  • Nâng cấp lên Tiện ích ARCore cho AR Foundation phiên bản 1.26 của Unity,
  • Nhắm mục tiêu SDK Android cấp 31 trong mọi dự án Unity, bất kể phiên bản Tiện ích ARCore,
  • Nhắm mục tiêu SDK Android cấp 30 trong mọi dự án Unity trong khi cài đặt Công cụ xây dựng phiên bản 31.0.0, bất kể phiên bản Tiện ích ARCore là gì.

Giải pháp

Chúng tôi đang làm việc với Unity để giải quyết vấn đề không tương thích này. Trong thời gian chờ đợi, hãy làm theo hướng dẫn để tạo một dự án nhắm đến Android 12:

  1. Trong Project Settings > Player > Android > Publishing Settings > Build, hãy chọn cả hai:

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

    Ảnh chụp màn hình hiển thị phần Cài đặt phát hành, ngăn Bản dựng với cả hai tuỳ chọn Mẫu Gradle được chọn

  2. Áp dụng các thay đổi sau cho cả hai tệp được tạo:

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

    Xoá nhận xét sau đây ở đầu tệp (nếu có):

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

    Sau đó, sửa đổi compileSdkVersionbuildToolsVersion như sau:

    buildToolsVersion '30.0.3'
    

Khi tạo bản dựng, Unity sẽ tải Build-Tools phiên bản 30.0.3 xuống và sử dụng công cụ này để xây dựng dự án trong khi vẫn duy trì targetSdkVersion đã chọn.

Tạo bản dựng Gradle tuỳ chỉnh

Trên các phiên bản Unity 2019.4, 2020.12020.2 được tạo bằng các phiên bản cũ, bạn cần đặt bản dựng Gradle tuỳ chỉnh thành Gradle phiên bản 6.1.1 trở lên. Bạn cũng cần có Trình bổ trợ Android cho Gradle 4.0.1 trở lên.

Ứng dụng nhắm đến SDK 31 yêu cầu Gradle Phiên bản 6.1.1 trở lên.

  1. Chuyển đến Preferences > External Tools > Android > Gradle rồi đặt bản dựng Gradle tuỳ chỉnh thành Gradle 6.1.1 trở lên. Hãy xem Công cụ bản dựng Gradle để tải xuống.
  2. Áp dụng các thay đổi sau cho cả hai tệp đã tạo:

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

Áp dụng các thay đổi cho ứng dụng nhắm đến Android 12

Nếu ứng dụng của bạn nhắm đến Android 12, thì bạn phải khai báo rõ thuộc tính android:exported. Đối với tất cả các thay đổi trong Android 12, hãy xem mục Thay đổi về hành vi trong Android 12.

  1. Trong Project Settings > Player > Android > Publishing Settings > Build, hãy chọn Custom Main Manifest.

  2. Áp dụng các thay đổi sau cho Assets/Plugins/Android/AndroidManifest.xml:

    1. Xoá nhận xét sau đây ở đầu tệp (nếu có):

      <!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
      
    2. Thêm thuộc tính android:exported vào thẻ <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>