افزایه 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و میاناهای برنامهسازی کاربردی مشابه را باandroidComponentsAPI جدید جایگزین کنید. این ممکن است پیچیدهتر باشد، زیرا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
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. |
از میاناهای جدید DSL استفاده کنید، بدون اینکه پیادهسازیهای قدیمی
بلوک android را افشا کنید.این یعنی API قدیمی variant، مثل 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. |
به R8 اجازه میدهد با درنظر گرفتن کلاسها و منابع Android باهم، منابع 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 و واحد ویژگی ناموفق خواهد بود. فایلهای 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. |
ارائهدهندگان عبور برای منابع تولیدشده بااستفاده از
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 نسخه ۹.۰ تغییرات 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 نسخه ۹.۰ این موارد را برمیدارد:
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 Instant مفید بود، که منسوخ شده است.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 نسخه ۴.۲ یا پایینتر بود.
ویژگیهای Gradle برداشته شد
ویژگیهای Gradle زیر در ابتدا بهعنوان روشهایی برای غیرفعال کردن سراسری ویژگیهایی که بهطور پیشفرض فعال بودند اضافه شدند.
این ویژگیها از AGP نسخه ۸.۰ یا پایینتر بهطور پیشفرض غیرفعال شدهاند. این ویژگیها را فقط در زیرپروژههایی که از آنها استفاده میکنند فعال کنید تا ساخت کارآمدتری داشته باشید.
| دارایی | عملکرد | جایگزین |
|---|---|---|
android. |
کامپایل کردن AIDL را در همه زیرپروژهها فعال میکند |
کامپایل AIDL را فقط در زیرپروژههایی که منابع AIDL دارند فعال کنید. برای این کار، ویژگی زیر را در فایلهای ساخت Gradle آن پروژهها تنظیم کنید:
android {
buildFeatures {
aidl = true
}
} |
android. |
فعال کردن کامپایل RenderScript در همه زیرپروژهها |
با تنظیم کردن ویژگی زیر در فایلهای ساخت Gradle آن پروژهها،
کامپایل renderscript را فقط در زیرپروژههایی فعال کنید که
منابع renderscript در آنها وجود دارد:
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 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، قوانین نگهداری دیگر برای روشهای همراه اعمال نمیشوند. این با این واقعیت مطابقت دارد که قوانین حفظ برای سایر فیلدها/روشها/کلاسهای ترکیبشده توسط کامپایلر قابلاعمال نیستند.
با انتقال بیتهای مجاز نبودن بهینهسازی و مجاز نبودن کوچک کردن به روشهای همراه، قبلاً از مورد استفاده زیر پشتیبانی میشد:
- کتابخانهای را با روشهای میانای
default/static/privateدر DEX باminSdk< 24 و قوانینی که روشهای میانای را حفظ میکنند، کامپایل کنید. - برنامهای را با کتابخانه در classpath و
-applymappingکامپایل کنید. - برنامه و کتابخانه را ادغام کنید.
توجه داشته باشید که این فقط با -applymapping کار میکند زیرا بیت disallow
obfuscation به روشهای همراه منتقل نمیشود—یعنی،
کلاسهای همراه تولیدشده از مرحله ۱ نامهای روش مبهمشده
خواهند داشت.
ازاینپس، این مورد استفاده دیگر برای minSdk <
۲۴ پشتیبانی نمیشود. راه حل موقت این است که کارهای زیر را انجام دهید:
- Desugar the library with
default/static/privateinterface methods to class files withminSdk< 24. - مصنوع شکرزداییشده را بااستفاده از R8 و قوانینی که روشهای میانای کلاسهای همراه را حفظ میکنند، کامپایل کنید.
- برنامه را با کتابخانه در classpath کامپایل کنید.
- برنامه و دادههای شکرزداییشده را ادغام کنید.
یکی دیگر از عوارض جانبی این امر این است که دیگر نمیتوان ویژگیهای کلاس داخلی و روش محصورکننده را برای کلاسهای ناشناس و محلی در روشهای همراه میانای 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 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint Integration |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Shrinker (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||