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ể được kích hoạt 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 đến SDK Android cấp 31 trong mọi dự án Unity, bất kể phiên bản Tiện ích ARCore,
- Nhắm đến SDK Android cấp 30 trong mọi dự án Unity khi cài đặt Bộ công cụ bản dựng phiên bản 31.0.0, bất kể phiên bản Tiện ích ARCore.
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:
Trong Project Settings > Player > Android > Publishing Settings > Build, hãy chọn cả hai:
- Custom Main Gradle Template,
- Custom Launcher Gradle Template.
Á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
compileSdkVersion
vàbuildToolsVersion
như sau:buildToolsVersion '30.0.3'
Khi tạo bản dựng, Unity sẽ tải xuống Build-Tools phiên bản 30.0.3 và sử dụng công cụ này để tạo dự án của bạ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.1 và 2020.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.
- 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.
Á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
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
. Để biết tất cả thay đổi trong Android 12, hãy xem phần Thay đổi về hành vi trong Android 12.
Trong Project Settings > Player > Android > Publishing Settings > Build, hãy chọn Custom Main Manifest.
Áp dụng các thay đổi sau cho
Assets/Plugins/Android/AndroidManifest.xml
: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-->
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>