افزایه Android Gradle نسخه ۸.۱.۰ (ژوئیه ۲۰۲۳)

افزایه Android Gradle نسخه ۸.۱.۰ یک نسخه پخش اصلی است که شامل انواع مختلفی از ویژگی‌های جدید و بهبودها است.

سازگاری

حداقل نسخه نسخه پیش‌فرض یادداشت‌ها
Gradle ۸.۰ ۸.۰ برای کسب اطلاعات بیشتر، به‌روزرسانی Gradle را ببینید.
ابزارهای ساخت کیت توسعه نرم‌افزار ‫۳۳.۰.۱ ‫۳۳.۰.۱ «ابزارهای ساخت کیت توسعه نرم‌افزار» را نصب یا پیکربندی کنید.
NDK موجود نیست 25.1.8937393 نسخه دیگری از NDK را نصب یا پیکربندی کنید.
JDK 17 17 برای کسب اطلاعات بیشتر، تنظیم نسخه JDK را ببینید.

‫Kotlin DSL برای پیکربندی ساخت پیش‌فرض است

پروژه‌های جدید اکنون به‌طور پیش‌فرض از Kotlin DSL (build.gradle.kts) برای پیکربندی ساخت استفاده می‌کنند. این زبان در مقایسه با Groovy DSL (build.gradle) تجربه ویرایش بهتری با برجسته‌سازی دستورگان، تکمیل کد، و ناوبری به اظهارات ارائه می‌دهد. توجه داشته باشید که اگر از AGP 8.1 و Kotlin DSL برای پیکربندی ساخت استفاده می‌کنید، برای داشتن بهترین تجربه باید از Gradle 8.1 استفاده کنید. برای کسب اطلاعات بیشتر، راهنمای انتقال Kotlin DSL را ببینید.

پشتیبانی خودکار از زبان هر برنامه

از Android Studio Giraffe Canary 7 و AGP 8.1.0-alpha07، می‌توانید برنامه‌تان را پیکربندی کنید تا به‌طور خودکار از ترجیحات زبان هر برنامه پشتیبانی کند. براساس منابع پروژه شما، افزایه Android Gradle فایل LocaleConfig را تولید می‌کند و مرجعی به آن در فایل مانیفست نهایی اضافه می‌کند، بنابراین دیگر لازم نیست این کار را به‌صورت دستی انجام دهید. ‫AGP از منابع موجود در res پوشه واحدهای برنامه شما و هرگونه وابستگی واحد کتابخانه برای تعیین زبان‌های محلی که باید در فایل LocaleConfig گنجانده شود استفاده می‌کند.

توجه داشته باشید که ویژگی زبان خودکار برای هر برنامه از برنامه‌هایی که Android نسخه ۱۳ (سطح میانای برنامه‌سازی کاربردی ۳۳) یا بالاتر را اجرا می‌کنند پشتیبانی می‌کند. برای استفاده از این ویژگی، باید compileSdkVersion را روی ۳۳ یا بالاتر تنظیم کنید. برای پیکربندی اولویت‌های زبان برای هر برنامه در نسخه‌های قبلی Android، همچنان باید از میاناهای برنامه‌سازی کاربردی و انتخابگرهای زبان درون‌برنامه‌ای استفاده کنید.

برای فعال کردن پشتیبانی خودکار از زبان هر برنامه، منطقه زبانی پیش‌فرضی را مشخص کنید:

  1. در پوشه res واحد برنامه، فایل جدیدی به‌نام resources.properties ایجاد کنید.
  2. در فایل resources.properties، منطقه زبانی پیش‌فرض را با برچسب unqualifiedResLocale تنظیم کنید. برای تشکیل نام‌های بازار محلی، کد زبان را با کد اختیاری نوشتار و منطقه ترکیب کنید و هریک را با خط تیره از هم جدا کنید:

    • زبان: از کد دو یا سه حرفی ISO 639-1 استفاده کنید.
    • خط (اختیاری): از کد ISO 15924 استفاده کنید.
    • منطقه (اختیاری): از کد دوحرفی ISO 3166-1-alpha-2 یا کد سه‌رقمی UN_M.49 استفاده کنید.

    برای مثال، اگر منطقه زبانی پیش‌فرض شما انگلیسی امریکایی است:

        unqualifiedResLocale=en-US
        

‫AGP این بوم‌گرد پیش‌فرض و هر بوم‌گرد جایگزینی را که مشخص کرده‌اید، بااستفاده از values-* دایرکتوری در پوشه res، به فایل LocaleConfig تولیدشده خودکار اضافه می‌کند.

پشتیبانی خودکار از زبان هر برنامه به‌طور پیش‌فرض خاموش است. برای روشن کردن این ویژگی، از تنظیم generateLocaleConfig در بلوک androidResources {} فایل سطح ماژول build.gradle.kts (فایل build.gradle اگر از Groovy استفاده می‌کنید) استفاده کنید:

کاتلین

android {
  androidResources {
    generateLocaleConfig = true
  }
}

شیک

android {
  androidResources {
    generateLocaleConfig true
  }
}

‫Android Lint حاوی بایت‌کد هدف‌گیری JVM 17 است

از AGP 8.1.0-alpha04،‏ Android Lint شامل کدبایت هدف‌گیری JVM 17 است. اگر بررسی‌های سفارشی lint می‌نویسید، باید با JDK 17 یا بالاتر کامپایل کنید و jvmTarget = '17' را در گزینه‌های کامپایلر Kotlin مشخص کنید.

برای کسب اطلاعات بیشتر درباره ابزار lint، به بهبود کد با بررسی‌های lint مراجعه کنید.

تنظیم فشرده‌سازی کتابخانه مشترک C/C++ به DSL منتقل شد

از AGP 8.1.0-alpha10، اگر فشرده‌سازی کتابخانه مشترک C/C++ را بااستفاده از DSL به‌جای مانیفست پیکربندی نکنید، هشدار دریافت خواهید کرد. راهنمایی‌های زیر توضیح می‌دهد که چگونه پیکربندی خود را برای استفاده از DSL به‌روز کنید. برای دریافت کمک در انجام این به‌روزرسانی‌ها، از «دستیار ارتقای AGP» (ابزارها > دستیار ارتقای AGP) استفاده کنید.

برای استفاده از کتابخانه‌های مشترک C/C++ فشرده‌نشده، android::extractNativeLibs مشخصه را از مانیفست بردارید و کد زیر را به فایل build.gradle.kts سطح واحد (اگر از Groovy استفاده می‌کنید، فایل build.gradle) اضافه کنید:

کاتلین

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

شیک

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

پرچم‌های ساخت آزمایشی

این‌ها پرچم‌های آزمایشی برای پیکربندی ساخت شما است که در AGP 8.1 دردسترس است.

پرچم افزوده‌شده در مقدار پیش‌فرض یادداشت‌ها
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false فعال کردن این گزینه بدون مشخص کردن پیکربندی‌های امضا باعث می‌شود AGP هنگام اجرای ساخت قابل‌نمایه‌گذاری یا اشکال‌زدایی، از پیکربندی امضای اشکال‌زدایی پیش‌فرض استفاده کند. این پرچم به‌طور پیش‌فرض غیرفعال است تا نویسندگان ساخت را تشویق کند پیکربندی‌های امضای نمایه‌سازی خاصی را اعلام کنند.
android.experimental.library.desugarAndroidTest AGP 8.0 false این پرچم به سازندگان کتابخانه اجازه می‌دهد برای فایل‌های APK آزمایشی، بدون تأثیر گذاشتن بر AAR تولیدشده، برای مثال ازطریق linting، امکان تبدیل کتابخانه اصلی را فعال کنند. قصد داریم درنهایت از این رفتار در «میانای برنامه‌سازی کاربردی گونه» پشتیبانی کنیم.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false اگر فعال باشد، «دستگاه‌های مدیریت‌شده Gradle» به کاربر اجازه می‌دهد نوع دستگاه سفارشی تعریف‌شده توسط کاربر را ارائه کند که افزایه می‌تواند آن را ارائه دهد. اگر می‌خواهید از افزایه Firebase Test Lab استفاده کنید، باید این پرچم را فعال کنید.
android.lint.printStackTrace AGP 8.0 false اگر فعال باشد، Android lint درصورت ازکارافتادن، ردیابی پشته را چاپ می‌کند. این پرچم همان قابلیت‌های متغیر محیطی LINT_PRINT_STACKTRACE را دارد.
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 هیچ‌کدام حداکثر تعداد «دستگاه‌های مدیریت‌شده Gradle» هم‌زمان (AVD) را که در هر زمان می‌تواند فعال باشد مشخص می‌کند. اگر مقدار ۰ یا منفی باشد، حداکثر تعداد دستگاه وجود ندارد.
android.experimental.testOptions.installApkTimeout AGP 8.0 هیچ‌کدام مدت زمان مهلت نصب فایل APK برحسب ثانیه. اگر مقدار ۰ یا منفی باشد، UTP آن را روی مقدار پیش‌فرض تنظیم می‌کند.

مشکلات برطرف‌شده

افزایه Android Gradle نسخه ۸.۱.۴

مشکلات برطرف‌شده
افزایه Android Gradle
وقتی کلاس‌های پروژه‌های فرعی ازطریق تبدیل‌های آرتیفکت ازقبل dex شده‌اند، تکلیف dexing را روی آن‌ها اجرا نکنید

افزایه Android Gradle نسخه ۸.۱.۳

مشکلات برطرف‌شده
افزایه Android Gradle
[AGP 8.1.0] اگر هم splits.abi.isEnable و هم testOptions.unitTests.isIncludeAndroidResources درست باشند، ./gradlew test با پیام «Unable to find manifest output» (خروجی مانیفست پیدا نشد) ناموفق می‌شود
ساخت پس‌از به‌روزرسانی به AGP 8.1 ناموفق بود

افزایه Android Gradle نسخه ۸.۱.۲

مشکلات برطرف‌شده
افزایه Android Gradle
‫androidResources در واحد کتابخانه Android دردسترس نیست
[AGP 8.1.0] اگر هم splits.abi.isEnable و هم testOptions.unitTests.isIncludeAndroidResources درست باشند، ./gradlew test با پیام «Unable to find manifest output» (خروجی مانیفست پیدا نشد) ناموفق می‌شود
Shrinker (R8)
اگر بررسی‌های تهی بودن حذف شود، Kotlin 1.9 باعث می‌شود R8 لامبداهای Kotlin را ازبین ببرد
‫R8 برای play-services-measurement-21.3.0-runtime.jar با خطای «مقدار تعریف‌نشده‌ای درطول تدوین مشاهده شد» ناموفق بود

افزایه Android Gradle نسخه ۸.۱.۱

مشکلات برطرف‌شده
Dexer (D8)
‫Java 16 Records: equals(null)‏ NullPointerException را پرتاب می‌کند
Shrinker (R8)
java.lang.VerifyError: درستی‌سنج کلاس را رد کرد
وقتی از کتابخانه Apache POI استفاده می‌کنید، ساخت در :minifyReleaseWithR8 متوقف می‌شود
وقتی بهینه‌سازی r8 فعال باشد، فراخوانی رد می‌شود
NoClassDefFoundError برای java.lang.reflect.Executable

افزایه Android Gradle نسخه ۸.۱.۰

مشکلات برطرف‌شده
افزایه Android Gradle
مشکلات `com.android.build.gradle.tasks.ShaderCompile` با حافظه نهان پیکربندی
افزودن به منابع جاوا بااستفاده از «میاناهای برنامه‌سازی کاربردی» AGP باعث ازکارافتادن حافظه نهان پیکربندی می‌شود
‫[Android Studio : Flamingo | 2022.2.1 Canary 8] liblog.so در بسته APK قرار دارد
‫KGP مانیفست را درطول پیکربندی می‌خواند و با تغییر مانیفست، حافظه نهان پیکربندی را نامعتبر می‌کند
پیام هشدار ساخت نامفهوم است وقتی مشکل در مانیفست ادغام‌شده باشد
ارتقا به AGP 7.4 منجر به StackOverflowError می‌شود
‫ClassNotFoundException در ویژگی پویایی که مستقیماً به زیرپروژه کتابخانه Kotlin بستگی دارد
‫processDebugUnitTestManifest با جای‌بان‌های مانیفست برای گونه‌های آزمایشی ناموفق است
‫processDebugUnitTestManifest با جای‌بان‌های مانیفست برای گونه‌های آزمایشی ناموفق است
خصوصیت فضای نام احتمالاً متعلق به HasAndroidResources است
پیام «فایل‌های Gradle از آخرین همگام‌سازی پروژه تغییر کرده است» غیرفعال نمی‌شود
پیام «توصیه می‌کنیم از افزایه جدیدتر Android Gradle استفاده کنید» وقتی افزایه جدیدتری وجود ندارد
‫processDebugUnitTestManifest با جای‌بان‌های مانیفست برای گونه‌های آزمایشی ناموفق است
پرچم بولی برای غیرفعال کردن بررسی کیت توسعه نرم‌افزار در CheckAarMetadataTask
خطای ساخت به سطح میانای برنامه‌سازی کاربردی ۳۴ مربوط می‌شود که وجود ندارد
تنظیم زنجیره ابزار JVM بر مقدار targetCompatibility در JavaCompile تأثیر نمی‌گذارد
ورودی‌های deepLink ناوبری با دامنه‌های کاراکتر عام در مانیفست ادغام‌شده مشخصه `android:host` ندارند
وظیفه processDebugMainManifest از Android Gradle Plugin 8.1 ناموفق است
می‌توانیم AnalyticsRecordingTask را برداریم؟
محتوای output-metadata.json سازگار نیست
می‌توانیم AnalyticsRecordingTask را برداریم؟
محتوای output-metadata.json سازگار نیست
تنظیم زنجیره ابزار JVM بر مقدار targetCompatibility در JavaCompile تأثیر نمی‌گذارد
ورودی‌های deepLink ناوبری با دامنه‌های کاراکتر عام در مانیفست ادغام‌شده مشخصه `android:host` ندارند
وظیفه processDebugMainManifest از Android Gradle Plugin 8.1 ناموفق است
«استودیو Android» متغیر محیطی STUDIO_GRADLE_JDK را رعایت نمی‌کند
انواع منبع سفارشی باید مجموعه‌های منبع چندطعم ایجاد کنند
‫DependenciesInfoBuilder به به‌روزرسانی میانای برنامه‌سازی کاربردی + سند نیاز دارد
‫DexingNoClasspathTransform (minSdk >= 24) با هدف Java 11 به‌دلیل نبود اعضای تودرتو ناموفق است
‫DslExtension.Builder.extendProjectWith()‎ طبق شرح ارائه‌شده در Groovy کار نمی‌کند
افزودن میانای برنامه‌سازی کاربردی VariantSelector.withFlavor که از kotlin.Pair استفاده نمی‌کند
‫AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) به‌دلیل تغییر `proguard.txt` حافظه نهان ندارد
مانیفست ادغام‌شده برنامه حاوی ویژگی‌های extractNativeLibs و useEmbeddedDex از وابستگی‌ها است
AGP: مسیر ابزار AIDL و فایل AIDL چارچوب را به‌عنوان API عمومی آشکار می‌کند
درخواست: به IDE اجازه دهید راه‌حلی برای «PermittedSubclasses به ASM9 نیاز دارد» ارائه دهد
اشکال: «فعال کردن KSP و استفاده از پردازنده KSP برای این وابستگی به‌جای آن» فقط به یک وب‌سایت می‌رود
‫Gradle 8.1 به‌دلیل .gradle/.android/analytics.settings حافظه نهان پیکربندی را خراب می‌کند
‫generateLocaleConfig در agp 8.1.0 از ترتیب غیرقطعی استفاده می‌کند و ساخت‌های قابل‌تولید مجدد را خراب می‌کند
Dexer (D8)
پس‌از به‌روزرسانی‌های اخیر، برنامه به‌دلیل حذف قند از کتابخانه اصلی ازکار می‌افتد.
پس‌رفت agp 8.1.0 با API 21 - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
Lint
‫Lint فقط تبدیل‌های ایمن را برای میاناهای مستقیماً پیاده‌سازی‌شده بررسی می‌کند، نه میاناهای به‌ارث‌رسیده
‫Lint تبدیل‌های معتبر را برای گیرنده‌های تماس بررسی نمی‌کند
‫TypedArray#close (API 31) ساده‌سازی نشده است اما وقتی در try-with-resources استفاده می‌شود، AS هشدار نشان نمی‌دهد
اشکال: هشدار مثبت کاذب «ارائه‌دهنده BC منسوخ شده است و از Android P…»
مثبت کاذب Lint درباره «به‌خاطر سپردن» پس‌از ارتقا Kotlin به نسخه ۱.۸.۰
هشدار Lint مثبت کاذب برای بررسی‌های SDK_INT که در داخل روشی با پارامتر enum انجام می‌شود
بررسی لینت TypographyQuotes روی نقل‌قول‌های گریزکار کار نمی‌کند
بررسی لینت TrustAllX509TrustManager میاناهایی را که X509TrustManager را گسترش می‌دهند به‌اشتباه علامت‌گذاری می‌کند
قالب‌بندی مجدد فقط کد درج‌شده برای اصلاح جایگزینی
‫Lint: پیش‌نمایش هدف برای ReplaceStringQuickFix استثنا ایجاد می‌کند
Shrinker (R8)
‫VerifyError: درستی‌سنج کلاس را هنگام استفاده از R8 با Kotlin 1.8.20 رد کرد
‫R8 در AGP 8 سرویس Google Fit را ازکار می‌اندازد
اطلاعات فایل منبع شامل نام‌های باقیمانده‌ای که با نام‌های ورودی هم‌پوشانی دارند به‌درستی نمایش داده نمی‌شود
‫R8 درطول ساخت Compose با ArrayIndexOutOfBoundsException ناموفق بود
کد ساده مربوط به «سازنده رشته» در حالت انتشار یا debuggable=false فراخوانی دم برای افزودن را ازدست می‌دهد
مورد گوشه‌ای در روش VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()‎
نتایج dex-startup-optimization در java.lang.VerifyError: Rejecting class
خرابی با خطای «درستی‌سنجی» در Android 12 و نسخه‌های بالاتر