افزایه Android Gradle نسخه ۹.۰.۱ (ژانویه ۲۰۲۶)

افزایه Android Gradle نسخه ۹٫۰ یک نسخه اصلی است که تغییراتی در میانای برنامه‌سازی کاربردی و رفتار ایجاد می‌کند.

برای به‌روزرسانی به افزایه Android Gradle نسخه ۹.۰.۱، از دستیار ارتقا افزایه Android Gradle استفاده کنید. دستیار ارتقای AGP کمک می‌کند رفتارهای موجود هنگام ارتقای پروژه درصورت لزوم حفظ شود، بنابراین می‌توانید پروژه خود را برای استفاده از AGP 9.0 ارتقا دهید، حتی اگر آماده نباشید همه پیش‌فرض‌های جدید را در AGP 9.0 بپذیرید.

همچنین دو مهارت نماینده برای آسان‌تر کردن فرایند ارتقا دردسترس است. برای برنامه‌های غیر KMP، مهارت ارتقای AGP 9 را از مخزن مهارت‌های Android امتحان کنید. برای برنامه KMP، مهارت ارتقای AGP 9 از JetBrains را امتحان کنید. برای اطلاعات بیشتر درباره استفاده از مهارت‌ها در «استودیو Android»، به گسترش دادن «حالت عامل» با مهارت‌ها مراجعه کنید.

سازگاری

حداکثر سطح میانای برنامه‌سازی کاربردی که افزایه Android Gradle نسخه ۹.۰ پشتیبانی می‌کند سطح میانای برنامه‌سازی کاربردی ۳۶.۱ است. اطلاعات سازگاری دیگر در اینجا آمده است:

حداقل نسخه نسخه پیش‌فرض یادداشت‌ها
Gradle 9.1.0 9.1.0 برای کسب اطلاعات بیشتر، به به‌روزرسانی Gradle مراجعه کنید.
ابزارهای ساخت SDK ‫۳۶.۰.۰ ‫۳۶.۰.۰ نصب یا پیکربندی SDK Build Tools.
جعبه‌ابزار توسعه بومی موجود نیست 28.2.13676358 نسخه دیگری از NDK را نصب یا پیکربندی کنید.
JDK 17 17 برای کسب اطلاعات بیشتر، تنظیم نسخه JDK را ببینید.
افزایه Kotlin Gradle‏ (KGP) ‫۲.۲.۱۰ ‫۲.۲.۱۰ برای کسب اطلاعات بیشتر، وابستگی زمان اجرا به افزایه Kotlin Gradle را ببینید.

کلاس‌های android DSL اکنون فقط میاناهای عمومی جدید را پیاده‌سازی می‌کنند

طی چند سال گذشته، میاناهای جدیدی برای DSL و API خود معرفی کرده‌ایم تا بهتر بتوانیم کنترل کنیم کدام APIها عمومی هستند. نسخه‌های AGP 7.x و 8.x همچنان از انواع قدیمی DSL (برای مثال BaseExtension) استفاده می‌کردند که واسط‌های عمومی جدید را نیز پیاده‌سازی می‌کردند تا سازگاری با پیشرفت کار روی واسط‌ها حفظ شود.

‫AGP 9.0 منحصراً از میاناهای DSL جدید ما استفاده می‌کند، و پیاده‌سازی‌ها به انواع جدیدی تغییر کرده‌اند که کاملاً پنهان هستند. این کار دسترسی به میانای برنامه‌سازی کاربردی متغیر قدیمی و منسوخ‌شده را نیز برمی‌دارد.

برای به‌روزرسانی به AGP 9.0، ممکن است لازم باشد کارهای زیر را انجام دهید:

  • مطمئن شوید پروژه‌تان با Kotlin داخلی سازگار است: افزونه org.jetbrains.kotlin.android با DSL جدید سازگار نیست.
  • انتقال پروژه‌های KMP به افزونه کتابخانه Android Gradle برای KMP: استفاده از افزونه org.jetbrains.kotlin.multiplatform در همان زیرپروژه Gradle که افزونه‌های com.android.library و com.android.application در آن قرار دارند با DSL جدید سازگار نیست.

  • فایل‌های ساخت را به‌روز کنید: درحالی‌که هدف از تغییر میاناهای کاربری این است که DSL تا حد امکان مشابه باقی بماند، ممکن است تغییرات کوچکی وجود داشته باشد.

  • منطق ساخت سفارشی‌تان را به‌روز کنید تا به DSL و میانای برنامه‌سازی کاربردی جدید ارجاع دهد: هرگونه ارجاع به DSL داخلی را با میاناهای DSL عمومی جایگزین کنید. در بیشتر موارد، این جایگزینی یک‌به‌یک خواهد بود. هرگونه استفاده از applicationVariants و میاناهای برنامه‌سازی کاربردی مشابه را با androidComponents API جدید جایگزین کنید. این ممکن است پیچیده‌تر باشد، زیرا میانای برنامه‌سازی کاربردی androidComponents طوری طراحی شده است که پایدارتر باشد تا افزایه‌ها برای مدت طولانی‌تری سازگار بمانند. برای مشاهده نمونه‌ها، دستورالعمل‌های Gradle ما را بررسی کنید.

  • به‌روزرسانی افزایه‌های طرف سوم: برخی‌از افزایه‌های طرف سوم ممکن است همچنان به میاناهای برنامه‌سازی کاربردی یا میاناهایی وابسته باشند که دیگر دردسترس نیستند. به نسخه‌هایی از آن افزایه‌ها که با AGP 9.0 سازگار هستند مهاجرت کنید.

تغییر به میاناهای جدید DSL از استفاده افزایه‌ها و اسکریپت‌های ساخت Gradle از میاناهای برنامه‌سازی کاربردی منسوخ‌شده مختلف جلوگیری می‌کند، ازجمله:

میانای برنامه‌سازی کاربردی منسوخ‌شده در بلوک android عملکرد جایگزین
‫applicationVariants،
libraryVariants،
testVariants، و
unitTestVariants
نقاط افزونه برای افزایه‌ها جهت افزودن عملکرد جدید به AGP. این را با androidComponents.onVariants API جایگزین کنید، برای مثال:
androidComponents {
    onVariants() { variant ->
        variant.signingConfig
            .enableV1Signing.set(false)
    }
}
ممکن است جایگزین مستقیمی برای همه میاناهای برنامه‌سازی کاربردی قبلی وجود نداشته باشد. اگر مورد استفاده‌ای وجود دارد که میاناهای برنامه‌سازی کاربردی جدید متغیر آن را پوشش نمی‌دهند، مشکل را ثبت کنید.
variantFilter امکان غیرفعال کردن گونه‌های انتخاب‌شده را فراهم می‌کند. این را با androidComponents.beforeVariants API جایگزین کنید، برای مثال:
androidComponents {
    beforeVariants(
        selector()
            .withBuildType("debug")
            .withFlavor("color", "blue")
    ) { variantBuilder ->
        variantBuilder.enable = false
    }
  }
‫deviceProvider و
testServer
ثبت محیط‌های آزمایشی سفارشی برای اجرای آزمایش‌ها در دستگاه‌ها و شبیه‌سازهای Android. به دستگاه‌های تحت مدیریت Gradle بروید.
‫sdkDirectory،
ndkDirectory،
bootClasspath،
adbExecutable، و
adbExe
استفاده از مؤلفه‌های مختلف کیت توسعه نرم‌افزار Android برای تکالیف سفارشی. به androidComponents.sdkComponents بروید.
‫registerArtifactType،‏
registerBuildTypeSourceProvider،‏
registerProductFlavorSourceProvider،‏
registerJavaArtifact،‏
registerMultiFlavorSourceProvider، و
wrapJavaSourceSet
عملکرد منسوخ‌شده عمدتاً مربوط به مدیریت منابع تولیدشده در Android Studio است که در AGP 7.2.0 ازکار افتاده است. جایگزین مستقیمی برای این میاناهای برنامه‌سازی کاربردی وجود ندارد.
dexOptions تنظیمات منسوخ مربوط به ابزار dx که با d8 جایگزین شده است. هیچ‌کدام از تنظیمات از زمان افزایه Android Gradle نسخه ۷.۰ تأثیری نداشته‌اند. جایگزین مستقیمی وجود ندارد.
generatePureSplits تولید تقسیم‌های پیکربندی برای برنامه‌های فوری. قابلیت ارسال بخش‌های پیکربندی اکنون در بسته‌های ترکیبی برنامه Android تعبیه شده است.
aidlPackagedList فایل‌های AIDL برای بسته‌بندی در AAR برای نمایش آن به‌عنوان API برای کتابخانه‌ها و برنامه‌هایی که به این کتابخانه وابسته هستند. این مورد هنوز در LibraryExtension نمایان است اما در انواع دیگر افزونه‌ها نمایان نیست.

اگر به AGP 9.0 به‌روزرسانی کنید و پیام خطای زیر را ببینید، به این معنی است که پروژه شما هنوز به برخی‌از انواع قدیمی ارجاع می‌دهد:

java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension

اگر افزایه‌های شخص ثالث ناسازگار مانع شما می‌شوند، می‌توانید انصراف دهید و پیاده‌سازی‌های قدیمی را برای DSL و همچنین میانای برنامه‌نویسی کاربردی متغیر قدیمی برگردانید. درحین انجام این کار، میاناهای جدید نیز دردسترس هستند و همچنان می‌توانید منطق ساخت خود را به میانای برنامه‌سازی کاربردی جدید به‌روز کنید. برای انصراف دادن، این خط را در فایل gradle.properties خود اضافه کنید:

android.newDsl=false

یا برای انتقال تدریجی‌تر، AGP 9.4 به شما امکان می‌دهد از ماژول‌های فردی انصراف دهید. برای آشنایی با نحوه انجام این کار، انصراف از ماژول Variant API را ببینید.

کلاس‌های قبلی در AGP 9.0 به‌عنوان منسوخ علامت‌گذاری شده‌اند. این یعنی پروژه‌هایی که پرچم newDsl را غیرفعال می‌کنند، هشدارهای منسوخ شدن را خواهند دید، ازجمله در خود بلوک android.

همچنین می‌توانید قبل‌از ارتقا به AGP 9.0، ارتقا به میاناهای برنامه‌سازی کاربردی جدید را شروع کنید. میانا‌های جدید برای بسیاری از نسخه‌های AGP وجود داشته‌اند و بنابراین می‌توانید ترکیبی از جدید و قدیمی داشته باشید. اسناد مرجع AGP API سطح API را برای هر نسخه AGP و زمان اضافه شدن هر کلاس، روش، و فیلد نشان می‌دهد.

ما با نویسندگان افزایه‌های پرکاربرد تماس می‌گیریم تا به آن‌ها کمک کنیم افزایه‌هایی را که کاملاً با حالت‌های جدید سازگار هستند تطبیق دهند و منتشر کنند، و به بهبود «دستیار ارتقای AGP» در Android Studio ادامه خواهیم داد تا شما را در فرایند انتقال راهنمایی کنیم.

اگر متوجه شدید که DSL جدید یا Variant API فاقد قابلیت‌ها یا ویژگی‌هایی است، لطفاً در اسرع وقت مشکل را ثبت کنید.

Kotlin داخلی

افزایه Android Gradle نسخه ۹.۰ پشتیبانی داخلی Kotlin را معرفی می‌کند و آن را به‌طور پیش‌فرض فعال می‌کند. این یعنی دیگر لازم نیست افزونه org.jetbrains.kotlin.android (یا kotlin-android) را در فایل‌های ساخت خود اعمال کنید تا فایل‌های منبع Kotlin را کامپایل کنید. این کار ادغام Kotlin با AGP را ساده می‌کند، از استفاده از میاناهای برنامه‌سازی کاربردی منسوخ‌شده جلوگیری می‌کند، و در برخی موارد عملکرد را بهبود می‌بخشد.

بنابراین، وقتی پروژه‌تان را به AGP 9.0 ارتقا می‌دهید، باید به Kotlin داخلی منتقل شوید یا انصراف دهید.

همچنین می‌توانید پشتیبانی Kotlin داخلی را به‌طور انتخابی برای زیرپروژه‌های Gradle که منابع Kotlin ندارند غیرفعال کنید.

وابستگی زمان اجرا به افزایه Kotlin Gradle

برای ارائه پشتیبانی توکار Kotlin، افزایه Android Gradle نسخه ۹.۰ اکنون وابستگی زمان اجرا به افزایه Kotlin Gradle (KGP) نسخه ۲.۲.۱۰ دارد. یعنی دیگر لازم نیست نسخه KGP را اعلام کنید و اگر از نسخه KGP پایین‌تر از ۲.۲.۱۰ استفاده می‌کنید، Gradle به‌طور خودکار نسخه KGP شما را به ۲.۲.۱۰ ارتقا می‌دهد. به‌طور مشابه، اگر از نسخه KSP پایین‌تر از ۲.۲.۱۰-۲.۰.۲ استفاده می‌کنید، AGP آن را به ۲.۲.۱۰-۲.۰.۲ ارتقا می‌دهد تا با نسخه KGP مطابقت داشته باشد.

به نسخه بالاتر KGP ارتقا دهید

برای استفاده از نسخه بالاتر KGP یا KSP، موارد زیر را به فایل ساخت سطح بالای خود اضافه کنید:

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")

        // For KSP
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
    }
}

تنزل دادن به نسخه پایین‌تر KGP

فقط درصورتی می‌توانید نسخه KGP را تنزل دهید که از Kotlin داخلی انصراف داده باشید. دلیلش این است که AGP 9.0 به‌طور پیش‌فرض Kotlin داخلی را فعال می‌کند و Kotlin داخلی به KGP 2.2.10 یا بالاتر نیاز دارد.

برای استفاده از نسخه پایین‌تر KGP یا KSP، آن نسخه را در فایل ساخت سطح بالا بااستفاده از اعلامیه نسخه دقیق اعلام کنید:

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
            version { strictly("KGP_VERSION") }
        }

        // For KSP
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
            version { strictly("KSP_VERSION") }
        }
    }
}

توجه داشته باشید که حداقل نسخه KGP که می‌توانید به آن تنزل دهید نسخه ۲.۰.۰ است.

پشتیبانی IDE برای تست فیکسچرها

AGP 9.0 پشتیبانی کامل از IDE «استودیو Android» را برای تجهیزات آزمایشی به‌همراه دارد.

Fused Library Plugin

«افزونه کتابخانه ادغام‌شده» (پیش‌نمایش) به شما امکان می‌دهد چندین کتابخانه را به‌عنوان یک «کتابخانه Android»‏ AAR منتشر کنید. این کار می‌تواند باعث شود کاربران شما راحت‌تر به مصنوعات منتشرشده شما وابسته شوند.

برای اطلاعات درباره شروع به کار، به انتشار چند کتابخانه Android به‌عنوان یک کتابخانه با «کتابخانه ادغام‌شده» مراجعه کنید.

تغییرات رفتاری

افزایه Android Gradle نسخه ۹.۰ رفتارهای جدید زیر را دارد:

رفتار توصیه
افزایه Android Gradle نسخه ۹.۰ به‌طور پیش‌فرض از NDK نسخه r28c استفاده می‌کند. نسخه NDK را که می‌خواهید استفاده کنید به‌طور صریح مشخص کنید.
افزایه Android Gradle نسخه ۹.۰ به‌طور پیش‌فرض از مصرف‌کنندگان کتابخانه می‌خواهد از نسخه کیت توسعه نرم‌افزار کامپایل یکسان یا بالاتر استفاده کنند. هنگام استفاده از کتابخانه، از کیت توسعه نرم‌افزار کامپایل یکسان یا بالاتر استفاده کنید. اگر این کار امکان‌پذیر نیست یا می‌خواهید به مصرف‌کنندگان کتابخانه‌ای که منتشر می‌کنید زمان بیشتری برای جابه‌جایی بدهید، AarMetadata.minCompileSdk را به‌طور صریح تنظیم کنید.

‫AGP 9.0 شامل به‌روزرسانی‌هایی برای پیش‌فرض‌های ویژگی‌های Gradle زیر است. این گزینه به شما امکان می‌دهد هنگام ارتقا دادن، رفتار AGP 8.13 را حفظ کنید:

دارایی عملکرد تغییر از AGP 8.13 به AGP 9.0 توصیه
android.newDsl از میاناهای جدید DSL استفاده کنید، بدون اینکه پیاده‌سازی‌های قدیمی بلوک android را آشکار کنید.
این یعنی API متغیر قدیمی، مثل android.applicationVariants دیگر دردسترس نیست.
false ← true با تنظیم کردن android.newDsl=false می‌توانید انصراف دهید.
وقتی همه افزایه‌ها و منطق ساخت مورداستفاده پروژه‌تان سازگار شدند، انصراف را بردارید.
android.builtInKotlin Kotlin داخلی را فعال می‌کند false ← true به Kotlin داخلی منتقل شوید اگر می‌توانید یا انصراف دهید.
android.uniquePackageNames الزام می‌کند که هر کتابخانه نام بسته متمایزی داشته باشد. false ← true نام‌های بسته یکتا برای همه کتابخانه‌های درون پروژه‌تان مشخص کنید. اگر این کار ممکن نیست، می‌توانید این پرچم را درطول انتقال غیرفعال کنید.
android.useAndroidx به‌طور پیش‌فرض از وابستگی‌های androidx استفاده کنید. false ← true وابستگی‌های androidx را اتخاذ کنید.
android.default.androidx.test.runner آزمایش‌های درون‌دستگاهی را به‌طور پیش‌فرض با کلاس androidx.test.runner.AndroidJUnitRunner اجرا کنید و آن را جایگزین پیش‌فرض منسوخ‌شده InstrumentationTestRunner برای
android {
  defaultConfig {
    testInstrumentationRunner = "..."
  }
}
false ← true AndroidJUnitRunner را اتخاذ کنید، یا testInstrumentationRunner سفارشی‌تان را به‌طور صریح مشخص کنید.
android.dependency.useConstraints استفاده از محدودیت‌های وابستگی بین پیکربندی‌ها را کنترل می‌کند.
پیش‌فرض در AGP 9.0‏ false است که فقط از محدودیت‌ها در آزمایش‌های دستگاه برنامه (AndroidTest) استفاده می‌کند. تنظیم این مقدار روی true باعث بازگشت به رفتار نسخه ۸.۱۳ می‌شود.
true ← false از محدودیت‌های وابستگی در همه‌جا استفاده نکنید، مگراینکه به آن‌ها نیاز داشته باشید. پذیرفتن پیش‌فرض جدید این پرچم همچنین بهینه‌سازی‌هایی را در فرایند وارد کردن پروژه فعال می‌کند که باید زمان وارد کردن را برای ساخت‌هایی با زیرپروژه‌های کتابخانه Android متعدد کاهش دهد.
android.enableAppCompileTimeRClass کد را در برنامه‌ها دربرابر کلاس R غیرنهایی کامپایل کنید، و کامپایل برنامه را با کامپایل کتابخانه هم‌راستا کنید.
این کار افزایشی بودن را بهبود می‌بخشد و راه را برای بهینه‌سازی‌های عملکردی آینده در جریان پردازش منابع هموار می‌کند.
false ← true بسیاری از پروژه‌ها می‌توانند بدون تغییر منبع، رفتار جدید را اتخاذ کنند. اگر از فیلدهای کلاس R در جایی استفاده می‌شود که به ثابت نیاز دارد، مثلاً موارد سوئیچ، کد را بازسازی کنید تا از دستورهای if زنجیره‌ای استفاده شود.
android.sdk.defaultTargetSdkToCompileSdkIfUnset از نسخه کیت توسعه نرم‌افزار کامپایل به‌عنوان مقدار پیش‌فرض برای نسخه کیت توسعه نرم‌افزار هدف در برنامه‌ها و آزمایش‌ها استفاده می‌کند.
پیش‌از این تغییر، نسخه کیت توسعه نرم‌افزار هدف به‌طور پیش‌فرض روی حداقل نسخه کیت توسعه نرم‌افزار تنظیم می‌شد.
false ← true نسخه کیت توسعه نرم‌افزار هدف را به‌طور صریح برای برنامه‌ها و آزمایش‌ها مشخص کنید.
android.onlyEnableUnitTestForTheTestedBuildType فقط مؤلفه‌های آزمون واحد را برای نوع ساخت آزمایش‌شده ایجاد می‌کند.
در پروژه پیش‌فرض، این امر منجر به یک آزمایش واحد برای اشکال‌زدایی می‌شود، درحالی‌که رفتار قبلی این بود که آزمایش‌های واحد برای اشکال‌زدایی یا انتشار اجرا شوند.
false ← true اگر پروژه‌تان به اجرای آزمایش‌ها برای اشکال‌زدایی و انتشار نیاز ندارد، نیازی به تغییر نیست.
android.proguard.failOnMissingFiles اگر هرکدام از فایل‌های نگهداری مشخص‌شده در AGP DSL در دیسک وجود نداشته باشد، ساخت با خطا مواجه می‌شود. پیش‌از این تغییر، غلط‌های املایی در نام فایل‌ها باعث می‌شد فایل‌ها بدون اطلاع نادیده گرفته شوند. false ← true هرگونه اعلامیه نامعتبر فایل proguard را بردارید
android.r8.optimizedResourceShrinking به R8 اجازه می‌دهد با درنظر گرفتن کلاس‌ها و منابع Android باهم، منابع Android کمتری را نگه دارد. false ← true اگر قوانین نگهداری پروژه‌تان ازقبل کامل است، نیازی به تغییر نیست.
android.r8.strictFullModeForKeepRules به R8 اجازه می‌دهد با حفظ نکردن سازنده پیش‌فرض به‌طور ضمنی، هنگام حفظ کلاس، موارد کمتری را حفظ کند. یعنی -keep class A دیگر به‌معنای -keep class A { <init>(); }
نیست
false ← true اگر قوانین نگهداری پروژه‌تان ازقبل کامل است، نیازی به تغییر نیست.

در قوانین نگهداری پروژه‌تان، -keep class A را با -keep class A { <init>(); } جایگزین کنید تا در مواردی که نیاز دارید سازنده پیش‌فرض حفظ شود، این کار انجام شود.
android.defaults.buildfeatures.resvalues resValues را در همه زیرپروژه‌ها فعال می‌کند true ← false resValues را فقط در زیرپروژه‌هایی که به آن نیاز دارند فعال کنید با تنظیم موارد زیر در فایل‌های ساخت Gradle آن پروژه‌ها:
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders گردآوری سایه‌زن را در همه زیرپروژه‌ها فعال می‌کند true ← false با تنظیم موارد زیر در فایل‌های ساخت Gradle آن پروژه‌ها، کامپایل سایه‌زن را فقط در زیرپروژه‌هایی که حاوی سایه‌زن برای کامپایل شدن هستند فعال کنید:
android {
  buildFeatures {
    shaders = true
  }
}
android.r8.proguardAndroidTxt.disallowed در AGP 9.0،‏ getDefaultProguardFile() فقط از proguard-android-optimize.txt پشتیبانی می‌کند نه proguard-android.txt. این کار برای جلوگیری از استفاده تصادفی از پرچم ­dontoptimize است که در proguard-android.txt گنجانده شده است. false ← true اگر می‌خواهید از بهینه‌سازی اجتناب کنید، می‌توانید به‌طور صریح ­dontoptimize را در proguardFile سفارشی مشخص کنید و درکنار آن از proguard-android-optimize.txt استفاده کنید. درصورت امکان، حتماً پرچم ­dontoptimize را از این فایل بردارید، زیرا مزایای بهینه‌سازی R8 را کاهش می‌دهد. اگر نه، با تنظیم android.r8.globalOptionsInConsumerRules.disallowed=false انصراف دهید.
android.r8.globalOptionsInConsumerRules.disallowed از AGP 9.0، اگر فایل‌های نگهداری مصرف‌کننده حاوی پیکربندی‌های Proguard مشکل‌ساز باشد، انتشار کتابخانه Android و واحد ویژگی ناموفق خواهد بود. فایل‌های Consumer keep که شامل گزینه‌های سراسری مانند ­dontoptimize یا ­dontobfuscate هستند فقط باید در پیمانه‌های برنامه استفاده شوند و می‌توانند مزایای بهینه‌سازی را برای کاربران کتابخانه کاهش دهند. اگر چنین گزینه‌های سراسری‌ای در وابستگی ازپیش کامپایل‌شده (JAR یا AAR) جاسازی شده باشد، کامپایل کردن ماژول برنامه Android بدون اطلاع دادن به کاربر از آن‌ها صرف‌نظر خواهد کرد. با بررسی configuration.txt (معمولاً در مسیری مانند <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) برای نظراتی مانند: # REMOVED CONSUMER RULE: ­dontoptimize می‌توانید ببینید چه زمانی این اتفاق می‌افتد. false ← true کتابخانه‌های منتشرشده باید هرگونه قانون ناسازگار را حذف کنند. کتابخانه‌های داخلی باید هرگونه قانون ناسازگار اما الزامی را به proguardFile در یک ماژول برنامه منتقل کنند. با تنظیم android.r8.globalOptionsInConsumerRules.disallowed=false انصراف دهید. وقتی همه فایل‌های Keep مصرف‌کننده شما سازگار شدند، انصراف را بردارید.
android.sourceset.disallowProvider ارائه‌دهندگان عبور برای منابع تولیدشده بااستفاده از AndroidSourceSet DSL مجاز نیستند. false ← true از Sources API در androidComponents برای ثبت منابع تولیدشده استفاده کنید.
android.custom.shader.path.required اگر کامپایلر سایه‌زن فعال باشد، لازم است مسیر کامپایلر سایه‌زن به‌طور صریح در local.properties تنظیم شود. false ← true glslc.dir=/path/to/shader-tools را به local.properties پروژه‌تان اضافه کنید.

ویژگی‌های برداشته‌شده

افزایه Android Gradle نسخه ۹.۰ عملکرد زیر را حذف می‌کند:

  • پشتیبانی از برنامه Wear OS جاسازی‌شده
    AGP 9.0 پشتیبانی از جاسازی برنامه‌های Wear OS را که دیگر در Play پشتیبانی نمی‌شود برمی‌دارد. این شامل برداشتن پیکربندی‌های wearApp و AndroidSourceSet.wearAppConfigurationName DSL می‌شود. برای آشنایی با نحوه انتشار برنامه در Wear OS، توزیع در Wear OS را ببینید.
  • androidDependencies و sourceSets تکلیف را گزارش کردند
  • پشتیبانی از APK جداشده براساس تراکم
    AGP 9.0 پشتیبانی از ایجاد APK جداشده براساس تراکم صفحه‌نمایش را حذف می‌کند. عملکرد و میاناهای برنامه‌سازی کاربردی مرتبط برداشته شده‌اند. برای تقسیم کردن APK براساس تراکم صفحه‌نمایش بااستفاده از AGP نسخه ۹.۰ یا بالاتر، از دسته‌های برنامه استفاده کنید.

‫DSL تغییریافته

افزایه Android Gradle نسخه ۹.۰ تغییرات DSL شکننده زیر را دارد:

  • پارامترسازی CommonExtension برداشته شده است.

    این به‌خودی‌خود فقط یک تغییر مخرب در سطح منبع است که کمک می‌کند از تغییرات مخرب در سطح منبع در آینده جلوگیری شود، اما همچنین به این معنی است که روش‌های مسدود کردن باید از CommonExtension به ApplicationExtension،‏ LibraryExtension، DynamicFeatureExtension، و TestExtension منتقل شوند.

    هنگام ارتقا دادن پروژه به AGP 9.0، کد افزایه Gradle را که از آن پارامترها یا روش‌های بلوک استفاده می‌کند بازسازی کنید. برای مثال، افزونه زیر به‌روزرسانی شده است تا پارامتر نوع را بردارد و به روش‌های بلوک برداشته‌شده متکی نباشد:

    AGP 8.13

    val commonExtension: CommonExtension<*, *, *, *, *, *> =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig {
            minSdk {
                version = release(28)
            }
        }
    }
    

    AGP 9.0

    val commonExtension: CommonExtension =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig.apply {
            minSdk {
                version = release(28)
            }
        }
    }
    

    برای افزایه‌هایی که طیفی از نسخه‌های AGP را هدف قرار می‌دهند، استفاده مستقیم از getter با نسخه‌های AGP پایین‌تر از ۹.۰ سازگاری دودویی دارد.

‫DSL برداشته‌شده

افزایه Android Gradle نسخه ۹.۰ موارد زیر را برمی‌دارد:

میاناهای برنامه‌سازی کاربردی برداشته‌شده

افزایه Android Gradle نسخه ۹.۰ موارد زیر را برمی‌دارد:

ویژگی‌های Gradle برداشته شد

ویژگی‌های Gradle زیر در ابتدا به‌عنوان روش‌هایی برای غیرفعال کردن سراسری ویژگی‌هایی که به‌طور پیش‌فرض فعال بودند اضافه شدند.

این ویژگی‌ها از AGP 8.0 یا پایین‌تر به‌طور پیش‌فرض غیرفعال شده‌اند. برای ساخت کارآمدتر، این ویژگی‌ها را فقط در زیرپروژه‌هایی که از آن‌ها استفاده می‌کنند فعال کنید.

دارایی عملکرد جایگزین
android.defaults.buildfeatures.aidl کامپایل AIDL را در همه زیرپروژه‌ها فعال می‌کند با تنظیم کردن ویژگی زیر در فایل‌های ساخت Gradle آن پروژه‌ها، کامپایل AIDL را فقط در زیرپروژه‌هایی که منابع AIDL دارند فعال کنید:
android {
  buildFeatures {
    aidl = true
  }
}
در فایل ساخت Gradle هر زیرپروژه حاوی منابع AIDL
android.defaults.buildfeatures.renderscript کامپایل RenderScript را در همه زیرپروژه‌ها فعال می‌کند با تنظیم کردن ویژگی زیر در فایل‌های ساخت Gradle آن پروژه‌ها، کامپایل renderscript را فقط در زیرپروژه‌هایی فعال کنید که منابع renderscript در آن‌ها وجود دارد:
android {
  buildFeatures {
    renderScript = true
  }
}

ویژگی‌های Gradle اعمال‌شده

اگر ویژگی‌های Gradle زیر را تنظیم کنید، AGP 9.0 خطا می‌دهد.

دستیار ارتقای افزایه Android Gradle پروژه‌هایی را که از این ویژگی‌ها استفاده می‌کنند به AGP 9.0 ارتقا نخواهد داد.

دارایی عملکرد
android.r8.integratedResourceShrinking کاهش منابع اکنون همیشه به‌عنوان بخشی از R8 اجرا می‌شود، پیاده‌سازی قبلی برداشته شده است.
android.enableNewResourceShrinker.preciseShrinking کاهش منابع اکنون همیشه از کاهش دقیق منابع استفاده می‌کند که امکان حذف موارد بیشتری را فراهم می‌کند.

تغییرات R8

تغییرات R8 زیر در AGP 9.0.0 گنجانده شده است.

گزینه پیکربندی جدید -processkotlinnullchecks

گزینه جدید R8 -processkotlinnullchecks را برای پیکربندی R8 برای پردازش بررسی‌های Kotlin null اضافه کرده‌ایم. این گزینه متغیر مستقل اجباری‌ای دارد که باید یکی از این سه مقدار باشد: keep، remove_message، و remove. این گزینه بررسی‌های تهی زیر را که توسط کامپایلر Kotlin اضافه شده است پردازش می‌کند:

class kotlin.jvm.internal.Intrinsics {
  void checkNotNull(java.lang.Object);
  void checkNotNull(java.lang.Object, java.lang.String);
  void checkExpressionValueIsNotNull(
      java.lang.Object, java.lang.String);
  void checkNotNullExpressionValue(
      java.lang.Object, java.lang.String);
  void checkReturnedValueIsNotNull(
      java.lang.Object, java.lang.String);
  void checkReturnedValueIsNotNull(
      java.lang.Object, java.lang.String, java.lang.String);
  void checkFieldIsNotNull(java.lang.Object, java.lang.String);
  void checkFieldIsNotNull(
      java.lang.Object, java.lang.String, java.lang.String);
  void checkParameterIsNotNull(java.lang.Object, java.lang.String);
  void checkNotNullParameter(java.lang.Object, java.lang.String);
}

مقادیر گزینه، که از ضعیف‌ترین به قوی‌ترین مرتب شده‌اند، تأثیر زیر را دارند:

  • keep بررسی‌ها را تغییر نمی‌دهد.
  • remove_message هر فراخوانی روش بررسی را به فراخوانی getClass() در اولین آرگومان فراخوانی بازنویسی می‌کند (به‌طور مؤثر بررسی null را حفظ می‌کند، اما بدون هیچ پیامی).
  • ‫remove بررسی‌ها را کاملاً برمی‌دارد.

به‌طور پیش‌فرض، R8 از remove_message استفاده می‌کند. هرگونه مشخصات -processkotlinnullchecks آن را لغو خواهد کرد. اگر چندین بار مشخص شده باشد، از قوی‌ترین مقدار استفاده می‌شود.

Stop propagating keep info to companion methods

وقتی قوانین نگهداری با روش‌های میانای مشمول شکرزدایی مطابقت داشته باشند، R8 قبلاً به‌طور داخلی بیت‌های مجاز نبودن بهینه‌سازی و مجاز نبودن کوچک‌سازی را به روش‌های همراه ترکیبی منتقل می‌کرد.

از AGP 9.0، قوانین نگهداری دیگر برای روش‌های همراه اعمال نمی‌شود. این با این واقعیت مطابقت دارد که قوانین حفظ برای سایر فیلدها/روش‌ها/کلاس‌های ترکیب‌شده توسط کامپایلر قابل‌اعمال نیستند.

با انتقال بیت‌های غیرمجاز کردن بهینه‌سازی و غیرمجاز کردن کوچک کردن به روش‌های همراه، قبلاً از مورد استفاده زیر پشتیبانی می‌شد:

  1. کتابخانه‌ای با default/static/private روش میانای DEX با minSdk < 24 و قوانینی که روش‌های میانای را حفظ می‌کنند کامپایل کنید.
  2. برنامه‌ای را با کتابخانه در classpath و -applymapping کامپایل کنید.
  3. برنامه و کتابخانه را ادغام کنید.

توجه داشته باشید که این فقط با -applymapping کار می‌کند زیرا بیت disallow obfuscation به روش‌های همراه منتقل نمی‌شود—یعنی کلاس‌های همراه تولیدشده از مرحله ۱ نام‌های روش مبهم‌شده خواهند داشت.

ازاین‌پس، این مورد استفاده دیگر برای minSdk < ۲۴ پشتیبانی نمی‌شود. راه حل موقت این است که کارهای زیر را انجام دهید:

  1. Desugar the library with default/static/private interface methods to class files with minSdk < 24.
  2. مصنوع شکرزدایی‌شده را بااستفاده از R8 و قوانینی که روش‌های میانای کلاس‌های همراه را حفظ می‌کنند کامپایل کنید.
  3. برنامه را با کتابخانه در classpath کامپایل کنید.
  4. برنامه و داده‌های شکرزدایی‌شده را ادغام کنید.

عوارض جانبی دیگر این است که دیگر نمی‌توان ویژگی‌های کلاس داخلی و روش محصورکننده را برای کلاس‌های ناشناس و محلی در روش‌های همراه میانای Kotlin نگه داشت.

تغییر فایل منبع منتشرشده پیش‌فرض به r8-map-id-<MAP_ID>

این تغییر از نسخه ۸.۱۲.۰ در AGP اعمال شده است.

وقتی ردیابی مجدد لازم باشد (یعنی وقتی مبهم‌سازی یا بهینه‌سازی فعال باشد)، مشخصه فایل منبع صادرشده پیش‌فرض برای کلاس از SourceFile به r8-map-id-<MAP_ID> تغییر می‌کند.

با داشتن رد پشته مبهم، مشخصه فایل منبع جدید امکان استخراج شناسه فایل نگاشت موردنیاز برای ردیابی مجدد را فراهم می‌کند، که می‌تواند برای پشتیبانی از ردیابی مجدد خودکار رد پشته‌ها در Logcat استفاده شود.

اگر از مشخصه فایل منبع سفارشی استفاده شود (-renamesourcefileattribute) این مشخصه فایل منبع سفارشی همچنان اولویت دارد.

در حالت سازگاری ProGuard (وقتی gradle.properties حاوی android.enableR8.fullMode=false باشد)، انتشار مشخصه فایل منبع r8-map-id-<MAP_ID> فقط درصورتی اعمال می‌شود که مشخصه SourceFile حفظ نشده باشد. برنامه‌هایی که از حالت سازگاری ProGuard استفاده می‌کنند و می‌خواهند شناسه فایل نگاشت را در رد پشته خود اضافه کنند باید -keepattributes SourceFile را بردارند (یا به حالت کامل R8 مهاجرت کنند).

شناسه نقشه استفاده‌شده در r8-map-id-<MAP_ID> درهم‌ساز کامل نقشه است و پیشوند ۷ نویسه‌ای درهم‌ساز نقشه نیست که قبلاً استفاده می‌شد.

فعال کردن استفاده از نام‌های مصنوعی کوچک‌شده در شکرزدایی L8

نام کلاس‌های مصنوعی تولیدشده توسط D8 معمولاً حاوی رشته فرعی $$ExternalSynthetic است که به شما می‌گوید این کلاس مصنوعی توسط D8 تولید شده است. علاوه‌براین، نام مصنوعی نوع مصنوعی را نیز کدگذاری می‌کند (برای مثال، Backport، Lambda). این امر تأثیر منفی بر اندازه DEX حاصل دارد، زیرا نام‌های کلاس فضای بیشتری را در استخر رشته اشغال می‌کنند.

AGP 9.0‏ L8 (شکرزدایی کتابخانه اصلی) را پیکربندی می‌کند تا فایل DEX حاوی همه کلاس‌های j$ از قالب نام کلاس کوتاه‌شده جدیدی برای کلاس‌های مصنوعی استفاده کند. نام کلاس جدید از شناسه عددی (برای مثال، $1) استفاده می‌کند.

برداشتن پشتیبانی برای -addconfigurationdebugging

AGP 9.0 پشتیبانی از -addconfigurationdebugging را برمی‌دارد. اکنون اگر از پرچم استفاده شود، کامپایلر هشدار می‌دهد.

برداشتن پشتیبانی از تولید قوانین L8 از D8/R8

این تغییر فقط برای توسعه‌دهندگانی که مستقیماً از خط فرمان D8/R8 یا میاناهای برنامه‌سازی کاربردی استفاده می‌کنند مربوط است.

R8 9.0 پشتیبانی از تولید قوانین حفظ برای L8 از D8 و R8 را حذف می‌کند. درعوض باید از TraceReferences برای این منظور استفاده کنید.

به‌طور دقیق‌تر، روش‌های D8Command.builder.setDesugaredLibraryKeepRuleConsumer و R8Command.Builder.setDesugaredLibraryKeepRuleConsumer برداشته شده‌اند و پشتیبانی از --desugared-lib-pg-conf-output از گزینه‌های خط فرمان D8 و R8 برداشته شده است.

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

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

مشکلات برطرف‌شده
افزایه Android Gradle
درخواست ویژگی: تزریق نسخه AGP ایده‌آل به‌عنوان ویژگی
لرزش‌گیری SingleArtifact.VERSION_CONTROL_INFO_FILE
خروجی logcat مربوط به androidTest connectedCheck خراب است
پشتیبانی داخلی Kotlin در AGP نباید با مجموعه‌های منبع Kotlin همگام‌سازی شود
missingDimensionStrategy نوعی را ترجیح می‌دهد که با نام خودش مطابقت داشته باشد، حتی از بُعدی نامرتبط
پشتیبانی داخلی Kotlin در AGP نباید با مجموعه‌های منبع Kotlin همگام‌سازی شود
AGP 9.0.0-rc01 کتابخانه‌های Kotlin را ازطریق تابع kotlin()‎ حل‌وفصل نمی‌کند
Built-in-kotlin does not publish kotlin-stdlib dependency constraint in maven pom
افزودن چارچوب تست برای واگرایی بین compileSdk و targetSdk
مقدار resConfigs خالی منجر به خطای مبهم aapt می‌شود
Pure Java project have dependency on kotlin stdlib.
برداشتن ویژگی‌های منسوخ‌شده KotlinMultiplatformAndroidCompilationBuilder در AGP 9.0
`com.android.tools.build:gradle:9.0.0-alpha05` should have an api dependency on KGP and gradle-api
تغییر نام افزایه com.android.experimental.built-in-kotlin Gradle
‫AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` is not working
بررسی‌های فراداده Aar در کامپایل Sdk از DSL قدیمی استفاده می‌کند
برداشتن ویژگی منسوخ‌شده `com.android.build.api.dsl.ManagedDevices.devices`
پشتیبانی داخلی Kotlin در AGP نباید با مجموعه‌های منبع Kotlin همگام‌سازی شود
اگر فایل نگهداری مصرف‌کننده حاوی -dontobfuscate باشد، انتشار کتابخانه Android ناموفق خواهد بود
هیچ گزینه‌ای برای چاپ نگاشت منابع بهینه‌سازی‌شده وجود ندارد
Make it an error to call finalizeDsl after this phase has been passed
AGP پیکربندی jetifier را حتی وقتی jetifier غیرفعال است مقداردهی اولیه می‌کند
built in kotlin does not add kotlinStdlib as a compile time dependency when `kotlin.stdlib.default.dependency` is true to module and pom files
DSL بهینه‌سازی جدید به‌طور پیش‌فرض configuration.txt ایجاد نمی‌کند
AGP 8.13.0 نمی‌تواند نمودار پیمایش را در یک واحد درستی‌سنجی کند
AGP از Gradle API منسوخ‌شده استفاده می‌کند: نماد چندرشته‌ای
هشدار به کاربرانی که سعی می‌کنند از کتابخانه مولتی‌دکس قدیمی با minSdkVersion >=21 استفاده کنند
اگر تکالیف تولید کد وجود داشته باشد، ساخت ناموفق خواهد بود
با `android.builtInKotlin=false` و `android.newDsl=false` و `android.enableLegacyVariantApi=false` استفاده از افزایه `kotlin-android` با خطای «API 'applicationVariants' is obsolete» مواجه خواهد شد
وقتی kotlin.stdlib.default.dependency=false باشد، Kotlin داخلی نمی‌تواند kotlin-stdlib بدون نسخه را حل کند
DexData فایلی را بدون بستن باز می‌کند و مانع پاک‌سازی می‌شود
AndroidSourceDirectorySet باید در AGP 9.0 از گسترش PatternFilterable جلوگیری کند
خطای Test Fixture در ماژول‌های فقط آزمایشی
خطای نادرست هنگام استفاده از گیرنده‌های بافت در ابزارهای آزمایشی
خطاهای IDE نادرست برای کد Kotlin در testFixtures
افزونه `legacy-kapt` برخلاف `kotlin-kapt` از پردازش حاشیه‌نویسی صرف‌نظر می‌کند
‫compileSdkSpec.minorApiLevel با SettingsExtension کار نمی‌کند
[fused lib - public] Generated fused library does not include sources
‫extractNativeLibs و useEmbeddedDex نباید از مانیفست بیایند
هشدارهای R8 در AGP 9.0.0-alpha09
برداشتن AndroidSourceSet.jni منسوخ‌شده در AGP 9.0
برداشتن Installation.installOptions() در AGP 9.0
BuildType.isRenderscriptDebuggable در AGP 9.0 برداشته شد.
برداشتن android.defaults.buildfeatures.renderscript
`com.android.kotlin.multiplatform.library` با «دستگاه‌های تحت مدیریت Gradle» ازکار می‌افتد
برداشتن پرچم‌های gradle.properties پیش‌فرض `android.defaults.buildfeatures.aidl`
ناموفق بودن ساخت وقتی فایل proguard وجود ندارد
remove buildconfig defaults gradle.properties flags
مقدار پیش‌فرض targetSdk برنامه را تغییر دهید تا به‌جای minSdk براساس compileSdk باشد
وقتی `isIncludeAndroidResources` فعال باشد، `process{Variant}UnitTestManifest` نمی‌تواند کاربردهای tools:overrideLibrary را در AGP 8.12.0 ادغام کند
AGP باعث ایجاد هشدارهای منسوخ شدن در Gradle برای تکالیف آزمایشی JVM می‌شود
DependencyReportTask با حافظه نهان پیکربندی ناسازگار است
تغییر نسخه پیش‌فرض منبع/هدف Java از Java 8 به Java 11 در AGP 9.0
تغییر پیش‌فرض android.useAndroidX به true
استثنای بهتر هنگام اعمال افزونه kapt با Kotlin داخلی.
‫android.proguard.failOnMissingFiles برای consumerProguardFiles کار نمی‌کند
به‌روزرسانی وابستگی افزایه Kotlin Gradle به ۲.۲.۱۰
ایجاد KotlinJvmAndroidCompilation بااستفاده از KGP API
حالت Kotlin explicit API برای منابع آزمایشی اعمال شد
Lint
AGP 8.11.0: lintAnalyzeRelease task crashes when applying .gradle.kts files with apply(from = "...")
بررسی Lint ChecksSdkIntAtLeast بررسی نمی‌کند که آیا مقدار حاشیه‌نویسی‌شده صحیح است یا نه
Kotlin داخلی .kotlin_module را به META-INF اضافه نمی‌کند
مسیر کلاس Lint حاوی کلاس‌های تکراری در نسخه‌های مختلف است
راهکار جایگزین کردن منابع خصوصی کار نمی‌کند (tools:override = "true")
Bug: removal of unused resources doesn't also remove the translations of them, and doesn't ask about it either
‫Lint هشدار «Could not clean up K2 caches» (حافظه پنهان K2 پاک نشد) را نشان می‌دهد
‫Lint هشدار «Could not clean up K2 caches» (حافظه پنهان K2 پاک نشد) را نشان می‌دهد
Lint Integration
AndroidLintAnalysisTask cache misses across different JDK vendors or minor versions due to systemPropertyInputs.javaVersion differences
Lint automatically uses latest installed SDK despite compileSdk, doesn't register as task input and breaks caching
Shrinker (R8)
اگر از شناسه‌های منبع نهایی استفاده شود، کاهش منابع بهینه‌سازی‌شده R8 بدون اطلاع‌رسانی ناموفق می‌شود