ساخت اندروید 12 با یونیتی

هنگام ساخت یک پروژه اندرویدی که اندروید 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 و سیستم ساخت Unity است. از Android Build Tools نسخه 31.0.0، DX به نفع D8 حذف شده است که منجر به شکسته شدن بیلدهای Unity برای اندروید شده است.

این خطا ممکن است در سناریوهای زیر ایجاد شود:

  • ارتقاء به ARCore Extensions برای Unity's AR Foundation نسخه 1.26،
  • هدف قرار دادن Android SDK سطح 31 در هر پروژه Unity، صرف نظر از نسخه ARCore Extensions،
  • هدف قرار دادن Android SDK سطح 30 در هر پروژه Unity در حالی که Build Tools نسخه 31.0.0 نصب شده است، صرف نظر از نسخه ARCore Extensions.

راه حل

ما با Unity برای حل این ناسازگاری کار می کنیم. در عین حال، دستورالعمل‌ها را برای ساخت پروژه‌ای که اندروید 12 را هدف قرار می‌دهد دنبال کنید:

  1. در Project Settings > Player > Android > Publishing Settings > Build ، هر دو را انتخاب کنید:

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

    اسکرین شات تنظیمات انتشار، صفحه ساخت را با انتخاب هر دو گزینه 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-Tools نسخه 30.0.3 را دانلود می کند و از آن برای ساخت پروژه شما و در عین حال حفظ targetSdkVersion انتخاب شده استفاده می کند.

ساخت های Gradle سفارشی ایجاد کنید

در نسخه‌های یونیتی 2019.4 ، 2020.1 و 2020.2 ، که با نسخه‌های قدیمی‌تر ساخته شده‌اند، باید یک ساخت Gradle سفارشی را روی Gradle نسخه 6.1.1 یا بالاتر تنظیم کنید. همچنین به پلاگین Android Gradle نسخه 4.0.1 یا بالاتر نیاز دارید.

برنامه‌هایی که SDK 31 را هدف قرار می‌دهند به Gradle نسخه 6.1.1 یا بالاتر نیاز دارند.

  1. به Preferences > External Tools > Android > Gradle بروید و ساخت Gradle سفارشی را روی Gradle 6.1.1 یا جدیدتر تنظیم کنید. برای دانلود به ابزار ساخت 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'
      }
   }
}

اعمال تغییرات برای برنامه هایی که اندروید 12 را هدف قرار می دهند

اگر برنامه شما اندروید 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>