Khi xây dựng một dự án Android nhắm đến Android 12 (SDK cấp 31), bạn có thể gặp phải 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
Điều này là do không tương thích giữa 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ừ Android Build Tools 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 đế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 bất kỳ dự án Unity nào trong khi Công cụ xây dựng phiên bản 31.0.0 được cài đặt, bất kể phiên bản Tiện ích ARCore.
Giải pháp tạm thời
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 đã tạo:
Assets/Plugins/Android/mainTemplate.gradle
Assets/Plugins/Android/launcherTemplate.gradle
Nếu có, hãy xoá nhận xét sau ở đầu tệp:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
Sau đó, hãy sửa đổi
compileSdkVersion
vàbuildToolsVersion
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à dùng phiên bản này để tạo 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.1 và 2020.2 được tạo bằng các phiên bản cũ, bạn sẽ cần thiết lập mộ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 sẽ 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 và thiết lập bản dựng Gradle tuỳ chỉnh thành Gradle 6.1.1 trở lên. Xem công cụ xây dựng Gradle để tải xuống.
Á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õ ràng thuộc tính android:exported
. Để biết tất cả thay đổi trong Android 12, hãy xem nội dung Thay đổi về hành vi trong Android 12.
Trong Project Settings > Player > Android > Publishing Settings > Build, chọn Custom Main Manifest.
Áp dụng các thay đổi sau cho
Assets/Plugins/Android/AndroidManifest.xml
:Nếu có, hãy xoá nhận xét sau ở đầu tệp:
<!-- 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>