افزایه 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 API طوری طراحی شده است که پایدارتر باشد تا افزایه‌ها برای مدت طولانی‌تری سازگار بمانند. برای مشاهده نمونه‌ها، دستورالعمل‌های Gradle ما را بررسی کنید.

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

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

میانای برنامه‌سازی کاربردی منسوخ‌شده در بلوک android عملکرد جایگزین
‫applicationVariants،‏
libraryVariants،‏
testVariants، و
unitTestVariants
نقاط افزونه برای افزایه‌ها جهت افزودن عملکرد جدید به AGP. این را با میانای برنامه‌سازی کاربردی androidComponents.onVariants جایگزین کنید، برای مثال:
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 پشتیبانی کامل از محیط توسعه یکپارچه «استودیو 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 قدیمی variant، مثل 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 در جایی استفاده می‌شود که به ثابت نیاز دارد، مثلاً موارد switch، کد را بازسازی کنید تا از دستورهای 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 را هدف قرار می‌دهند، استفاده مستقیم از گیرنده با نسخه‌های AGP پایین‌تر از ۹.۰ سازگاری دودویی دارد.

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

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

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

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

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

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

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

دارایی عملکرد جایگزین
android.defaults.buildfeatures.aidl کامپایل کردن AIDL را در همه زیرپروژه‌ها فعال می‌کند کامپایل AIDL را فقط در زیرپروژه‌هایی که منابع AIDL دارند فعال کنید. برای این کار، ویژگی زیر را در فایل‌های ساخت Gradle آن پروژه‌ها تنظیم کنید:
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 آن را لغو خواهد کرد. اگر چندین بار مشخص شده باشد، از قوی‌ترین مقدار استفاده می‌شود.

توقف انتشار اطلاعات حفظ به روش‌های همراه

وقتی قوانین حفظ با روش‌های میانای مشمول شکرزدایی مطابقت داشته باشد، 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 به‌عنوان ویژگی
Stabilize SingleArtifact.VERSION_CONTROL_INFO_FILE
برونداد androidTest connectedCheck logcat خراب است
پشتیبانی Kotlin داخلی در AGP نباید با مجموعه‌های منبع Kotlin همگام‌سازی شود
missingDimensionStrategy طعمی را ترجیح می‌دهد که با نام خودش مطابقت داشته باشد، حتی از بُعدی نامرتبط
پشتیبانی Kotlin داخلی در AGP نباید با مجموعه‌های منبع Kotlin همگام‌سازی شود
AGP 9.0.0-rc01 کتابخانه‌های Kotlin را ازطریق تابع kotlin()‎ حل‌وفصل نمی‌کند
Built-in-kotlin محدودیت وابستگی kotlin-stdlib را در maven pom منتشر نمی‌کند
افزودن چارچوب تست برای واگرایی بین compileSdk و targetSdk
مقدار resConfigs خالی منجر به خطای مبهم aapt می‌شود
پروژه Pure Java به 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 منسوخ‌شده استفاده می‌کند: نماد چندرشته‌ای
هشدار به کاربرانی که سعی می‌کنند از کتابخانه قدیمی multidex با minSdkVersion >=21 استفاده کنند
اگر تکالیف تولید کد وجود داشته باشد، ساخت ناموفق خواهد بود
با `android.builtInKotlin=false` و `android.newDsl=false` و `android.enableLegacyVariantApi=false` استفاده از افزایه `kotlin-android` با خطای «میانای برنامه‌سازی کاربردی applicationVariants منسوخ شده است» مواجه خواهد شد
وقتی 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")
اشکال: برداشتن منابع استفاده‌نشده ترجمه‌های آن‌ها را برنمی‌دارد و درباره آن هم نمی‌پرسد
‫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 به‌طور خودکار از جدیدترین SDK نصب‌شده استفاده می‌کند، بااینکه compileSdk به‌عنوان ورودی تکلیف ثبت نمی‌شود و ذخیره‌سازی مؤقت را خراب می‌کند
Shrinker (R8)
اگر از شناسه‌های منبع نهایی استفاده شود، کاهش منابع بهینه‌سازی‌شده R8 بدون اطلاع‌رسانی ناموفق می‌شود