افزونه اندروید گریدل ۷.۰.۰ (ژوئیه ۲۰۲۱)

افزونه اندروید گریدل ۷.۰.۰ یک نسخه اصلی است که شامل مجموعه‌ای از ویژگی‌ها و بهبودهای جدید می‌شود.

۷.۰.۱ (آگوست ۲۰۲۱)

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

سازگاری

حداقل نسخه نسخه پیش‌فرض یادداشت‌ها
گرادل ۷.۰.۲ ۷.۰.۲ برای کسب اطلاعات بیشتر، به به‌روزرسانی Gradle مراجعه کنید.
ابزارهای ساخت SDK ۳۰.۰.۲ ۳۰.۰.۲ ابزارهای ساخت SDK را نصب یا پیکربندی کنید .
ان دی کی ناموجود ۲۱.۴.۷۰۷۵۵۲۹ نسخه دیگری از NDK را نصب یا پیکربندی کنید .
جی‌دی‌کی ۱۱ ۱۱ برای کسب اطلاعات بیشتر، به تنظیم نسخه JDK مراجعه کنید.

برای اجرای AGP 7.0 به JDK 11 نیاز است.

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

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

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

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

API نوع پایدار

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

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

تغییرات رفتاری برای Lint

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

بهبود خط کد برای وابستگی‌های کتابخانه‌ای

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

گرووی

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

کاتلین

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

وظایف Lint اکنون می‌توانند به‌روز باشند

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

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

اجرای lint روی ماژول‌های با ویژگی پویا

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

اجرای lint فقط روی نسخه پیش‌فرض

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

هشدارهای کلاس از دست رفته در Shrinker 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، این هشدارها به خطاهایی تبدیل می‌شوند که ساخت شما را مختل می‌کنند. می‌توانید با اضافه کردن گزینه -ignorewarnings به فایل proguard-rules.pro خود، رفتار AGP 7.0 را حفظ کنید، اما این کار توصیه نمی‌شود.

حافظه پنهان ساخت افزونه اندروید Gradle حذف شد

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

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

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

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

برای فعال کردن این ویژگی، 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 به طور خودکار پروژه شما را به پیکربندی‌های جدید منتقل می‌کند.

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

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

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

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

مشکلات شناخته شده

این بخش مشکلات شناخته‌شده‌ای را که در افزونه‌ی اندروید Gradle نسخه‌ی ۷.۰.۰ وجود دارد، شرح می‌دهد.

ناسازگاری با افزونه چند پلتفرمی کاتلین نسخه ۱.۴.x

افزونه اندروید گریدل ۷.۰.۰ با افزونه چند پلتفرمی کاتلین ۱.۵.۰ و بالاتر سازگار است. پروژه‌هایی که از پشتیبانی چند پلتفرمی کاتلین استفاده می‌کنند، برای استفاده از افزونه اندروید گریدل ۷.۰.۰ باید به کاتلین ۱.۵.۰ به‌روزرسانی کنند. به عنوان یک راه حل، می‌توانید افزونه اندروید گریدل را به ۴.۲.x دانگرید کنید، اگرچه این کار توصیه نمی‌شود.

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

خروجی lint وجود ندارد

وقتی وظیفه lint به‌روز است، هیچ خروجی متن lint در stdout چاپ نمی‌شود ( شماره #191897708 ). برای اطلاعات بیشتر، به تغییرات رفتاری lint مراجعه کنید. این مشکل در افزونه Android Gradle نسخه ۷.۱ برطرف خواهد شد.

همه وابستگی‌های کتابخانه‌ای با ویژگی‌های پویا، بررسی خط کد (lint) نمی‌شوند.

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