پلاگین Android Gradle 8.1.0 (ژوئیه 2023)

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

سازگاری

حداقل نسخه نسخه پیش‌فرض یادداشت‌ها
گرادل ۸.۰ ۸.۰ برای کسب اطلاعات بیشتر، به به‌روزرسانی Gradle مراجعه کنید.
ابزارهای ساخت SDK ۳۳.۰.۱ ۳۳.۰.۱ ابزارهای ساخت SDK را نصب یا پیکربندی کنید .
ان دی کی ناموجود ۲۵.۱.۸۹۳۷۳۹۳ نسخه دیگری از NDK را نصب یا پیکربندی کنید .
جی‌دی‌کی ۱۷ ۱۷ برای کسب اطلاعات بیشتر، به تنظیم نسخه JDK مراجعه کنید.

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

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

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

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

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

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

  1. در پوشه res ماژول app، یک فایل جدید به نام 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
  }
}

Lint اندروید حاوی بایت‌کدهایی است که JVM نسخه ۱۷ را هدف قرار می‌دهند.

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

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

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

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

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

کاتلین

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

گرووی

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

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

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

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

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

افزونه اندروید گریدل ۸.۱.۴

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

افزونه اندروید گریدل ۸.۱.۳

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

افزونه اندروید گریدل ۸.۱.۲

مشکلات برطرف شده
افزونه گرادل اندروید
androidResources در ماژول کتابخانه اندروید موجود نیست
[AGP 8.1.0] اگر هر دو splits.abi.isEnable و testOptions.unitTests.isIncludeAndroidResources درست باشند، تست ./gradlew با پیام "Unable to find manifest output" با شکست مواجه می‌شود.
شرینکر (R8)
کاتلین ۱.۹ باعث می‌شود که اگر nullcheckها حذف شوند، لامبداهای کاتلین توسط R8 از بین بروند.
خطای R8 با عبارت "مقدار نامشخصی که هنگام کامپایل مشاهده شد" برای play-services-measurement-21.3.0-runtime.jar رخ می‌دهد.

افزونه اندروید گریدل ۸.۱.۱

مشکلات برطرف شده
دکسر (D8)
جاوا ۱۶ رکوردها: equals(null) throws NullPointerException
شرینکر (R8)
java.lang.VerifyError: کلاس تأییدکننده رد شد
هنگام استفاده از کتابخانه Apache POI، ساخت روی :minifyReleaseWithR8 گیر می‌کند
رد کردن فراخوانی هنگام فعال کردن r8 optimize
خطای NoClassDefFoundError برای java.lang.reflect.Executable

افزونه اندروید گریدل ۸.۱.۰

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