الإصدار 9.0.1 من المكوّن الإضافي لنظام Gradle المتوافق مع Android (يناير 2026)

الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android هو إصدار رئيسي يتضمّن تغييرات في واجهة برمجة التطبيقات والسلوك.

للتحديث إلى الإصدار 9.0.1 من المكوّن الإضافي لنظام Gradle المتوافق مع Android، استخدِم مساعد ترقية المكوّن الإضافي لنظام Gradle المتوافق مع Android. يساعد "مساعد ترقية" Android Gradle Plugin في الحفاظ على السلوكيات الحالية عند ترقية مشروعك عند الحاجة، ما يتيح لك ترقية مشروعك لاستخدام الإصدار 9.0 من Android Gradle Plugin، حتى إذا لم تكن مستعدًا لاستخدام جميع الإعدادات التلقائية الجديدة في الإصدار 9.0 من المكوّن الإضافي Android Gradle.

تتوفّر أيضًا مهارتان للوكيل لتسهيل عملية الترقية. بالنسبة إلى التطبيقات التي لا تستخدم KMP، يمكنك تجربة مهارة الترقية إلى الإصدار 9 من المكوّن الإضافي لنظام Gradle المتوافق مع Android من مستودع مهارات Android. بالنسبة إلى تطبيقات KMP، جرِّب مهارة الترقية إلى الإصدار 9 من المكوّن الإضافي لنظام Gradle المتوافق مع Android من JetBrains. لمزيد من المعلومات حول استخدام المهارات في "استوديو Android"، يُرجى الاطّلاع على مقالة توسيع نطاق "وضع الوكيل" باستخدام المهارات.

التوافق

الحدّ الأقصى لمستوى واجهة برمجة التطبيقات الذي يتوافق معه الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android هو المستوى 36.1 لواجهة برمجة التطبيقات. في ما يلي معلومات أخرى عن التوافق:

الإصدار الأدنى الإصدار التلقائي ملاحظات
Gradle 9.1.0 9.1.0 لمزيد من المعلومات، اطّلِع على تحديث Gradle.
أدوات تصميم حزمة تطوير البرامج (SDK) 36.0.0 36.0.0 تثبيت أو ضبط أدوات إنشاء حزمة تطوير البرامج (SDK).
NDK لا ينطبق 28.2.13676358 ثبِّت أو اضبط إصدارًا مختلفًا من NDK.
JDK 17 17 لمزيد من المعلومات، يُرجى الاطّلاع على مقالة ضبط إصدار JDK.
المكوّن الإضافي Kotlin Gradle‏ (KGP) 2.2.10 2.2.10 لمزيد من المعلومات، يُرجى الاطّلاع على تبعية وقت التشغيل في المكوّن الإضافي Kotlin Gradle.

أصبحت فئات android DSL الآن تنفّذ الواجهات العامة الجديدة فقط

على مدار السنوات القليلة الماضية، قدّمنا واجهات جديدة للغة DSL وواجهة برمجة التطبيقات من أجل التحكّم بشكل أفضل في واجهات برمجة التطبيقات المتاحة للجميع. استمرّ الإصداران 7.x و8.x من AGP في استخدام أنواع DSL القديمة (مثل BaseExtension) التي نفّذت أيضًا الواجهات العامة الجديدة، وذلك للحفاظ على التوافق أثناء العمل على الواجهات.

يستخدم الإصدار 9.0 من Android Gradle Plugin واجهات DSL الجديدة حصريًا، وقد تم تغيير عمليات التنفيذ إلى أنواع جديدة مخفية بالكامل. ويؤدي هذا أيضًا إلى إزالة إمكانية الوصول إلى واجهة برمجة التطبيقات القديمة التي تم إيقافها نهائيًا.

للترقية إلى الإصدار 9.0 من AGP، قد تحتاج إلى إجراء ما يلي:

  • تأكَّد من أنّ مشروعك متوافق مع لغة Kotlin المضمّنة: المكوّن الإضافي org.jetbrains.kotlin.android غير متوافق مع لغة DSL الجديدة.
  • تبديل مشاريع KMP إلى المكوّن الإضافي لمكتبة Gradle المتوافق مع Android في KMP: إنّ استخدام المكوّن الإضافي org.jetbrains.kotlin.multiplatform في مشروع Gradle الفرعي نفسه الذي يتضمّن المكوّنَين الإضافيَين com.android.library وcom.android.application غير متوافق مع لغة DSL الجديدة.

  • تعديل ملفات الإصدار: على الرغم من أنّ تغيير الواجهات يهدف إلى الحفاظ على لغة DSL قدر الإمكان، قد تكون هناك بعض التغييرات الصغيرة.

  • عدِّل منطق الإصدار المخصّص للإشارة إلى واجهة برمجة التطبيقات وDSL الجديدَين: استبدِل أي إشارات إلى DSL الداخلي بواجهات DSL العامة. وفي معظم الحالات، سيكون هذا بديلاً فرديًا. استبدِل أي استخدام لواجهة برمجة التطبيقات applicationVariants وواجهات برمجة التطبيقات المشابهة بواجهة برمجة التطبيقات الجديدة androidComponents. قد يكون ذلك أكثر تعقيدًا، لأنّ واجهة برمجة التطبيقات androidComponents مصمّمة لتكون أكثر ثباتًا من أجل الحفاظ على توافق المكوّنات الإضافية لفترة أطول. يمكنك الاطّلاع على وصفات Gradle للحصول على أمثلة.

  • تحديث المكوّنات الإضافية التابعة لجهات خارجية: قد تظل بعض المكوّنات الإضافية التابعة لجهات خارجية تعتمد على واجهات أو واجهات برمجة تطبيقات لم تعد متاحة. يجب نقل البيانات إلى إصدارات من هذه المكوّنات الإضافية المتوافقة مع الإصدار 9.0 من "مكوّن Android الإضافي في Gradle".

يمنع التبديل إلى واجهات 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
استخدام مكوّنات مختلفة من حزمة تطوير البرامج (SDK) لنظام التشغيل Android لتنفيذ مهام مخصّصة التبديل إلى androidComponents.sdkComponents
registerArtifactType،
registerBuildTypeSourceProvider،
registerProductFlavorSourceProvider،
registerJavaArtifact،
registerMultiFlavorSourceProvider،
wrapJavaSourceSet
تمت إزالة الوظائف القديمة المرتبطة في الغالب بمعالجة المصادر التي تم إنشاؤها في "استوديو Android"، والتي توقفت عن العمل في الإصدار 7.2.0 من المكوّن الإضافي لنظام Android Gradle. لا يتوفّر بديل مباشر لواجهات برمجة التطبيقات هذه.
dexOptions الإعدادات القديمة ذات الصلة بأداة dx التي تم استبدالها بـ d8. لم يكن لأي من الإعدادات أي تأثير منذ الإصدار 7.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android. ما مِن بديل مباشر.
generatePureSplits إنشاء ملفات APK مجزّأة حسب الإعدادات للتطبيقات الفورية أصبحت إمكانية شحن ملفات APK المجزّأة لضبط الإعدادات مدمجة الآن في حِزم تطبيقات Android.
aidlPackagedList ملفات AIDL المطلوب تجميعها في حزمة AAR لعرضها كواجهة برمجة تطبيقات للمكتبات والتطبيقات التي تعتمد على هذه المكتبة. لا يزال هذا الإعداد معروضًا على LibraryExtension ولكن ليس على أنواع الإضافات الأخرى.

إذا أجريت الترقية إلى الإصدار 9.0 من Android Gradle Plugin وظهرت لك رسالة الخطأ التالية، يعني ذلك أنّ مشروعك لا يزال يشير إلى بعض الأنواع القديمة:

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

بدلاً من ذلك، لإجراء عملية نقل تدريجية، يتيح لك الإصدار 9.4 من AGP إيقاف وحدات فردية. لمعرفة كيفية إجراء ذلك، يُرجى الاطّلاع على إيقاف وحدة Variant API.

تم وضع علامة على الفئات السابقة على أنّها متوقفة نهائيًا في الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android. وهذا يعني أنّ المشاريع التي لا تستخدم العلامة newDsl ستظهر لها تحذيرات بشأن الإيقاف النهائي، بما في ذلك في مجموعة android نفسها.

يمكنك أيضًا البدء في الترقية إلى واجهات برمجة التطبيقات الجديدة قبل الترقية إلى الإصدار 9.0 من Android Gradle Plugin. تتوفّر الواجهات الجديدة في العديد من إصدارات AGP، لذا يمكنك استخدام مزيج من الواجهات الجديدة والقديمة. تعرض المستندات المرجعية لواجهة برمجة التطبيقات الخاصة بالمكوّن الإضافي لنظام Gradle المتوافق مع Android واجهة برمجة التطبيقات لكل إصدار من المكوّن الإضافي، ووقت إضافة كل فئة وطريقة وحقل.

نحن نتواصل مع مطوّري المكوّنات الإضافية الشائعة الاستخدام لمساعدتهم في تكييف وإصدار مكوّنات إضافية متوافقة تمامًا مع الأوضاع الجديدة، وسنواصل تحسين "مساعد ترقية مكوّن Android الإضافي لنظام Gradle" في "استوديو Android" لإرشادك خلال عملية نقل البيانات.

إذا تبيّن لك أنّ واجهة برمجة التطبيقات الجديدة DSL أو Variant API تفتقر إلى إمكانات أو ميزات، يُرجى الإبلاغ عن مشكلة في أقرب وقت ممكن.

لغة Kotlin المضمّنة

يقدّم الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android دعمًا مدمجًا للغة Kotlin ويتم تفعيله تلقائيًا. هذا يعني أنّه لم يعُد عليك تطبيق المكوّن الإضافي org.jetbrains.kotlin.android (أو kotlin-android) في ملفات الإصدار لتجميع ملفات مصدر Kotlin. يؤدي ذلك إلى تبسيط عملية دمج Kotlin مع AGP، وتجنُّب استخدام واجهات برمجة التطبيقات المتوقّفة نهائيًا، وتحسين الأداء في بعض الحالات.

لذلك، عند ترقية مشروعك إلى الإصدار 9.0 من AGP، عليك أيضًا نقل البيانات إلى Kotlin المضمّنة أو إيقافها.

يمكنك أيضًا إيقاف دعم Kotlin المضمّن بشكل انتقائي لمشاريع Gradle الفرعية التي لا تحتوي على مصادر Kotlin.

تبعية وقت التشغيل على المكوّن الإضافي Kotlin Gradle

لتوفير دعم مضمّن للغة Kotlin، يتضمّن الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android الآن تبعية وقت التشغيل على الإصدار 2.2.10 من المكوّن الإضافي لنظام Gradle المتوافق مع Kotlin ‏ (KGP). يعني ذلك أنّه لم يعُد عليك تحديد إصدار KGP، وإذا كنت تستخدم إصدار KGP أقدم من 2.2.10، سيقوم Gradle تلقائيًا بترقية إصدار KGP إلى 2.2.10. وبالمثل، إذا كنت تستخدم إصدارًا من 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 المضمَّنة. ويرجع ذلك إلى أنّ الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android يفعّل Kotlin المدمج تلقائيًا، ويتطلّب Kotlin المدمج الإصدار 2.2.10 أو إصدارًا أحدث من المكوّن الإضافي Kotlin لنظام Gradle.

لاستخدام إصدار أقدم من 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 الذي يمكنك الرجوع إليه هو 2.0.0.

دعم IDE لتركيبات الاختبار

يوفّر الإصدار 9.0 من "مكوّن Android الإضافي لنظام Gradle" توافقًا كاملاً مع بيئة التطوير المتكاملة (IDE) في "استوديو Android" من أجل أدوات الاختبار.

المكوّن الإضافي لمكتبة Fused

يتيح لك المكوّن الإضافي Fused Library (نسخة حصرية) نشر مكتبات متعددة كمكتبة Android واحدة بتنسيق AAR. يمكن أن يسهّل ذلك على المستخدمين الاعتماد على العناصر المنشورة.

لمزيد من المعلومات حول كيفية البدء، يُرجى الاطّلاع على مقالة نشر مكتبات Android متعددة كمكتبة واحدة باستخدام Fused Library.

التغييرات في السلوك

يتضمّن الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android السلوكيات الجديدة التالية:

السلوك الاقتراح
يستخدم الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android الإصدار r28c من NDK تلقائيًا. ننصحك بتحديد إصدار NDK الذي تريد استخدامه بشكل صريح.
يتطلّب المكوّن الإضافي لنظام Gradle المتوافق مع Android‏ 9.0 تلقائيًا من مستخدمي المكتبة استخدام إصدار حزمة تطوير البرامج (SDK) نفسه أو إصدار أحدث. استخدِم حزمة تطوير برامج (SDK) للتجميع نفسها أو أعلى عند استخدام مكتبة. إذا لم يكن ذلك ممكنًا، أو إذا أردت منح مستخدمي المكتبة التي تنشرها مزيدًا من الوقت للتبديل، اضبط AarMetadata.minCompileSdk بشكل صريح.

يتضمّن الإصدار 9.0 من AGP تعديلات على الإعدادات التلقائية لسمات Gradle التالية. يمنحك هذا الخيار إمكانية الحفاظ على سلوك الإصدار 8.13 من AGP عند الترقية:

الخاصية الوظيفة التغيير من الإصدار 8.13 إلى الإصدار 9.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" الاقتراح
android.newDsl استخدِم واجهات DSL الجديدة بدون عرض عمليات التنفيذ القديمة للعنصر android.
يعني ذلك أيضًا أنّ واجهة برمجة التطبيقات القديمة الخاصة بالصيغ، مثل android.applicationVariants لم تعُد متاحة.
false ‏← true ويمكنك إيقاف ذلك من خلال ضبط android.newDsl=false.
بعد أن تصبح جميع المكوّنات الإضافية ومنطق الإنشاء الذي يستخدمه مشروعك متوافقة، يمكنك إزالة خيار الإيقاف.
android.builtInKotlin تفعيل لغة Kotlin المضمّنة false ‏← true انتقِل إلى Kotlin المضمّنة إذا كان بإمكانك أو أوقِف الميزة.
android.uniquePackageNames يفرض أن يكون لكل مكتبة اسم حزمة مميّز. false ‏← true حدِّد أسماء حزم فريدة لجميع المكتبات ضمن مشروعك. إذا لم يكن ذلك ممكنًا، يمكنك إيقاف هذه العلامة أثناء نقل البيانات.
android.useAndroidx استخدِم تبعيات androidx بشكل تلقائي. false ‏← true استخدِم تبعيات androidx.
android.default.androidx.test.runner يمكنك إجراء الاختبارات على الجهاز فقط باستخدام الفئة androidx.test.runner.AndroidJUnitRunner تلقائيًا، بدلاً من الفئة التلقائية المتوقفة نهائيًا InstrumentationTestRunner لـ
android {
  defaultConfig {
    testInstrumentationRunner = "..."
  }
}
false ‏← true استخدِم AndroidJUnitRunner، أو حدِّد testInstrumentationRunner المخصّص بشكل صريح.
android.dependency.useConstraints يتحكّم هذا الإعداد في استخدام قيود التبعية بين الإعدادات.
الإعداد التلقائي في الإصدار 9.0 من "مكوّن Android Gradle الإضافي" هو false، والذي يستخدم القيود فقط في اختبارات الأجهزة للتطبيقات (AndroidTest). سيؤدي ضبط هذه السياسة على true إلى العودة إلى السلوك في الإصدار 8.13.
true ‏← false لا تستخدِم قيود التبعية في كل مكان ما لم تكن بحاجة إليها. تؤدي الموافقة على الإعداد التلقائي الجديد لهذه العلامة أيضًا إلى تفعيل التحسينات في عملية استيراد المشروع، ما من شأنه تقليل وقت الاستيراد لعمليات الإنشاء التي تتضمّن العديد من المشاريع الفرعية لمكتبات Android.
android.enableAppCompileTimeRClass تجميع الرموز البرمجية في التطبيقات مقابل فئة R غير نهائية، ما يجعل تجميع التطبيقات متوافقًا مع تجميع المكتبات
يؤدي ذلك إلى تحسين التزايد ويمهد الطريق لإجراء تحسينات مستقبلية على الأداء في ما يتعلق بتدفق معالجة الموارد.
false ‏← true يمكن للعديد من المشاريع اعتماد السلوك الجديد بدون إجراء تغييرات على المصدر. إذا تم استخدام حقول فئة R في أي مكان يتطلب ثابتًا، مثل حالات التبديل، يمكنك إعادة تصميم الرمز لاستخدام عبارات if المتسلسلة.
android.sdk.defaultTargetSdkToCompileSdkIfUnset يستخدم إصدار حزمة تطوير البرامج (SDK) للتجميع كقيمة تلقائية لإصدار حزمة تطوير البرامج (SDK) المستهدَف في التطبيقات والاختبارات.
قبل هذا التغيير، كان إصدار حزمة SDK المستهدَف يتم ضبطه تلقائيًا على الحد الأدنى لإصدار حزمة SDK.
false ‏← true حدِّد إصدار حزمة SDK المستهدَف بشكل صريح للتطبيقات والاختبارات.
android.onlyEnableUnitTestForTheTestedBuildType يتم إنشاء مكوّنات اختبار الوحدة لنوع الإصدار الذي تم اختباره فقط.
في المشروع التلقائي، يؤدي ذلك إلى إجراء اختبار وحدة واحد لتصحيح الأخطاء، حيث كان السلوك السابق هو إجراء اختبارات الوحدة لتصحيح الأخطاء أو الإصدار.
false ‏← true إذا كان مشروعك لا يتطلّب إجراء اختبارات لكل من تصحيح الأخطاء والإصدار، فلا يلزم إجراء أي تغيير.
android.proguard.failOnMissingFiles يؤدي ذلك إلى تعذُّر عملية الإنشاء وظهور خطأ في حال عدم توفّر أي من ملفات الاحتفاظ المحدّدة في AGP DSL على القرص. قبل هذا التغيير، كانت الأخطاء الإملائية في أسماء الملفات تؤدي إلى تجاهل الملفات بدون إشعار. false ‏← true أزِل أي تعريفات غير صالحة لملفات proguard
android.r8.optimizedResourceShrinking يسمح هذا الإعداد لـ R8 بالاحتفاظ بعدد أقل من موارد Android من خلال مراعاة الفئات وموارد Android معًا. false ‏← true إذا كانت قواعد الاحتفاظ بالبيانات في مشروعك مكتملة، ليس عليك إجراء أي تغيير.
android.r8.strictFullModeForKeepRules تسمح هذه السمة لـ R8 بالاحتفاظ بعدد أقل من العناصر من خلال عدم الاحتفاظ ضمنيًا بالدالة الإنشائية التلقائية عند الاحتفاظ بفئة. أي أنّ -keep class A لم يعُد يشير إلى -keep class A { <init>(); }
false ‏← true إذا كانت قواعد الاحتفاظ بالبيانات في مشروعك مكتملة، ليس عليك إجراء أي تغيير.

يجب استبدال -keep class A بـ -keep class A { <init>(); } في قواعد الاحتفاظ الخاصة بمشروعك في أي حالات تحتاج فيها إلى الاحتفاظ بالدالة الإنشائية التلقائية.
android.defaults.buildfeatures.resvalues يتم تفعيل resValues في جميع المشاريع الفرعية true ‏← false فعِّل resValues في المشاريع الفرعية التي تحتاج إليها فقط من خلال ضبط ما يلي في ملفات إنشاء Gradle لهذه المشاريع:
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders يتيح هذا الإعداد تجميع برامج التظليل في جميع المشاريع الفرعية true ‏← false فعِّل تجميع برامج التظليل في المشاريع الفرعية التي تحتوي على برامج تظليل فقط ليتم تجميعها من خلال ضبط ما يلي في ملفات إصدار Gradle لهذه المشاريع:
android {
  buildFeatures {
    shaders = true
  }
}
android.r8.proguardAndroidTxt.disallowed في الإصدار 9.0 من "مكوّن Android الإضافي لنظام Gradle&quot;، لن يتوافق 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.r8.globalOptionsInConsumerRules.disallowed اعتبارًا من الإصدار 9.0 من Android Gradle Plugin، سيتعذّر نشر مكتبة Android ووحدة الميزات إذا كانت ملفات الاحتفاظ بالمستهلك تحتوي على إعدادات Proguard بها مشاكل. يجب استخدام ملفات Consumer keep التي تتضمّن خيارات عامة مثل ­dontoptimize أو ­dontobfuscate في وحدات التطبيق فقط، ويمكن أن تقلّل من مزايا التحسين لمستخدمي المكتبة. سيتجاهل تجميع وحدة تطبيق Android تلقائيًا أي خيارات عامة من هذا النوع إذا كانت مضمّنة في تبعية تم تجميعها مسبقًا (JAR أو AAR). يمكنك معرفة وقت حدوث ذلك من خلال التحقّق من ملف 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.sourceset.disallowProvider عدم السماح بتمرير موفّري المصادر التي تم إنشاؤها باستخدام AndroidSourceSet DSL. false ‏← true استخدِم واجهة برمجة التطبيقات Sources على androidComponents لتسجيل المصادر التي تم إنشاؤها.
android.custom.shader.path.required يتطلّب ذلك ضبط مسار برنامج تجميع أدوات التظليل بشكل صريح في local.properties في حال تفعيل تجميع أدوات التظليل. false ‏← true أضِف glslc.dir=/path/to/shader-tools إلى local.properties في مشروعك.

الميزات التي تمت إزالتها

يزيل الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android الوظائف التالية:

  • إتاحة تطبيقات Wear OS المضمّنة
    يزيل الإصدار 9.0 من "مكوّن Gradle الإضافي لنظام Android" إمكانية تضمين تطبيقات Wear OS، وهو أمر لم يعُد متاحًا في Play. ويشمل ذلك إزالة إعدادات wearApp و لغة AndroidSourceSet.wearAppConfigurationName DSL. يمكنك الاطّلاع على صفحة النشر على Wear OS لمعرفة كيفية نشر تطبيقك على Wear OS.
  • مهمة إعداد تقارير "androidDependencies" و"sourceSets"
  • إتاحة حِزم APK المجزّأة حسب الكثافة
    يزيل الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android إمكانية إنشاء حِزم APK مجزّأة حسب كثافة الشاشة. وتمت إزالة هذه الوظيفة وواجهات برمجة التطبيقات ذات الصلة. لتقسيم حِزم APK مجزّأة حسب كثافة الشاشة باستخدام الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android أو إصدار أحدث، استخدِم حِزم التطبيقات.

تم تغيير DSL

يتضمّن الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android التغييرات التالية غير المتوافقة في DSL:

  • تمت إزالة مَعلمات CommonExtension.

    في حد ذاته، هذا مجرد تغيير قد يؤدي إلى عطل على مستوى المصدر للمساعدة في تجنُّب التغييرات المستقبلية التي قد تؤدي إلى عطل على مستوى المصدر، ولكنه يعني أيضًا أن طرق الحظر يجب أن تنتقل من CommonExtension إلى ApplicationExtension وLibraryExtension وDynamicFeatureExtension وTestExtension.

    عند ترقية مشروعك إلى الإصدار 9.0 من Android Gradle Plugin، عليك إعادة تصميم رمز المكوّن الإضافي لنظام Gradle الذي يستخدم هذه المَعلمات أو طرق الحظر. على سبيل المثال، تم تعديل المكوّن الإضافي التالي لإزالة مَعلمة النوع وعدم الاعتماد على طرق الحظر التي تمت إزالتها:

    AGP 8.13

    val commonExtension: CommonExtension<*, *, *, *, *, *> =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig {
            minSdk {
                version = release(28)
            }
        }
    }
    

    المكوّن الإضافي لنظام Gradle المتوافق مع Android‏ (AGP) الإصدار 9.0

    val commonExtension: CommonExtension =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig.apply {
            minSdk {
                version = release(28)
            }
        }
    }
    

    بالنسبة إلى المكوّنات الإضافية التي تستهدف مجموعة من إصدارات AGP، فإنّ استخدام دالة getter مباشرةً يتوافق مع إصدارات AGP الأقدم من 9.0.

تمت إزالة DSL

يزيل الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android ما يلي:

واجهات برمجة التطبيقات التي تمت إزالتها

يزيل الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android ما يلي:

خصائص Gradle التي تمت إزالتها

تمت إضافة سمات Gradle التالية في البداية كطرق لإيقاف الميزات التي تم تفعيلها تلقائيًا على مستوى العالم.

تم إيقاف هذه الميزات تلقائيًا منذ الإصدار 8.0 من "مكوّن Android الإضافي لـ Gradle" أو الإصدارات الأقدم. يمكنك تفعيل هذه الميزات في المشاريع الفرعية التي تستخدمها فقط لإنشاء إصدار أكثر كفاءة.

الخاصية الوظيفة الاستبدال
android.defaults.buildfeatures.aidl يتيح هذا الإعداد تجميع AIDL في جميع المشاريع الفرعية فعِّل تجميع AIDL في المشاريع الفرعية التي تحتوي على مصادر AIDL فقط من خلال ضبط السمة التالية في ملفات تصميم Gradle الخاصة بتلك المشاريع:
android {
  buildFeatures {
    aidl = true
  }
}
في ملف تصميم Gradle لكل مشروع فرعي يحتوي على مصادر AIDL
android.defaults.buildfeatures.renderscript يتيح تجميع RenderScript في جميع المشاريع الفرعية فعِّل تجميع renderscript في المشاريع الفرعية التي تحتوي على مصادر renderscript فقط من خلال ضبط السمة التالية في ملفات تصميم Gradle الخاصة بتلك المشاريع:
android {
  buildFeatures {
    renderScript = true
  }
}

خصائص Gradle المفروضة

يعرض الإصدار 9.0 من AGP خطأً إذا ضبطت سمات Gradle التالية.

لن يقوم مساعد ترقية المكوّن الإضافي لنظام Gradle المتوافق مع Android بترقية المشاريع إلى الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android التي تستخدم هذه السمات.

الخاصية الوظيفة
android.r8.integratedResourceShrinking يتم الآن تشغيل ميزة "تقليص الموارد" دائمًا كجزء من R8، وقد تمت إزالة عملية التنفيذ السابقة.
android.enableNewResourceShrinker.preciseShrinking تستخدم ميزة "تقليص الموارد" الآن دائمًا تقليص الموارد بدقة، ما يتيح إزالة المزيد من الموارد.

تغييرات R8

يتضمّن الإصدار 9.0.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android تغييرات R8 التالية.

خيار ضبط جديد: -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 تنقل داخليًا وحدات بت عدم السماح بالتحسين وعدم السماح بالتصغير إلى طرق المرافقة المركّبة.

بدءًا من الإصدار 9.0 من Android Gradle Plugin، لن تنطبق قواعد الاحتفاظ على الطرق المصاحبة. يتوافق ذلك مع حقيقة أنّ قواعد الاحتفاظ لا تنطبق على الحقول أو الطرق أو الفئات الأخرى التي تم إنشاؤها بواسطة برنامج التجميع.

من خلال نقل وحدات بت عدم السماح بالتحسين وعدم السماح بالتقليص إلى الطرق المصاحبة، كانت حالة الاستخدام التالية متاحة في السابق:

  1. تجميع مكتبة باستخدام طرق واجهة default/static/private إلى DEX باستخدام minSdk < 24 وقواعد تحافظ على طرق الواجهة.
  2. تجميع تطبيق باستخدام المكتبة في مسار الفئة و-applymapping
  3. دمج التطبيق والمكتبة

يُرجى العِلم أنّ هذا الإجراء لا يعمل إلا مع -applymapping لأنّ وحدة بت disallow obfuscation لا يتم نقلها إلى الطرق المصاحبة، أي أنّ الفئات المصاحبة التي تم إنشاؤها من الخطوة 1 ستكون أسماء الطرق فيها مخفية.

من الآن فصاعدًا، لن تكون حالة الاستخدام هذه متاحة للإصدار minSdk < 24. الحلّ البديل هو تنفيذ ما يلي:

  1. إزالة السكر من المكتبة باستخدام طرق واجهة default/static/private إلى ملفات الفئات التي تحتوي على minSdk < 24.
  2. تجميع العنصر الذي تمت إزالة التجميل اللغوي منه باستخدام R8 والقواعد التي تحتفظ بطرق الواجهة في الفئات المصاحبة
  3. جمِّع التطبيق باستخدام المكتبة في مسار الفئة.
  4. دمج التطبيق مع العنصر الذي تمت إزالة التجميل اللغوي منه

ومن الآثار الجانبية الأخرى لذلك أنّه لم يعُد من الممكن الاحتفاظ بسمات الفئات الداخلية والطرق المضمّنة للفئات المجهولة والمحلية داخل طرق الواجهة المصاحبة.

تغيير ملف المصدر التلقائي الذي تم إصداره إلى r8-map-id-<MAP_ID>

تم تطبيق هذا التغيير في الإصدار 8.12.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android".

تتغيّر سمة ملف المصدر التلقائية المنبعثة للفئة من 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> هو تجزئة الخريطة الكاملة، وليس بادئة من 7 أحرف لتجزئة الخريطة التي تم استخدامها سابقًا.

تفعيل استخدام الأسماء الاصطناعية المصغّرة في عملية إزالة التجميل اللغوي في L8

يحتوي اسم الفئات الاصطناعية التي تم إنشاؤها بواسطة D8 عادةً على السلسلة الفرعية $$ExternalSynthetic التي تخبرك بأنّ هذا المحتوى اصطناعي تم إنشاؤه بواسطة D8. علاوةً على ذلك، يرمّز اسم الفئة الاصطناعية أيضًا نوعها (على سبيل المثال، Backport وLambda)، ما يؤثر سلبًا في حجم ملف DEX الناتج، لأنّ أسماء الفئات تشغل مساحة أكبر في مجموعة السلاسل.

يضبط الإصدار 9.0 من AGP أداة L8 (إزالة التجميل اللغوي للمكتبة الأساسية) بحيث يستخدم ملف DEX الذي يحتوي على جميع فئات j$ تنسيقًا جديدًا ومختصرًا لأسماء الفئات الاصطناعية. يستخدم اسم الفئة الجديد معرّفًا رقميًا (على سبيل المثال، $1).

إزالة إمكانية استخدام -addconfigurationdebugging

يزيل الإصدار 9.0 من &quot;المكوّن الإضافي لنظام Gradle المتوافق مع Android&quot; إمكانية استخدام -addconfigurationdebugging. يُبلغ برنامج التجميع الآن عن تحذير في حال استخدام العلامة.

إزالة إمكانية إنشاء قواعد L8 من D8/R8

لا ينطبق هذا التغيير إلا على المطوّرين الذين يستخدمون سطر أوامر D8/R8 أو واجهات برمجة التطبيقات مباشرةً.

يزيل الإصدار 9.0 من R8 إمكانية إنشاء قواعد الاحتفاظ بالبيانات لـ L8 من D8 وR8. يجب استخدام TraceReferences لهذا الغرض بدلاً من ذلك.

وبشكل أكثر تحديدًا، تتم إزالة الطريقتين D8Command.builder.setDesugaredLibraryKeepRuleConsumer و R8Command.Builder.setDesugaredLibraryKeepRuleConsumer، وتتم إزالة دعم --desugared-lib-pg-conf-output من خيارات سطر الأوامر في D8 وR8.

المشاكل التي تم إصلاحها

الإصدار 9.0.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android

المشاكل التي تم حلّها
مكوّن إضافي لنظام Gradle المتوافق مع Android
طلب ميزة: إدخال الإصدار المثالي من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" كسمة
تثبيت SingleArtifact.VERSION_CONTROL_INFO_FILE
ناتج logcat الخاص بـ androidTest connectedCheck معطّل
يجب ألا تتم مزامنة دعم Kotlin المضمّن في AGP مع مجموعات مصادر Kotlin
تفضّل missingDimensionStrategy إصدارًا يتطابق مع اسمها حتى من سمة غير ذات صلة
يجب ألا تتم مزامنة دعم Kotlin المضمّن في AGP مع مجموعات مصادر Kotlin
لا يحلّ الإصدار 9.0.0-rc01 من "المكوّن الإضافي لنظام Gradle في Android" مشاكل مكتبات Kotlin من خلال دالة kotlin()‎
لا تنشر ميزة Built-in-kotlin قيد التبعية kotlin-stdlib في ملف pom الخاص بـ maven
إضافة إطار اختبار للاختلاف بين compileSdk وtargetSdk
تؤدي قيمة resConfigs الفارغة إلى حدوث خطأ غامض في أداة حزم مواد عرض Android ‏(aapt)
يعتمد مشروع Pure Java على مكتبة kotlin stdlib.
إزالة سمات KotlinMultiplatformAndroidCompilationBuilder المتوقّفة نهائيًا في الإصدار 9.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
يجب أن يتضمّن `com.android.tools.build:gradle:9.0.0-alpha05` تبعية واجهة برمجة تطبيقات على KGP وgradle-api
إعادة تسمية المكوّن الإضافي com.android.experimental.built-in-kotlin في Gradle
‫AGP9: لا يعمل `variant.sources.kotlin!!.addGeneratedSourceDirectory()` ‎
تستخدم عمليات التحقّق من البيانات الوصفية لملفات aar في حزمة تطوير البرامج (SDK) الخاصة بالتجميع لغة DSL القديمة
إزالة السمة `com.android.build.api.dsl.ManagedDevices.devices` المتوقفة نهائيًا
يجب ألا تتم مزامنة دعم Kotlin المضمّن في AGP مع مجموعات مصادر Kotlin
تعذُّر نشر مكتبة Android إذا كان ملف الاحتفاظ بالمستهلك يحتوي على -dontobfuscate
ما مِن خيارات لطباعة عملية الربط للموارد المحسَّنة
يجب أن يظهر خطأ عند استدعاء finalizeDsl بعد تجاوز هذه المرحلة
يُهيئ "مكوّن Android الإضافي في Gradle" إعدادات Jetifier حتى في حال إيقاف Jetifier
لا يضيف kotlinStdlib كاعتمادية وقت التجميع عندما تكون قيمة `kotlin.stdlib.default.dependency` صحيحة لملفات الوحدة وpom
لا تنشئ لغة DSL الجديدة لتحسين الأداء ملف configuration.txt تلقائيًا
تعذُّر الإصدار 8.13.0 من "مكوّن Android الإضافي لبرنامج Gradle" في التحقّق من الرسم البياني للتنقّل في وحدة معيّنة
يستخدم المكوّن الإضافي لنظام Gradle المتوافق مع Android واجهة برمجة تطبيقات Gradle متوقّفة نهائيًا: تدوين السلاسل المتعددة
تحذير المستخدمين الذين يحاولون استخدام مكتبة ملفات DEX المتعددة القديمة مع minSdkVersion >=21
يتعذّر إنشاء الإصدار في حال وجود مهام لإنشاء الرموز البرمجية
عند ضبط `android.builtInKotlin=false` و `android.newDsl=false` و `android.enableLegacyVariantApi=false`، سيتعذّر استخدام المكوّن الإضافي `kotlin-android` وستظهر رسالة الخطأ "واجهة برمجة التطبيقات applicationVariants قديمة"
تعذُّر حلّ مشكلة kotlin-stdlib غير المزوّدة بإصدار في لغة Kotlin المضمّنة عندما تكون قيمة kotlin.stdlib.default.dependency=false
يفتح DexData ملفًا بدون إغلاقه، ما يمنع عملية التنظيف
يجب أن يتوقف AndroidSourceDirectorySet عن تمديد PatternFilterable في الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android
خطأ في اختبار التثبيت في وحدات الاختبار فقط
ظهور خطأ غير صحيح عند استخدام مستقبلات السياق في تركيبات الاختبار
أخطاء IDE غير صحيحة لرمز Kotlin في testFixtures
يتخطّى المكوّن الإضافي `legacy-kapt` معالجة التعليقات التوضيحية على عكس `kotlin-kapt`
‫compileSdkSpec.minorApiLevel لا يعمل مع SettingsExtension
[fused lib - public] Generated fused library does not include sources
يجب ألا يكون مصدر extractNativeLibs وuseEmbeddedDex هو ملف البيان
تحذيرات من R8 في الإصدار ‎9.0.0-alpha09 من المكوّن الإضافي لنظام Gradle المتوافق مع Android
إزالة AndroidSourceSet.jni المتوقّف نهائيًا في الإصدار 9.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
إزالة Installation.installOptions()‎ في الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android
إزالة BuildType.isRenderscriptDebuggable في الإصدار 9.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
إزالة android.defaults.buildfeatures.renderscript
تعطُّل `com.android.kotlin.multiplatform.library` عند استخدام الأجهزة المُدارة من Gradle
إزالة علامات gradle.properties التلقائية لـ `android.defaults.buildfeatures.aidl`
تعذُّر عملية الإنشاء في حال عدم توفّر ملف proguard
إزالة علامات gradle.properties التلقائية في buildconfig
تغيير القيمة التلقائية لـ targetSdk في التطبيق لتستند إلى compileSdk بدلاً من minSdk
عند تفعيل `isIncludeAndroidResources` ‎، يتعذّر على `process{Variant}UnitTestManifest` دمج استخدامات tools:overrideLibrary في الإصدار 8.12.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
تسبُّب "المكوّن الإضافي لنظام Gradle المتوافق مع Android" في ظهور تحذيرات بشأن الإيقاف النهائي في Gradle لمهام اختبار JVM
‫DependencyReportTask غير متوافق مع ذاكرة التخزين المؤقت للإعدادات
تبديل إصدار Java التلقائي للمصدر/الهدف من Java 8 إلى Java 11 في الإصدار 9.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
تغيير القيمة التلقائية لـ android.useAndroidX إلى true
تم تحسين الاستثناء عند تطبيق المكوّن الإضافي kapt مع لغة Kotlin المضمّنة.
‫android.proguard.failOnMissingFiles لا يعمل مع consumerProguardFiles
تحديث تبعية المكوّن الإضافي Kotlin Gradle إلى الإصدار 2.2.10
إنشاء KotlinJvmAndroidCompilation باستخدام واجهة برمجة تطبيقات KGP
تم تطبيق وضع واجهة برمجة التطبيقات الصريح في Kotlin على مصادر الاختبار
Lint
الإصدار 8.11.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android: تتعطّل مهمة lintAnalyzeRelease عند تطبيق ملفات ‎ .gradle.kts باستخدام apply(from = "...")‎
لا يتحقّق Lint ChecksSdkIntAtLeast Check مما إذا كانت القيمة المُشار إليها صحيحة
لا تضيف لغة Kotlin المضمّنة ‎ .kotlin_module إلى META-INF
يحتوي مسار فئة Lint على فئات مكرّرة في إصدارات مختلفة
الحل البديل لتجاوز الموارد الخاصة لا يعمل (tools:override = "true")
خطأ: لا تؤدي إزالة الموارد غير المستخدَمة إلى إزالة ترجماتها أيضًا، ولا يتم السؤال عن ذلك أيضًا
أداة Lint تعرض التحذير "تعذّر تنظيف ذاكرة التخزين المؤقت في K2"
تحذير Lint "تعذّر تنظيف ذاكرة التخزين المؤقت في K2"
دمج Lint
البيانات غير متوفرة في ذاكرة التخزين المؤقت لمهمة AndroidLintAnalysisTask لدى مورّدي حِزم تطوير Java‏ (JDK) المختلفين أو أرقام الإصدارات الثانوية بسبب الاختلافات في systemPropertyInputs.javaVersion
تستخدم أداة Lint تلقائيًا أحدث حزمة SDK مثبّتة على الرغم من استخدام compileSdk، ولا تسجِّلها كإدخال للمهمة وتوقف التخزين المؤقت
Shrinker (R8)
تعذُّر تنفيذ ميزة "تقليص الموارد" المحسَّنة في R8 بدون إشعار في حال استخدام معرّفات الموارد النهائية