پلاگین Android Gradle 7.0.0 (ژوئیه 2021)

پلاگین Android Gradle 7.0.0 یک نسخه اصلی است که شامل انواع ویژگی ها و بهبودهای جدید است.

7.0.1 (اوت 2021)

این به روز رسانی جزئی شامل رفع اشکال مختلف است. برای مشاهده لیستی از رفع اشکال قابل توجه، پست مربوطه را در وبلاگ Release Updates بخوانید.

سازگاری

حداقل نسخه نسخه پیش فرض
گریدل 7.0.2 7.0.2
ابزارهای ساخت SDK 30.0.2 30.0.2
NDK N/A 21.4.7075529
JDK 11 11

JDK 11 برای اجرای AGP 7.0 مورد نیاز است

هنگام استفاده از پلاگین Android Gradle 7.0 برای ساخت برنامه خود، JDK 11 اکنون برای اجرای Gradle مورد نیاز است. Android Studio Arctic Fox JDK 11 را بسته‌بندی می‌کند و Gradle را برای استفاده از آن به صورت پیش‌فرض پیکربندی می‌کند، به این معنی که اکثر کاربران Android Studio نیازی به انجام هیچ گونه تغییر پیکربندی در پروژه‌های خود ندارند.

اگر نیاز دارید نسخه JDK مورد استفاده توسط AGP را در Android Studio به صورت دستی تنظیم کنید ، باید از JDK 11 یا بالاتر استفاده کنید.

هنگام استفاده از AGP مستقل از Android Studio، نسخه JDK را با تنظیم متغیر محیطی JAVA_HOME یا گزینه خط فرمان -Dorg.gradle.java.home در فهرست نصب JDK 11 خود ارتقا دهید.

توجه داشته باشید که مدیر SDK و مدیر AVD در بسته منسوخ شده SDK Tools با JDK 11 کار نمی کنند. برای ادامه استفاده از SDK Manager و AVD Manager با AGP 7.0 و بالاتر، باید به نسخه های جدید ابزارها بروید بسته کنونی Android SDK Command-Line Tools .

متغیر API پایدار

Variant API جدید اکنون پایدار است. رابط‌های جدید را در بسته com.android.build.api.variant و نمونه‌هایی را در پروژه gradle-recipes GitHub ببینید. به عنوان بخشی از Variant API جدید، ما تعدادی فایل میانی به نام مصنوعات را از طریق رابط Artifacts در دسترس قرار داده ایم. این مصنوعات مانند مانیفست ادغام شده را می توان با استفاده از افزونه ها و کدهای شخص ثالث به صورت ایمن به دست آورد و سفارشی کرد.

ما به گسترش Variant API با افزودن قابلیت‌های جدید و افزایش تعداد مصنوعات میانی که برای سفارشی‌سازی در دسترس قرار می‌دهیم، ادامه می‌دهیم.

تغییر رفتار برای لینت

این بخش چندین تغییر رفتار لینت را در افزونه Android Gradle 7.0.0 توضیح می دهد.

لینت بهبود یافته برای وابستگی های کتابخانه

اجرای lint با checkDependencies = true اکنون سریعتر از قبل است. برای پروژه‌های اندرویدی متشکل از یک برنامه با وابستگی‌های کتابخانه، توصیه می‌شود که checkDependencies مطابق شکل زیر روی true تنظیم کنید و از طریق ./gradlew :app:lint را اجرا کنید، که همه ماژول‌های وابستگی را به صورت موازی تجزیه و تحلیل می‌کند و یک گزارش واحد از جمله تولید می‌کند. مشکلات مربوط به برنامه و همه وابستگی های آن.

شیار

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

کاتلین

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

کارهای لینت اکنون می توانند به روز شوند

اگر منابع و منابع یک ماژول تغییر نکرده باشند، کار تجزیه و تحلیل پرز برای ماژول نیازی به اجرا مجدد ندارد. هنگامی که این اتفاق می افتد، اجرای کار به صورت "UP-TO-DATE" در خروجی Gradle ظاهر می شود. با این تغییر، هنگام اجرای lint بر روی یک ماژول برنامه با checkDependencies = true ، تنها ماژول هایی که تغییر کرده اند باید تحلیل خود را اجرا کنند. در نتیجه، Lint می تواند حتی سریعتر اجرا شود.

اگر ورودی های آن تغییر نکرده باشند، وظیفه گزارش Lint نیز نیازی به اجرا ندارد. یک مشکل شناخته شده مرتبط این است که وقتی کار lint به روز است، هیچ خروجی متنی چاپ شده در stdout وجود ندارد ( شماره 191897708 ).

در حال اجرا بر روی ماژول های با ویژگی پویا

AGP دیگر از پرزهای در حال اجرا از ماژول های با ویژگی پویا پشتیبانی نمی کند. پرزهای در حال اجرا از ماژول برنامه مربوطه، بر روی ماژول‌های با ویژگی پویا اجرا می‌شود و همه مشکلات را در گزارش پرز برنامه شامل می‌شود. یک مشکل شناخته شده مرتبط این است که هنگام اجرای lint با checkDependencies = true از یک ماژول برنامه، وابستگی های کتابخانه با ویژگی های پویا بررسی نمی شوند مگر اینکه وابستگی های برنامه نیز باشند ( مساله شماره 191977888 ).

اجرای lint فقط در نوع پیش فرض

در حال اجرا ./gradlew :app:lint اکنون lint فقط برای نوع پیش فرض اجرا می شود. در نسخه های قبلی AGP، برای همه انواع پرز اجرا می شد.

هشدارهای کلاس از دست رفته در کوچک کننده R8

R8 به طور دقیق تر و پیوسته کلاس های از دست رفته و گزینه -dontwarn کنترل می کند. بنابراین، باید شروع به ارزیابی اخطارهای کلاس گمشده منتشر شده توسط R8 کنید.

هنگامی که R8 با مرجع کلاسی روبرو می شود که در برنامه شما یا یکی از وابستگی های آن تعریف نشده است، هشداری را منتشر می کند که در خروجی ساخت شما ظاهر می شود. به عنوان مثال:

R8: Missing class: java.lang.instrument.ClassFileTransformer

این هشدار به این معنی است که تعریف کلاس java.lang.instrument.ClassFileTransformer هنگام تجزیه و تحلیل کد برنامه شما یافت نمی شود. در حالی که این معمولاً به معنای وجود خطایی است، ممکن است بخواهید این هشدار را نادیده بگیرید. دو دلیل رایج برای نادیده گرفتن هشدار عبارتند از:

  1. کتابخانه هایی که JVM و کلاس از دست رفته را هدف قرار می دهند از نوع کتابخانه JVM هستند (مانند مثال بالا).

  2. یکی از وابستگی‌های شما از یک API فقط در زمان کامپایل استفاده می‌کند.

می توانید با اضافه کردن یک قانون -dontwarn به فایل proguard-rules.pro خود، هشدار کلاس گم شده را نادیده بگیرید. به عنوان مثال:

-dontwarn java.lang.instrument.ClassFileTransformer

برای سهولت، AGP فایلی را ایجاد می کند که حاوی تمام قوانین گمشده بالقوه است و آنها را در مسیر فایلی مانند موارد زیر می نویسد: app/build/outputs/mapping/release/missing_rules.txt . قوانین را به فایل proguard-rules.pro خود اضافه کنید تا هشدارها را نادیده بگیرید.

در AGP 7.0، پیام‌های کلاس گمشده به‌عنوان اخطار ظاهر می‌شوند و می‌توانید با تنظیم android.r8.failOnMissingClasses = true در gradle.properties آنها را به خطا تبدیل کنید. در AGP 8.0، این هشدارها به خطاهایی تبدیل می شوند که ساخت شما را خراب می کنند. حفظ رفتار AGP 7.0 با افزودن گزینه -ignorewarnings به فایل proguard-rules.pro امکان پذیر است، اما توصیه نمی شود.

کش ساخت افزونه Android Gradle حذف شد

کش ساخت AGP در AGP 4.1 حذف شد. پیش از این در AGP 2.3 برای تکمیل حافظه نهان ساخت Gradle معرفی شده بود، کش ساخت AGP به طور کامل توسط حافظه نهان ساخت Gradle در AGP 4.1 جایگزین شد. این تغییر بر زمان ساخت تاثیری ندارد.

در AGP 7.0، ویژگی android.enableBuildCache ، ویژگی android.buildCacheDir ، و وظیفه cleanBuildCache حذف شده است.

از کد منبع جاوا 11 در پروژه خود استفاده کنید

اکنون می توانید کد منبع جاوا 11 را در پروژه برنامه خود کامپایل کنید و به شما امکان می دهد از ویژگی های زبان جدیدتر مانند روش های رابط خصوصی، عملگر الماس برای کلاس های ناشناس و نحو متغیر محلی برای پارامترهای لامبدا استفاده کنید.

برای فعال کردن این ویژگی، compileOptions را روی نسخه جاوا مورد نظر تنظیم کنید و compileSdkVersion روی 30 یا بالاتر تنظیم کنید:

// build.gradle
android {
  compileSdkVersion 30
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_11
    targetCompatibility JavaVersion.VERSION_11
  }
  // For Kotlin projects
  kotlinOptions {
    jvmTarget = "11"
  }
}
// build.gradle.kts
android {
  compileSdkVersion(30)
  compileOptions {
    sourceCompatibility(JavaVersion.VERSION_11)
    targetCompatibility(JavaVersion.VERSION_11)
  }
  kotlinOptions {
    jvmTarget = "11"
  }
}

تنظیمات وابستگی حذف شد

در AGP 7.0، پیکربندی‌ها (یا حوزه‌های وابستگی) زیر حذف شده‌اند:

  • compile
    بسته به مورد استفاده، api یا implementation جایگزین شده است.
    همچنین برای انواع *Compile اعمال می شود، به عنوان مثال: debugCompile .
  • provided
    این با compileOnly جایگزین شده است.
    همچنین برای *انواع ارائه شده اعمال می شود، به عنوان مثال: releaseProvided .
  • apk
    این با runtimeOnly جایگزین شده است.
  • publish
    این با runtimeOnly جایگزین شده است.

در بیشتر موارد، دستیار ارتقاء AGP به طور خودکار پروژه شما را به تنظیمات جدید منتقل می کند.

تغییر مسیر کلاس هنگام کامپایل در برابر افزونه Android Gradle

اگر در حال کامپایل کردن با افزونه Android Gradle هستید، ممکن است مسیر کلاس کامپایل شما تغییر کند. از آنجایی که AGP اکنون از پیکربندی های api/implementation به صورت داخلی استفاده می کند، ممکن است برخی از مصنوعات از مسیر کلاس کامپایل شما حذف شوند. اگر در زمان کامپایل به یک وابستگی AGP وابسته هستید، حتماً آن را به عنوان یک وابستگی صریح اضافه کنید.

افزودن کتابخانه های بومی در پوشه منابع جاوا پشتیبانی نمی شود

قبلاً، می‌توانید یک کتابخانه بومی در یک پوشه منابع جاوا اضافه کنید و با استفاده از android.sourceSets.main.resources.srcDirs پوشه را ثبت کنید تا کتابخانه بومی استخراج و به APK نهایی اضافه شود. با شروع با AGP 7.0، این مورد پشتیبانی نمی شود و کتابخانه های بومی در یک پوشه منابع جاوا نادیده گرفته می شوند. در عوض، از روش DSL در نظر گرفته شده برای کتابخانه های بومی، android.sourceSets.main.jniLibs.srcDirs استفاده کنید. برای اطلاعات بیشتر، نحوه پیکربندی مجموعه‌های منبع را ببینید.

مسائل شناخته شده

این بخش مشکلات شناخته شده ای را که در افزونه Android Gradle نسخه 7.0.0 وجود دارد، توضیح می دهد.

ناسازگاری با پلاگین 1.4.x Kotlin Multiplatform

پلاگین اندروید Gradle 7.0.0 با پلاگین Kotlin Multiplatform نسخه 1.5.0 و بالاتر سازگار است. پروژه هایی که از پشتیبانی چند پلتفرم Kotlin استفاده می کنند باید به Kotlin 1.5.0 به روز رسانی شوند تا از پلاگین Android Gradle 7.0.0 استفاده کنند. به عنوان یک راه حل، می توانید افزونه Android Gradle را به 4.2.x تنزل دهید، اگرچه این کار توصیه نمی شود.

برای اطلاعات بیشتر، KT-43944 را ببینید.

خروجی پرز از دست رفته است

هنگامی که کار لینت به روز است، هیچ خروجی متنی چاپ شده در stdout وجود ندارد ( شماره 191897708 ). برای زمینه بیشتر، تغییرات رفتار برای پرز را ببینید. این مشکل در افزونه اندروید Gradle 7.1 برطرف خواهد شد.

همه وابستگی‌های کتابخانه با ویژگی پویا بررسی نمی‌شوند

هنگام اجرای lint با checkDependencies = true از یک ماژول برنامه، وابستگی های کتابخانه با ویژگی های پویا بررسی نمی شوند مگر اینکه وابستگی های برنامه نیز باشند ( مسئله #191977888 ). به عنوان یک راه حل، وظیفه lint را می توان در آن کتابخانه ها اجرا کرد. برای زمینه بیشتر، تغییرات رفتار برای پرز را ببینید.