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

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

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

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

سازگاری

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

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

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

طی چند سال گذشته، ما واسط‌های جدیدی برای DSL و API خود معرفی کرده‌ایم تا بهتر کنترل کنیم کدام APIها عمومی هستند. نسخه‌های AGP ‫۷.x و ۸.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 و API جدید ارجاع دهد: هرگونه ارجاع به DSL داخلی را با واسط‌های DSL عمومی جایگزین کنید. در اکثر موارد، این جایگزینی یک‌به‌یک خواهد بود. هرگونه استفاده از applicationVariants و میاناهای برنامه‌سازی کاربردی مشابه را با میانای برنامه‌سازی کاربردی androidComponents جدید جایگزین کنید. این کار ممکن است پیچیده‌تر باشد، زیرا 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 «میانای برنامه‌سازی کاربردی» جایگزین کنید، برای نمونه:
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 7.0 تأثیری نداشته‌اند. جایگزین مستقیمی وجود ندارد.
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 و همچنین API گونه قدیمی دریافت کنید. درحین انجام این کار، میاناهای جدید نیز دردسترس هستند و همچنان می‌توانید منطق ساخت خود را به API جدید به‌روز کنید. برای انصراف دادن، این خط را در فایل gradle.properties خود اضافه کنید:

android.newDsl=false

یا برای انتقال تدریجی‌تر، AGP 9.4 به شما امکان می‌دهد از ماژول‌های جداگانه انصراف دهید. برای آشنایی با نحوه انجام این کار، به انصراف از واحد «میانای برنامه‌سازی کاربردی گونه» مراجعه کنید.

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

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

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

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

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 پایین‌تر از 2.2.10-2.0.2 استفاده کنید، AGP آن را به 2.2.10-2.0.2 ارتقا می‌دهد تا با نسخه 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

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

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

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

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

رفتار توصیه
افزایه Android Gradle نسخه ۹.۰ به‌طور پیش‌فرض از نسخه 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 در هر جایی که به ثابت نیاز دارد استفاده شود، مثل موارد switch، برای استفاده از دستورات if زنجیره‌ای، بازسازی کنید.
android.sdk.defaultTargetSdkToCompileSdkIfUnset از نسخه کیت توسعه نرم‌افزار تدوین به‌عنوان مقدار پیش‌فرض برای نسخه کیت توسعه نرم‌افزار هدف در برنامه‌ها و آزمایش‌ها استفاده می‌کند.
پیش‌از این تغییر، نسخه کیت توسعه نرم‌افزار هدف به‌طور پیش‌فرض روی نسخه کیت توسعه نرم‌افزار حداقل تنظیم می‌شد.
false ← true نسخه کیت توسعه نرم‌افزار هدف را به‌طور صریح برای برنامه‌ها و آزمایش‌ها مشخص کنید.
android.onlyEnableUnitTestForTheTestedBuildType فقط عناصر آزمون واحد را برای نوع ساخت آزمایش‌شده ایجاد می‌کند.
در پروژه پیش‌فرض، این کار منجر به یک آزمایش واحد برای اشکال‌زدایی می‌شود، درحالی‌که رفتار قبلی این بود که آزمایش‌های واحد برای اشکال‌زدایی یا نسخه پخش اجرا شوند.
false ← true اگر پروژه شما نیاز ندارد که آزمایش‌ها برای هر دو حالت اشکال‌زدایی و انتشار اجرا شوند، نیازی به تغییر نیست.
android.proguard.failOnMissingFiles اگر هریک از فایل‌های نگهداری‌شده مشخص‌شده در AGP DSL در دیسک وجود نداشته باشد، ساخت با خطا مواجه می‌شود. پیش‌از این تغییر، غلط‌های املایی در نام فایل‌ها باعث می‌شد فایل‌ها بی‌صدا نادیده گرفته شوند. false ← true برداشتن هرگونه بیانیه فایل proguard نامعتبر
android.r8.optimizedResourceShrinking با درنظر گرفتن کلاس‌ها و منابع Android به‌صورت هم‌زمان، به R8 اجازه می‌دهد منابع 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 و واحد ویژگی با شکست مواجه خواهد شد. فایل‌های نگهداری مصرف‌کننده که شامل گزینه‌های سراسری مثل ­dontoptimize یا ­dontobfuscate هستند باید فقط در واحدهای برنامه استفاده شوند و می‌توانند مزایای بهینه‌سازی را برای کاربران کتابخانه کاهش دهند. اگر چنین گزینه‌های سراسری در وابستگی ازپیش کامپایل‌شده (JAR یا AAR) جاسازی شده باشد، کامپایل واحد برنامه Android به‌طور بی‌صدا آن‌ها را نادیده می‌گیرد. با بررسی فایل پیکربندی.txt (معمولاً در مسیری مانند <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) برای نظراتی مانند: # REMOVED CONSUMER RULE: ­dontoptimize می‌توانید ببینید چه زمانی این اتفاق می‌افتد. false ← true کتابخانه‌های منتشرشده باید قوانین ناسازگار را بردارند. کتابخانه‌های داخلی باید هر قانون ناسازگار اما ضروری را به proguardFile در واحد برنامه منتقل کنند. با تنظیم android.r8.globalOptionsInConsumerRules.disallowed=false انصراف دهید. پس‌از سازگار شدن همه فایل‌های نگهداری مصرف‌کننده، انصراف را بردارید.
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 9.0 تغییرات 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 نسخه ۸.۰ یا پایین‌تر به‌طور پیش‌فرض غیرفعال شده‌اند. این ویژگی‌ها را فقط در زیرپروژه‌هایی که از آن‌ها استفاده می‌کنند فعال کنید تا ساخت کارآمدتری داشته باشید.

دارایی عملکرد جایگزین
android.defaults.buildfeatures.aidl AIDL گردآوری را در همه زیرپروژه‌ها فعال می‌کند با تنظیم کردن ویژگی زیر در فایل‌های ساخت Gradle آن پروژه‌ها، گردآوری AIDL را فقط در زیرپروژه‌هایی که منبع AIDL دارند فعال کنید:
android {
  buildFeatures {
    aidl = true
  }
}
در فایل ساخت Gradle هر زیرپروژه حاوی منابع AIDL
android.defaults.buildfeatures.renderscript فعال می‌کند گردآوری RenderScript در همه زیرپروژه‌ها ترجمه Renderscript را فقط در زیرپروژه‌هایی که منابع renderscript دارند فعال کنید با تنظیم کردن دارایی زیر در فایل‌های ساخت Gradle آن پروژه‌ها:
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 اضافه کرده‌ایم. این گزینه یک آرگومان اجباری می‌گیرد که باید یکی از سه مقدار زیر باشد: 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() در اولین آرگومان فراخوانی بازنویسی می‌کند (درواقع بررسی تهی را نگه می‌دارد، اما بدون هیچ پیامی).
  • ‫remove بررسی‌ها را به‌طور کامل برمی‌دارد.

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

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

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

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

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

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

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

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

  1. کتابخانه را با روش‌های واسط default/static/private برای فایل‌های کلاس با minSdk < 24 ازشکر درآورید.
  2. داده‌واره بدون قند را بااستفاده از R8 و قوانینی که روش‌های واسط را در کلاس‌های همراه نگه می‌دارند، گردآوری کنید.
  3. برنامه را با کتابخانه در مسیر کلاس کامپایل کنید.
  4. ادغام برنامه و داده‌های جلسه Meet.

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

تغییر فایل منبع منتشرشده پیش‌فرض به 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 desugaring

نام کلاس‌های مصنوعی تولیدشده توسط 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
برونداد logcat مربوط به androidTest connectedCheck خراب است
پشتیبانی داخلی از 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 می‌شود
پروژه Java خالص به کتابخانه استاندارد Kotlin وابسته است.
برداشتن خصوصیات منسوخ‌شده KotlinMultiplatformAndroidCompilationBuilder در AGP 9.0
‫`com.android.tools.build:gradle:9.0.0-alpha05` باید وابستگی میانای برنامه‌سازی کاربردی به KGP و gradle-api داشته باشد
تغییر نام افزایه Gradle مربوط به com.android.experimental.built-in-kotlin
‫AGP9: ‏`variant.sources.kotlin!!.addGeneratedSourceDirectory()` کار نمی‌کند
بررسی‌های فراداده Aar در کامپایل Sdk از DSL قدیمی استفاده می‌کند
برداشتن دارایی منسوخ‌شده `com.android.build.api.dsl.ManagedDevices.devices`
پشتیبانی داخلی از Kotlin در AGP نباید با مجموعه‌های منبع Kotlin همگام‌سازی شود
اگر فایل نگهداری مصرف‌کننده حاوی ‎-dontobfuscate باشد، انتشار کتابخانه Android ناموفق خواهد بود
هیچ گزینه‌ای برای چاپ کردن نقشه منابع بهینه‌سازی‌شده وجود ندارد
پس‌از گذراندن این مرحله، فراخوانی finalizeDsl را به خطا تبدیل کنید
‫AGP پیکربندی jetifier را حتی وقتی jetifier غیرفعال است مقداردهی اولیه می‌کند
وقتی `kotlin.stdlib.default.dependency` برای فایل‌های واحد و pom درست باشد، ساختن در kotlin باعث نمی‌شود kotlinStdlib به‌عنوان وابستگی زمان ترجمه اضافه شود
«زبان مدل‌سازی بهینه‌سازی» جدید به‌طور پیش‌فرض فایل configuration.txt را ایجاد نمی‌کند
‫AGP 8.13.0 نمی‌تواند گراف پیمایش را در واحد درستی‌سنجی کند
‫AGP از «میانای برنامه‌سازی کاربردی Gradle» منسوخ‌شده استفاده می‌کند: نماد چندرشته‌ای
به کاربرانی که سعی می‌کنند از کتابخانه چندشاخه قدیمی با 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 متوقف شود
خطای «آزمایش ثابت» در واحدهای فقط آزمایشی
خطای نادرست هنگام استفاده از گیرنده‌های زمینه‌ای در وسایل آزمایشی
خطاهای نادرست IDE برای کد Kotlin در testFixtures
برخلاف افزایه `kotlin-kapt`، افزایه `legacy-kapt` از پردازش شرح صرف‌نظر می‌کند
‫compileSdkSpec.minorApiLevel با «افزونه تنظیمات» کار نمی‌کند
[کتابخانه ترکیب‌شده - عمومی] کتابخانه ترکیب‌شده تولیدشده شامل منابع نیست
‫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» ازکار می‌افتد
پرچم‌های پیش‌فرض `android.defaults.buildfeatures.aidl` را از gradle.properties بردارید
وقتی فایل ProGuard وجود ندارد، ساخت ناموفق است
برداشتن پرچم‌های پیش‌فرض buildconfig در gradle.properties
مقدار پیش‌فرض 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 به درست
استثنای بهتر هنگام اعمال افزایه kapt با Kotlin داخلی.
‫android.proguard.failOnMissingFiles برای consumerProguardFiles کار نمی‌کند
وابستگی افزایه Kotlin Gradle را به ۲.۲.۱۰ به‌روز کنید
ایجاد KotlinJvmAndroidCompilation بااستفاده از KGP API
حالت میانای برنامه‌سازی کاربردی صریح Kotlin برای منابع آزمایشی اعمال شد
Lint
‫AGP 8.11.0: وظیفه lintAnalyzeRelease هنگام اعمال فایل‌های .gradle.kts با apply(from = "...") ازکار می‌افتد
‫Lint ChecksSdkIntAtLeast Check بررسی نمی‌کند که مقدار حاشیه‌گذاری‌شده صحیح است یا نه
‫Kotlin داخلی .kotlin_module را به META-INF اضافه نمی‌کند
مسیر کلاس Lint حاوی کلاس‌های تکراری در نسخه‌های مختلف است
راهکار دور زدن منابع خصوصی کار نمی‌کند (tools:override = "true")
اشکال: برداشتن منابع استفاده‌نشده باعث برداشته شدن ترجمه‌های آن‌ها نمی‌شود و درباره آن هم پرسیده نمی‌شود
‫Lint هشدار «نمی‌تواند حافظه‌های نهان K2 را پاک کند» را صادر می‌کند
‫Lint هشدار «نمی‌تواند حافظه‌های نهان K2 را پاک کند» را صادر می‌کند
ادغام Lint
به‌دلیل تفاوت‌های systemPropertyInputs.javaVersion، حافظه نهان AndroidLintAnalysisTask در فروشندگان مختلف JDK یا نسخه‌های فرعی ازدست می‌رود
‫Lint با وجود compileSdk به‌طور خودکار از جدیدترین «کیت توسعه نرم‌افزار» نصب‌شده استفاده می‌کند، به‌عنوان ورودی تکلیف ثبت نمی‌شود، و حافظه نهان را خراب می‌کند
Shrinker (R8)
اگر از شناسه‌های منبع نهایی استفاده شود، کاهش منابع بهینه‌سازی‌شده R8 به‌طور بی‌صدا ناموفق خواهد بود