פיתוח ל-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

הסיבה לכך היא חוסר תאימות בין גרסה 31.0.0 של Android Build Tools לבין מערכת ה-build של Unity. החל מגרסה 31.0.0 של Android Build Tools, DX הוסר לטובת D8, מה שהוביל לשיבושים בגרסאות ה-build של Unity ל-Android.

השגיאה הזו עשויה להתרחש בתרחישים הבאים:

  • שדרוג לתוספי ARCore עבור Unity's AR Foundation גרסה 1.26,
  • טירגוט של Android SDK לרמה 31 בכל פרויקט ב-Unity, ללא קשר לגרסה של תוספי ARCore,
  • טירגוט לרמה 30 של Android SDK בכל פרויקט Unity כשגרסה 31.0.0 של Build Tools מותקנת, ללא קשר לגרסה של תוספי ARCore.

פתרון עקיף

אנחנו פועלים עם Unity כדי לפתור את חוסר התאימות הזה. בינתיים, צריך לפעול לפי ההוראות ליצירת פרויקט שמטרגט את Android 12:

  1. בProject Settings > Player > Android > Publishing Settings > Build, יש לבחור בשתי האפשרויות:

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

    צילום מסך שבו מוצגות ההגדרות Advertising (הגדרות הפרסום, החלונית Build) שבהן נבחרו שתי האפשרויות של Gradle

  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 של Build-Tools ותשתמש בה כדי לבנות את הפרויקט שלך תוך שמירה על targetSdkVersion שנבחר.

יצירת גרסאות build מותאמות אישית של Gradle

בגרסאות 2019.4, 2020.1 ו-2020.2 של Unity, שמבוססות על גרסאות ישנות יותר, צריך להגדיר גרסת Gradle מותאמת אישית לגרסה 6.1.1 ואילך. נדרש גם פלאגין Android Gradle מגרסה 4.0.1 ואילך.

כדי להשתמש באפליקציות שמטרגטות את SDK 31 יש צורך ב-Gradle גרסה 6.1.1 ואילך.

  1. עוברים אל Preferences > External Tools > Android > Gradle ומגדירים את ה-build המותאם אישית של Gradle כ-Gradle 6.1.1 ואילך. למידע על הורדות, אפשר לעיין בכלי Gradle build.
  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>