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

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

سازگاری

حداقل نسخه نسخه پیش فرض یادداشت ها
گریدل 8.0 8.0 برای کسب اطلاعات بیشتر، به روز رسانی Gradle را ببینید.
ابزارهای ساخت SDK 33.0.1 33.0.1 ابزارهای ساخت SDK را نصب یا پیکربندی کنید .
NDK N/A 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 برای بهترین تجربه استفاده کنید. برای کسب اطلاعات بیشتر، به راهنمای مهاجرت DSL Kotlin مراجعه کنید.

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

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

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

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

  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 در سطح ماژول استفاده کنید (اگر از Groovy استفاده می‌کنید فایل build.gradle ):

کاتلین

android {
  androidResources {
    generateLocaleConfig = true
  }
}

شیار

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android Lint حاوی بایت کدی است که JVM 17 را هدف قرار می دهد

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

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

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

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

برای استفاده از کتابخانه های بومی فشرده نشده، ویژگی 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 تولید شده، به عنوان مثال از طریق پرده‌سازی، فعال کنند. ما قصد داریم در نهایت از این رفتار در Variant API پشتیبانی کنیم.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false اگر فعال باشد، Gradle Managed Devices اجازه می دهد تا یک نوع دستگاه سفارشی تعریف شده توسط کاربر که می تواند توسط یک افزونه ارائه شود. اگر می‌خواهید از افزونه Firebase Test Lab استفاده کنید، این پرچم باید فعال باشد.
android.lint.printStackTrace AGP 8.0 false اگر فعال باشد، Android lint در صورت خرابی یک stacktrace چاپ می کند. این پرچم دارای همان قابلیت های متغیر محیطی LINT_PRINT_STACKTRACE است.
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 هیچ کدام حداکثر تعداد دستگاه‌های مدیریت‌شده Gradle (AVD) را برای فعال بودن در هر نقطه از زمان مشخص می‌کند. اگر مقدار 0 یا منفی باشد، حداکثر تعداد دستگاه وجود ندارد.
android.experimental.testOptions.installApkTimeout AGP 8.0 هیچ کدام مدت زمان وقفه در ثانیه برای نصب APK. اگر مقدار 0 یا منفی باشد، توسط UTP روی یک مقدار پیش فرض تنظیم می شود.

مسائل رفع شد

پلاگین اندروید Gradle 8.1.0

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

پلاگین اندروید Gradle 8.1.1

رفع مشکلات
دکسر (D8)
Java 16 Records: برابر (null) NullPointerException را پرتاب می کند
کوچک کننده (R8)
java.lang.VerifyError: تأییدکننده کلاس رد شد
هنگام استفاده از کتابخانه POI Apache، بیلد روی :minifyReleaseWithR8 گیر می کند
رد فراخوان هنگام فعال کردن r8 optimize
NoClassDefFoundError برای java.lang.reflect.Executable

پلاگین اندروید Gradle 8.1.2

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

پلاگین اندروید Gradle 8.1.3

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

پلاگین اندروید Gradle 8.1.4

مسائل ثابت
پلاگین اندروید Gradle
وقتی زیرپروژه‌ها قبلاً از طریق تبدیل مصنوعات dex'd شده‌اند، کار dexing را روی کلاس‌های زیر پروژه اجرا نکنید.