כשמפתחים פרויקט ל-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 Build Tools בגרסה 31.0.0 לבין מערכת ה-build של Unity. החל מגרסה 31.0.0 של Android Build Tools, ה-DX הוסר לטובת D8, מה שהוביל לשיבושים ב-builds של Unity ל-Android.
השגיאה הזו עשויה להתרחש בתרחישים הבאים:
- שדרוג ל-ARCore Extensions for Unity בגרסה 1.26 של AR Foundation,
- טירגוט Android SDK ברמה 31 בכל פרויקט ב-Unity, ללא קשר לגרסה של ARCore Extensions,
- טירגוט Android SDK ברמה 30 בכל פרויקט ב-Unity כשגרסת Build Tools מותקנת בגרסה 31.0.0, ללא קשר לגרסה של ARCore Extensions.
פתרון עקיף
אנחנו עובדים עם Unity כדי לפתור את אי-התאימות הזו. בינתיים, פועלים לפי ההוראות ליצירת פרויקט שמטרגט את Android 12:
ב-Project Settings > Player > Android > Publishing Settings > Build, בוחרים בשתי האפשרויות:
- Custom Main Gradle Template,
- Custom Launcher Gradle Template.
מחילים את השינויים הבאים על שני הקבצים שנוצרו:
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'
במהלך ה-build, Unity תוריד את Build-Tools בגרסה 30.0.3 ותשתמש בו כדי ליצור את הפרויקט תוך שמירה על targetSdkVersion
שנבחר.
יצירת גרסאות build מותאמות אישית של Gradle
בגרסאות Unity 2019.4, 2020.1 ו-2020.2, שנוצרו בגרסאות ישנות יותר, צריך להגדיר build מותאם אישית של Gradle ל-Gradle בגרסה 6.1.1 ואילך. תצטרכו גם את פלאגין Android Gradle בגרסה 4.0.1 ואילך.
אפליקציות שמטרגטות את SDK 31 צריכות את גרסת Gradle 6.1.1 ואילך.
- עוברים אל Preferences > External Tools > Android > Gradle ומגדירים את ה-build המותאם אישית של Gradle ל-Gradle 6.1.1 ואילך. הורדות מפורטות זמינות במאמר כלי ה-build של Gradle.
מחילים את השינויים הבאים על שני הקבצים שנוצרו:
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.
ב-Project Settings > Player > Android > Publishing Settings > Build, בוחרים באפשרות Custom Main Manifest.
מחילים את השינויים הבאים על
Assets/Plugins/Android/AndroidManifest.xml
:אם הוא קיים, מסירים את התגובה הבאה בחלק העליון של הקובץ:
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
מוסיפים את המאפיין
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>