افزونه اندروید گریدل ۴.۱.۰ (آگوست ۲۰۲۰)

سازگاری

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

<p>This version of the Android plugin requires the following:</p>
<ul>
  <li>
    <p><a href="https://docs.gradle.org/6.5.1/release-notes.html">Gradle 6.5</a>.
    To learn more, read the section about <a href="#updating-gradle">updating
    Gradle</a>.</p>
  </li>
  <li>
    <p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
    29.0.2</a> or higher.</p>
  </li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>

ویژگی‌های جدید

این نسخه از افزونه Android Gradle شامل ویژگی‌های جدید زیر است.

پشتیبانی از کاتلین اسکریپت DSL

برای کمک به بهبود تجربه ویرایش برای کاربران اسکریپت ساخت کاتلین، DSL و API های افزونه اندروید Gradle نسخه ۴.۱ اکنون در مجموعه‌ای از رابط‌های کاتلین جدا از کلاس‌های پیاده‌سازی آنها تعریف شده‌اند. این بدان معناست که:

  • اکنون قابلیت تهی بودن و تغییرپذیری به صراحت در انواع کاتلین اعلام شده‌اند.
  • مستندات تولید شده از آن رابط‌ها در مرجع API کاتلین منتشر شده است.
  • سطح API افزونه‌ی اندروید Gradle به وضوح تعریف شده است تا توسعه‌ی بیلدهای اندروید در آینده کمتر شکننده باشد.

مهم: اگر قبلاً از اسکریپت‌های ساخت KTS استفاده کرده‌اید یا از Kotlin در buildSrc استفاده می‌کنید، این ممکن است باعث ایجاد اختلال در سازگاری منبع برای خطاهای خاصی شود که در نسخه‌های قبلی به صورت خطاهای زمان اجرا ظاهر می‌شدند.

انواع مجموعه‌هایی که برای جهش در DSL طراحی شده‌اند، اکنون به طور یکنواخت به صورت زیر تعریف می‌شوند:

val collection: MutableCollectionType

این یعنی دیگر نمی‌توان موارد زیر را با اسکریپت‌های کاتلین برای برخی از مجموعه‌هایی که قبلاً از آن پشتیبانی می‌کردند، نوشت:

collection = collectionTypeOf(...)

با این حال، تغییر مجموعه به طور یکنواخت پشتیبانی می‌شود، بنابراین collection += … و collection.add(...) اکنون باید در همه جا کار کنند.

اگر هنگام ارتقاء پروژه‌ای که از افزونه اندروید Gradle، APIهای Kotlin و DSL استفاده می‌کند، مشکلی مشاهده کردید، لطفاً اشکال را گزارش دهید .

وابستگی‌های C/C++ را از AARها استخراج کنید

افزونه اندروید گریدل ۴.۰ قابلیت وارد کردن بسته‌های پیش‌ساخته (Prefab) را در وابستگی‌های AAR اضافه کرد. در AGP 4.1، اکنون می‌توان کتابخانه‌ها را از ساخت بومی خارجی خود در یک AAR برای یک پروژه کتابخانه اندروید صادر کرد.

برای اکسپورت کردن کتابخانه‌های بومی خود، کد زیر را به بلوک android از فایل build.gradle پروژه کتابخانه خود اضافه کنید:

buildFeatures {
    prefabPublishing true
}

prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }

<var>myotherlibrary</var> {
    headers "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

buildFeatures {
    prefabPublishing = true
}

prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }

create("<var>myotherlibrary</var>") {
    headers = "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

در این مثال، کتابخانه‌های mylibrary و myotherlibrary از ndk-build یا CMake نسخه بومی خارجی شما در AAR تولید شده توسط نسخه شما بسته‌بندی می‌شوند و هر کدام هدرها را از دایرکتوری مشخص شده به فایل‌های وابسته خود صادر می‌کنند.

توجه: برای کاربران افزونه اندروید Gradle نسخه ۴.۰ و بالاتر، تنظیمات پیکربندی برای وارد کردن کتابخانه‌های بومی از پیش ساخته شده تغییر کرده است. برای اطلاعات بیشتر، به یادداشت‌های انتشار نسخه ۴.۰ مراجعه کنید.

پشتیبانی R8 از متادیتای کاتلین

کاتلین از متادیتای سفارشی در فایل‌های کلاس جاوا برای شناسایی ساختارهای زبان کاتلین استفاده می‌کند. R8 اکنون از نگهداری و بازنویسی متادیتای کاتلین پشتیبانی می‌کند تا به طور کامل از کوچک‌سازی کتابخانه‌ها و برنامه‌های کاتلین با استفاده از kotlin-reflect پشتیبانی کند.

برای نگه داشتن متادیتای کاتلین، قوانین keep زیر را اضافه کنید:

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

این به R8 دستور می‌دهد که متادیتای کاتلین را برای تمام کلاس‌هایی که مستقیماً نگهداری می‌شوند، نگه دارد.

برای اطلاعات بیشتر، به بخش «کوچک‌سازی کتابخانه‌ها و برنامه‌های کاتلین با استفاده از بازتاب کاتلین با R8 {:.external}» در Medium مراجعه کنید.

ادعاها در ساخت‌های اشکال‌زدایی

وقتی نسخه اشکال‌زدایی برنامه خود را با استفاده از افزونه Android Gradle نسخه ۴.۱.۰ و بالاتر می‌سازید، کامپایلر داخلی (D8) کد برنامه شما را بازنویسی می‌کند تا در زمان کامپایل، assertionها را فعال کند، بنابراین همیشه بررسی‌های assertion را فعال خواهید داشت.

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

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

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

وظیفه cleanBuildCache و ویژگی‌های android.enableBuildCache و android.buildCacheDir منسوخ شده‌اند و در AGP 7.0 حذف خواهند شد. ویژگی android.enableBuildCache در حال حاضر هیچ تاثیری ندارد، در حالی که ویژگی android.buildCacheDir و وظیفه cleanBuildCache تا AGP 7.0 برای حذف هرگونه محتوای حافظه پنهان ساخت AGP موجود، فعال خواهند بود.

حجم برنامه برای برنامه‌هایی که از فشرده‌سازی کد استفاده می‌کنند، به طور قابل توجهی کاهش می‌یابد

با شروع این نسخه، فیلدهای کلاس‌های R دیگر به طور پیش‌فرض نگهداری نمی‌شوند ، که ممکن است منجر به صرفه‌جویی قابل توجه در اندازه APK برای برنامه‌هایی شود که امکان کوچک‌سازی کد را فراهم می‌کنند. این امر نباید منجر به تغییر رفتار شود، مگر اینکه از طریق reflection به کلاس‌های R دسترسی داشته باشید، که در این صورت لازم است قوانین keep را برای آن کلاس‌های R اضافه کنید .

تغییر نام ویژگی android.namespacedRClass به android.nonTransitiveRClass

پرچم آزمایشی android.namespacedRClass به android.nonTransitiveRClass تغییر نام داده است.

این پرچم که در فایل gradle.properties تنظیم می‌شود، امکان ایجاد فضای نام (namespace) برای کلاس R هر کتابخانه را فراهم می‌کند، به طوری که کلاس R آن فقط شامل منابع اعلام شده در خود کتابخانه باشد و هیچ یک از وابستگی‌های کتابخانه را شامل نشود، در نتیجه اندازه کلاس R برای آن کتابخانه کاهش می‌یابد.

کاتلین DSL: تغییر نام coreLibraryDesugaringEnabled

گزینه کامپایل Kotlin DSL به coreLibraryDesugaringEnabled به isCoreLibraryDesugaringEnabled تغییر یافته است. برای اطلاعات بیشتر در مورد این پرچم، به پشتیبانی از desugaring API جاوا نسخه ۸+ (پلاگین اندروید Gradle نسخه ۴.۰.۰+) مراجعه کنید.

ویژگی‌های نسخه از کلاس BuildConfig در پروژه‌های کتابخانه‌ای حذف شدند

فقط برای پروژه‌های کتابخانه‌ای، ویژگی‌های BuildConfig.VERSION_NAME و BuildConfig.VERSION_CODE از کلاس BuildConfig تولید شده حذف شده‌اند، زیرا این مقادیر استاتیک، مقادیر نهایی کد و نام نسخه برنامه را منعکس نمی‌کردند و بنابراین گمراه‌کننده بودند. علاوه بر این، این مقادیر در طول ادغام مانیفست کنار گذاشته شدند.

در نسخه آینده افزونه Android Gradle، ویژگی‌های versionName و versionCode نیز از DSL مربوط به کتابخانه‌ها حذف خواهند شد. در حال حاضر، هیچ راهی برای دسترسی خودکار به کد/نام نسخه برنامه از یک زیرپروژه کتابخانه وجود ندارد.

برای ماژول‌های برنامه، هیچ تغییری ایجاد نشده است، شما همچنان می‌توانید در DSL به versionCode و versionName مقادیری اختصاص دهید؛ این مقادیر به فیلدهای manifest و BuildConfig برنامه نیز منتقل می‌شوند.

مسیر NDK را تنظیم کنید

شما می‌توانید مسیر نصب NDK محلی خود را با استفاده از ویژگی android.ndkPath در فایل build.gradle ماژول خود تنظیم کنید.


android {
  ndkPath "your-custom-ndk-path"
}

android {
  ndkPath = "your-custom-ndk-path"
}

اگر از این ویژگی به همراه ویژگی android.ndkVersion استفاده کنید، این مسیر باید حاوی نسخه NDK باشد که با android.ndkVersion مطابقت داشته باشد.

تغییرات رفتار تست واحد کتابخانه

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

در برخی موارد، تست‌های واحد کتابخانه‌ای که از اتصال داده استفاده می‌کنند، ممکن است با کلاس‌های DataBindingComponent یا BR مواجه شوند. این تست‌ها باید به یک تست ابزار دقیق در پروژه androidTest منتقل شوند، زیرا کامپایل و اجرا بر روی آن کلاس‌ها در یک تست واحد ممکن است خروجی نادرستی ایجاد کند.

افزونه‌ی Gradle برای io.fabric منسوخ شده است.

افزونه‌ی io.fabric Gradle منسوخ شده است و با نسخه ۴.۱ افزونه‌ی Android Gradle سازگار نیست. برای اطلاعات بیشتر در مورد SDK منسوخ شده‌ی Fabric و مهاجرت به SDK Firebase Crashlytics، به بخش «ارتقا به SDK Firebase Crashlytics» مراجعه کنید.