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

הסיבה לכך היא חוסר תאימות בין 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:

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

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

    צילום מסך שבו מוצגות הגדרות הפרסום, חלונית ה-Build שבה שתי האפשרויות של Gradle Template נבחרו

  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'
    

במהלך ה-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 ואילך.

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