افزایه 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جدید جایگزین کنید. این کار ممکن است پیچیدهتر باشد، زیراandroidComponentsAPI طراحی شده است تا پایدارتر باشد و افزایهها را برای مدت طولانیتری سازگار نگه دارد. برای دیدن نمونهها، دستورالعملهای 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. |
از میاناهای جدید DSL بدون نمایان کردن پیادهسازیهای قدیمی
بلوک android استفاده کنید.این همچنین به این معنی است که API گونه قدیمی، مانند android.applicationVariants
دیگر دردسترس نیست.
|
false ← true |
با تنظیم کردن
android.newDsl=false میتوانید انصراف دهید.پساز اینکه همه افزایهها و منطق ساختمانی که پروژهتان استفاده میکند سازگار شد، انصراف را بردارید. |
android. |
فعال میکند Kotlin داخلی | false ← true |
اگر میتوانید، به Kotlin داخلی انتقال دهید یا انصراف دهید. |
android. |
اجبار میکند که هر کتابخانه نام بسته متمایزی داشته باشد. | false ← true |
نامهای بسته منحصربهفردی برای همه کتابخانههای درون پروژهتان مشخص کنید. اگر این کار ممکن نیست، میتوانید این پرچم را درحین انتقال غیرفعال کنید. |
android. |
بهطور پیشفرض از وابستگیهای androidx
استفاده کنید.
|
false ← true |
وابستگیهای androidx
را بپذیرید.
|
android. |
آزمایشهای دروندستگاهی را با
کلاس androidx.test.runner.AndroidJUnitRunner
بهطور پیشفرض اجرا کنید و پیشفرض
InstrumentationTestRunner
منسوخشده را برای
جایگزین کنید
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false ← true |
AndroidJUnitRunner را اتخاذ کنید،
یا testInstrumentationRunner سفارشی خود را بهطور صریح مشخص کنید.
|
android. |
استفاده از محدودیتهای وابستگی بین پیکربندیها را کنترل میکند. پیشفرض در AGP 9.0، false است که فقط از محدودیتها در آزمایشهای دستگاه برنامه (AndroidTest) استفاده میکند.
تنظیم این گزینه روی true باعث میشود به رفتار نسخه ۸.۱۳ برگردید.
|
true ← false |
مگر درصورت نیاز، از محدودیتهای وابستگی در همه جا استفاده نکنید. پذیرفتن پیشفرض جدید این پرچم همچنین بهینهسازیهایی را در فرایند وارد کردن پروژه فعال میکند که باید زمان وارد کردن ساختها را با زیرپروژههای کتابخانه Android زیاد کاهش دهد. |
android. |
کد را در برنامهها دربرابر کلاس R غیرنهایی کامپایل کنید و
کامپایل برنامه را با کامپایل کتابخانه هماهنگ کنید. این کار افزایشی بودن را بهبود میبخشد و راه را برای بهینهسازیهای عملکرد آینده در جریان پردازش منبع هموار میکند. |
false ← true |
بسیاری از پروژهها میتوانند رفتار جدید را بدون تغییر در منبع اتخاذ کنند. اگر فیلدهای کلاس R در هر جایی که به ثابت نیاز دارد استفاده شود، مثل موارد switch، برای استفاده از دستورات if زنجیرهای، بازسازی کنید. |
android. |
از نسخه کیت توسعه نرمافزار تدوین بهعنوان مقدار پیشفرض برای نسخه کیت توسعه نرمافزار هدف در برنامهها و آزمایشها استفاده میکند. پیشاز این تغییر، نسخه کیت توسعه نرمافزار هدف بهطور پیشفرض روی نسخه کیت توسعه نرمافزار حداقل تنظیم میشد. |
false ← true |
نسخه کیت توسعه نرمافزار هدف را بهطور صریح برای برنامهها و آزمایشها مشخص کنید. |
android. |
فقط عناصر آزمون واحد را برای نوع ساخت آزمایششده ایجاد میکند. در پروژه پیشفرض، این کار منجر به یک آزمایش واحد برای اشکالزدایی میشود، درحالیکه رفتار قبلی این بود که آزمایشهای واحد برای اشکالزدایی یا نسخه پخش اجرا شوند. |
false ← true |
اگر پروژه شما نیاز ندارد که آزمایشها برای هر دو حالت اشکالزدایی و انتشار اجرا شوند، نیازی به تغییر نیست. |
android. |
اگر هریک از فایلهای نگهداریشده مشخصشده در AGP DSL در دیسک وجود نداشته باشد، ساخت با خطا مواجه میشود. پیشاز این تغییر، غلطهای املایی در نام فایلها باعث میشد فایلها بیصدا نادیده گرفته شوند. | false ← true |
برداشتن هرگونه بیانیه فایل proguard نامعتبر |
android. |
با درنظر گرفتن کلاسها و منابع Android بهصورت همزمان، به R8 اجازه میدهد منابع Android کمتری را حفظ کند. | false ← true |
اگر قوانین نگهداری پروژه شما ازقبل کامل است، نیازی به تغییر نیست. |
android. |
به R8 اجازه میدهد با نگه نداشتن ضمنی سازنده پیشفرض
وقتی کلاسی نگه داشته میشود، کمتر نگه دارد.
یعنی -keep class A دیگر به معنای
-keep class A { <init>(); }نیست |
false ← true |
اگر قوانین نگهداری پروژه شما ازقبل کامل است، نیازی به تغییر نیست.
جایگزین کردن -keep class A
با
-keep class A { <init>(); }
در قوانین نگهداری پروژه برای هر موردی که نیاز دارید سازنده پیشفرض
نگهداری شود.
|
android. |
فعال میکند
resValues
در همه زیرپروژهها
|
true ← false |
resValues را فقط در زیرپروژههایی که به آن نیاز دارند فعال کنید
با تنظیم موارد زیر در فایلهای ساخت Gradle آن پروژهها:
android {
buildFeatures {
resValues = true
}
} |
android. |
گردآوری سایهزن را در همه پروژههای فرعی فعال میکند | true ← false |
با تنظیم موارد زیر در فایلهای ساخت Gradle آن پروژهها،
ترکیب سایهزن را فقط در زیرپروژههایی که حاوی سایهزنهایی هستند که
باید ترکیب شوند فعال کنید:
android {
buildFeatures {
shaders = true
}
} |
android. |
در 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. |
از 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. |
بااستفاده از
AndroidSourceSet
DSL، عبور ارائهدهندگان برای منابع تولیدشده را غیرمجاز کنید.
|
false ← true |
برای ثبت منابع تولیدشده، از
Sources
API در androidComponents استفاده کنید.
|
android. |
اگر ترجمه سایهزن فعال باشد، مسیر مترجم سایهزن باید بهطور صریح در
local.properties
تنظیم شود.
|
false ← true |
glslc.dir=/path/to/shader-tools را به
local.properties پروژه خود اضافه کنید.
|
ویژگیهای برداشتهشده
افزایه Android Gradle نسخه ۹.۰ عملکرد زیر را برمیدارد:
- پشتیبانی از برنامه Wear OS جاسازیشده
AGP 9.0 پشتیبانی از جاسازی برنامههای Wear OS را برمیدارد، زیرا دیگر در Play پشتیبانی نمیشود. این شامل برداشتن پیکربندیهایwearAppوAndroidSourceSet.wearAppConfigurationNameDSL میشود. برای نحوه انتشار برنامه در 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 نسخه ۹.۰ موارد زیر را برمیدارد:
AndroidSourceSet.jni، زیرا عملکردی نداشت.AndroidSourceSet.wearAppConfigurationName، زیرا به پشتیبانی برنامه Wear OS جاسازیشده برداشتهشده مربوط است.BuildType.isRenderscriptDebuggable، زیرا عملکردی نداشت.DependencyVariantSelection. باDependencySelectionجایگزین شده است، که بهعنوانkotlin.android.localDependencySelectionآشکار شده استInstallation.installOptions(String). با خصوصیت تغییرپذیرInstallation.installOptionsجایگزین شده است.بلوک آزمایشی، اما هرگز تثبیتشده
PostProcessing.ProductFlavor.setDimension، که با خصوصیتdimensionجایگزین شده است
LanguageSplitOptionsکه فقط برای Google Play فوری مفید بود و منسوخ شده است.DensitySplit، زیرا این ویژگی دیگر پشتیبانی نمیشود. جایگزین آن استفاده از دستههای برنامه است.
میاناهای برنامهسازی کاربردی برداشتهشده
افزایه Android Gradle نسخه ۹.۰ موارد زیر را برمیدارد:
AndroidComponentsExtension.finalizeDSl. باfinalizeDslجایگزین شده استComponent.transformClassesWith. باInstrumentation.transformClassesWithجایگزین شده استComponent.setAsmFramesComputationMode. باInstrumentation.setAsmFramesComputationModeجایگزین شده استComponentBuilder.enabled. باComponentBuilder.enableجایگزین شده است.DependenciesInfoBuilder.includedInApk. باincludeInApkجایگزین شدDependenciesInfoBuilder.includedInBundle. باincludeInBundleجایگزین شدGeneratesApk.targetSdkVersion. باtargetSdkجایگزین شدVariant.minSdkVersion. باminSdkجایگزین شدVariant.maxSdkVersion. باmaxSdkجایگزین شدVariant.targetSdkVersion. باtargetSdkجایگزین شدVariant.unitTest، زیرا برای افزایهcom.android.testکاربرد نداشت. unitTestدرVariantBuilderزیرنوع کهHasUnitTestرا گسترش میدهد دردسترس است.VariantBuilder.targetSdkوtargetSdkPreview، زیرا در کتابخانهها معنیدار نبودند. درعوض ازGeneratesApkBuilder.targetSdkیاGeneratesApkBuilder.targetSdkPreviewاستفاده کنید.VariantBuilder.enableUnitTest، زیرا برای افزایهcom.android.testکاربرد نداشت. enableUnitTestدرVariantBuilderزیرنوع کهHasUnitTestBuilderرا گسترش میدهد دردسترس است.VariantBuilder.unitTestEnabledبهنفعenableUnitTestکه در زیرنوعهایVariantBuilderبا نامی پایدارتر نامگذاری شده است برداشته میشود وHasUnitTestBuilderرا گسترش میدهد.VariantOutput.enable. باenabledجایگزین شد
FeaturePluginوFeatureExtensionمنسوخ و غیرفعال شده است.میاناهای برنامهسازی کاربردی
BaseExtension.registerTransformمنسوخ و غیرفعال شد، که فقط برای اجازه دادن به کامپایل کردن دربرابر جدیدترین نسخه AGP باقی مانده بود درحالیکه هدف اجرای آن در AGP 4.2 یا پایینتر بود.
برداشتن داراییهای Gradle
ویژگیهای Gradle زیر در ابتدا بهعنوان روشهایی برای غیرفعال کردن سراسری ویژگیهایی که بهطور پیشفرض فعال بودند اضافه شدند.
این ویژگیها از AGP نسخه ۸.۰ یا پایینتر بهطور پیشفرض غیرفعال شدهاند. این ویژگیها را فقط در زیرپروژههایی که از آنها استفاده میکنند فعال کنید تا ساخت کارآمدتری داشته باشید.
| دارایی | عملکرد | جایگزین |
|---|---|---|
android. |
AIDL گردآوری را در همه زیرپروژهها فعال میکند |
با تنظیم کردن ویژگی زیر در فایلهای ساخت Gradle آن پروژهها،
گردآوری AIDL را فقط در زیرپروژههایی که منبع AIDL دارند فعال کنید:
android {
buildFeatures {
aidl = true
}
} |
android. |
فعال میکند گردآوری RenderScript در همه زیرپروژهها |
ترجمه Renderscript را فقط در زیرپروژههایی که منابع renderscript دارند فعال کنید
با تنظیم کردن دارایی زیر در فایلهای ساخت Gradle آن پروژهها:
android {
buildFeatures {
renderScript = true
}
} |
داراییهای Gradle اعمالشده
اگر ویژگیهای Gradle زیر را تنظیم کنید، AGP 9.0 خطا میدهد.
دستیار ارتقا افزایه Android Gradle پروژههایی را که از این داراییها استفاده میکنند به AGP 9.0 ارتقا نخواهد داد.
| دارایی | عملکرد |
|---|---|
android. |
کوچک کردن منبع اکنون همیشه بهعنوان بخشی از R8 اجرا میشود، پیادهسازی قبلی برداشته شده است. |
android. |
«کاهش منابع» اکنون همیشه از «کاهش منابع دقیق» استفاده میکند که امکان برداشته شدن موارد بیشتری را فراهم میکند. |
تغییرات 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، قوانین نگهداری دیگر برای روشهای همراه اعمال نمیشود. این با این واقعیت که قوانین نگهداری برای فیلدها/روشها/کلاسهای سنتزشده توسط دیگر مترجمها قابل اعمال نیستند، سازگار است.
با انتقال بیتهای بهینهسازی غیرمجاز و کوچکسازی غیرمجاز به روشهای همراه، قبلاً از مورد استفاده زیر پشتیبانی میشد:
- کتابخانهای با روشهای رابط
default/static/privateبرای DEX باminSdk< 24 و قوانینی که روشهای رابط را حفظ میکنند تدوین کنید. - برنامهای را با کتابخانه در مسیر کلاس و
-applymappingکامپایل کنید. - برنامه و کتابخانه را ادغام کنید.
توجه داشته باشید که این کار فقط با -applymapping کار میکند زیرا disallow
obfuscation بیت به روشهای همراه منتقل نمیشود—یعنی،
نامهای روشهای مبهمسازیشده در کلاسهای همراه تولیدشده از مرحله ۱ وجود خواهد داشت.
ازاینپس، این مورد استفاده برای minSdk <
24 دیگر پشتیبانی نمیشود. راهکار موقت این است که کارهای زیر را انجام دهید:
- کتابخانه را با روشهای واسط
default/static/privateبرای فایلهای کلاس باminSdk< 24 ازشکر درآورید. - دادهواره بدون قند را بااستفاده از R8 و قوانینی که روشهای واسط را در کلاسهای همراه نگه میدارند، گردآوری کنید.
- برنامه را با کتابخانه در مسیر کلاس کامپایل کنید.
- ادغام برنامه و دادههای جلسه 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 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ادغام Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Shrinker (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||