الإصدار 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 | لمزيد من المعلومات، يُرجى الاطّلاع على ضبط إصدار حزمة تطوير البرامج في Java (JDK). |
| المكوّن الإضافي Kotlin Gradle (KGP) | 2.2.10 | 2.2.10 | لمزيد من المعلومات، يُرجى الاطّلاع على تبعية وقت التشغيل في المكوّن الإضافي لنظام Gradle المتوافق مع Kotlin. |
فئات android DSL تنفّذ الآن الواجهات العلنية الجديدة فقط
على مدار السنوات القليلة الماضية، قدّمنا
واجهات جديدة للغة DSL وواجهة برمجة التطبيقات من أجل
التحكّم بشكل أفضل في واجهات برمجة التطبيقات المتاحة للجميع. استمرّ الإصداران 7.x و8.x من المكوّن الإضافي لنظام Gradle المتوافق مع Android في استخدام أنواع 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 |
الوظيفة | الاستبدال |
|---|---|---|
applicationVariantslibraryVariantstestVariantsunitTestVariants
|
نقاط الإضافة للمكوّنات الإضافية من أجل إضافة وظائف جديدة إلى "المكوّن الإضافي لنظام Gradle المتوافق مع Android" |
استبدِل هذه الواجهة بواجهة برمجة التطبيقات
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 |
sdkDirectoryndkDirectorybootClasspathadbExecutableadbExe
|
استخدام مكونات مختلفة من حزمة تطوير البرامج (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 من AGP. هذا يعني أنّ المشاريع التي لا تستخدم العلامة newDsl ستظهر لها تحذيرات بشأن الإيقاف النهائي، بما في ذلك على كتلة android نفسها.
يمكنك أيضًا البدء في الترقية إلى واجهات برمجة التطبيقات الجديدة قبل الترقية إلى الإصدار 9.0 من Android Gradle Plugin. تتوفّر الواجهات الجديدة في العديد من إصدارات AGP، لذا يمكنك استخدام مزيج من الواجهات الجديدة والقديمة. تعرض مستندات مرجع واجهة برمجة التطبيقات لمكوّن Android الإضافي لنظام Gradle واجهة برمجة التطبيقات لكل إصدار من المكوّن الإضافي، ووقت إضافة كل فئة وطريقة وحقل.
نحن نتواصل مع مطوّري المكوّنات الإضافية الشائعة الاستخدام لمساعدتهم في تكييف مكوّناتهم الإضافية وإصدار مكوّنات إضافية متوافقة تمامًا مع الأوضاع الجديدة، وسنواصل تحسين "مساعد ترقية مكوّن 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 من المكوّن الإضافي Kotlin Gradle (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 الذي تريد استخدامه بشكل صريح. |
| يتطلّب الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android تلقائيًا من مستخدمي المكتبة استخدام الإصدار نفسه من حزمة تطوير البرامج (SDK) للتجميع أو إصدار أحدث. |
استخدِم حزمة تطوير برامج (SDK) للتجميع نفسها أو أعلى عند استخدام مكتبة.
إذا لم يكن ذلك ممكنًا، أو إذا أردت منح مستخدمي المكتبة التي تنشرها مزيدًا من الوقت للتبديل، يمكنك ضبط AarMetadata.minCompileSdk بشكل صريح.
|
يتضمّن الإصدار 9.0 من AGP تعديلات على الإعدادات التلقائية التالية لسمات Gradle. يمنحك هذا الخيار إمكانية الحفاظ على سلوك الإصدار 8.13 من AGP عند الترقية:
| الخاصية | الوظيفة | التغيير من الإصدار 8.13 إلى الإصدار 9.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" | الاقتراح |
|---|---|---|---|
android. |
استخدِم واجهات DSL الجديدة بدون عرض عمليات التنفيذ القديمة
للعنصر android.يعني ذلك أيضًا أنّ واجهة برمجة التطبيقات القديمة الخاصة بالصيغ، مثل 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 إلى العودة إلى السلوك في الإصدار 8.13.
|
true ← false |
لا تستخدِم قيود التبعية في كل مكان ما لم تكن بحاجة إليها. يؤدي قبول الإعداد التلقائي الجديد لهذه العلامة أيضًا إلى تفعيل التحسينات في عملية استيراد المشروع، ما يقلّل من وقت الاستيراد لعمليات الإنشاء التي تتضمّن العديد من المشاريع الفرعية لمكتبات Android. |
android. |
تجميع الرموز البرمجية في التطبيقات مقابل فئة R غير نهائية، ما يجعل تجميع التطبيقات متوافقًا مع تجميع المكتبات يؤدي ذلك إلى تحسين التزايد ويمهد الطريق لإجراء تحسينات مستقبلية على الأداء في ما يتعلق بتدفق معالجة الموارد. |
false ← true |
يمكن للعديد من المشاريع اعتماد السلوك الجديد بدون إجراء أي تغييرات على المصدر. إذا تم استخدام حقول فئة R في أي مكان يتطلب ثابتًا، مثل حالات التبديل، يمكنك إعادة تصميم الرمز لاستخدام عبارات if المتسلسلة. |
android. |
يستخدم إصدار حزمة تطوير البرامج (SDK) للتجميع كقيمة تلقائية لإصدار حزمة تطوير البرامج (SDK) المستهدَف في التطبيقات والاختبارات. قبل هذا التغيير، كان إصدار حزمة SDK المستهدَف يتم ضبطه تلقائيًا على الحد الأدنى لإصدار حزمة SDK. |
false ← true |
حدِّد إصدار حزمة تطوير البرامج (SDK) المستهدَف بشكل صريح للتطبيقات والاختبارات. |
android. |
يتم إنشاء مكوّنات اختبار الوحدة فقط لنوع الإصدار الذي تم اختباره. في المشروع التلقائي، يؤدي ذلك إلى إجراء اختبار وحدة واحد لتصحيح الأخطاء، حيث كان السلوك السابق هو إجراء اختبارات الوحدات لتصحيح الأخطاء أو الإصدار. |
false ← true |
إذا كان مشروعك لا يتطلّب إجراء اختبارات لكل من تصحيح الأخطاء والإصدار، فلا يلزم إجراء أي تغيير. |
android. |
يؤدي إلى تعذُّر عملية الإنشاء مع ظهور خطأ في حال عدم توفّر أي من ملفات الاحتفاظ المحدّدة في AGP DSL على القرص. Before this change typos in filenames would result in files being silently ignored. | 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. |
في الإصدار 9.0 من "مكوّن Android الإضافي لنظام Gradle"، لن يتوافق 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. |
بدءًا من الإصدار 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. |
عدم السماح بتمرير موفّري المصادر التي تم إنشاؤها باستخدام
AndroidSourceSet
DSL.
|
false ← true |
استخدِم واجهة برمجة التطبيقات
Sources
على androidComponents لتسجيل المصادر التي تم إنشاؤها.
|
android. |
يتطلّب ذلك ضبط مسار برنامج تجميع أدوات التظليل بشكل صريح في
local.properties
إذا كان تجميع أدوات التظليل مفعَّلاً.
|
false ← true |
أضِف glslc.dir=/path/to/shader-tools إلى local.properties لمشروعك.
|
الميزات التي تمت إزالتها
يزيل الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android الوظائف التالية:
- إتاحة تطبيقات Wear OS المضمّنة
يزيل الإصدار 9.0 من AGP إمكانية تضمين تطبيقات Wear OS، وهو أمر لم يعُد متاحًا في Play. ويشمل ذلك إزالة إعداداتwearAppوAndroidSourceSet.wearAppConfigurationNameDSL. يُرجى الاطّلاع على صفحة النشر على 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 الذي يستخدم هذه المَعلمات أو طرق الحظر. على سبيل المثال، تم تعديل المكوّن الإضافي التالي لإزالة مَعلمة النوع وعدم الاعتماد على طرق الحظر التي تمت إزالتها:
الإصدار 8.13 من AGP
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }الإصدار 9.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
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 ما يلي:
AndroidSourceSet.jni، لأنّه لم يكن يعمل.AndroidSourceSet.wearAppConfigurationName، لأنّها تتعلّق بإزالة ميزة إتاحة تطبيقات Wear OS المضمّنة.BuildType.isRenderscriptDebuggable، لأنّه لم يكن يعمل.DependencyVariantSelection. تم استبداله بـDependencySelection، والذي يتم عرضه على نحوkotlin.android.localDependencySelectionInstallation.installOptions(String). تم استبداله بالسمة القابلة للتغييرInstallation.installOptions.كتلة
PostProcessingالتجريبية التي لم يتم تثبيتها مطلقًاProductFlavor.setDimension، والتي تم استبدالها بالسمةdimension
LanguageSplitOptions، الذي كان مفيدًا فقط في تطبيقات Google Play الفورية، التي تم إيقافها نهائيًا.DensitySplit، لأنّ الميزة لم تعُد متاحة. والبديل هو استخدام حِزم التطبيقات.
واجهات برمجة التطبيقات التي تمت إزالتها
يزيل الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android ما يلي:
AndroidComponentsExtension.finalizeDSl. تم استبداله بـfinalizeDslComponent.transformClassesWith. تم استبداله بـInstrumentation.transformClassesWithComponent.setAsmFramesComputationMode. تم استبداله بـInstrumentation.setAsmFramesComputationModeComponentBuilder.enabled. تم استبداله بـComponentBuilder.enable.DependenciesInfoBuilder.includedInApk. تم استبداله بـincludeInApkDependenciesInfoBuilder.includedInBundle. تم استبداله بـincludeInBundleGeneratesApk.targetSdkVersion: تم استبداله بـtargetSdkVariant.minSdkVersion: تم استبداله بـminSdkVariant.maxSdkVersion: تم استبداله بـmaxSdkVariant.targetSdkVersion: تم استبداله بـtargetSdkVariant.unitTest، لأنّه لا ينطبق على المكوّن الإضافيcom.android.test. يتوفّرunitTestفي الأنواع الفرعيةVariantBuilderالتي تمدّدHasUnitTest.VariantBuilder.targetSdkوtargetSdkPreview، لأنّهما لم يكونا مفيدَين في المكتبات. يُرجى استخدامGeneratesApkBuilder.targetSdkأوGeneratesApkBuilder.targetSdkPreviewبدلاً من ذلك.VariantBuilder.enableUnitTest، لأنّه لا ينطبق على المكوّن الإضافيcom.android.test. يتوفّرenableUnitTestفي الأنواع الفرعيةVariantBuilderالتي تمدّدHasUnitTestBuilder.VariantBuilder.unitTestEnabledis removed in favor of the more consistently namedenableUnitTeston theVariantBuildersubtypes extendingHasUnitTestBuilder.VariantOutput.enable: تم استبداله بـenabledالسمتان
FeaturePluginوFeatureExtensionاللتان تم إيقافهما نهائيًا.واجهات برمجة التطبيقات
BaseExtension.registerTransformالتي تم إيقافها أو إزالتها نهائيًا، والتي كانت متاحة فقط للسماح بالتجميع باستخدام أحدث إصدار من "مكوّن Android الإضافي" مع استهداف الإصدار 4.2 أو الإصدارات الأقدم من "مكوّن Android الإضافي"
خصائص Gradle التي تمت إزالتها
تمت إضافة سمات Gradle التالية في البداية كطرق لإيقاف الميزات التي تم تفعيلها تلقائيًا على مستوى العالم.
تم إيقاف هذه الميزات تلقائيًا منذ الإصدار 8.0 من "مكوّن Android الإضافي لـ Gradle" أو الإصدارات الأقدم. يمكنك تفعيل هذه الميزات في المشاريع الفرعية التي تستخدمها فقط لإنشاء إصدار أكثر كفاءة.
| الخاصية | الوظيفة | الاستبدال |
|---|---|---|
android. |
يتيح هذا الإعداد تجميع AIDL في جميع المشاريع الفرعية |
فعِّل تجميع AIDL في المشاريع الفرعية التي تحتوي على مصادر AIDL فقط من خلال ضبط السمة التالية في ملفات تصميم Gradle الخاصة بتلك المشاريع:
android {
buildFeatures {
aidl = true
}
} |
android. |
يتيح تجميع RenderScript في جميع المشاريع الفرعية |
فعِّل تجميع renderscript في المشاريع الفرعية التي تحتوي على مصادر renderscript فقط من خلال ضبط السمة التالية في ملفات إصدار Gradle لهذه المشاريع:
android {
buildFeatures {
renderScript = true
}
} |
خصائص Gradle المفروضة
يعرض الإصدار 9.0 من AGP خطأً في حال ضبط سمات Gradle التالية.
لن يعمل مساعد ترقية المكوّن الإضافي لنظام Gradle المتوافق مع Android على ترقية المشاريع إلى الإصدار 9.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android التي تستخدم هذه السمات.
| الخاصية | الوظيفة |
|---|---|
android. |
يتم الآن تشغيل ميزة "تقليص الموارد" دائمًا كجزء من R8، وقد تمت إزالة عملية التنفيذ السابقة. |
android. |
تستخدم ميزة "تقليص الموارد" الآن دائمًا تقليص الموارد بدقة، ما يتيح إزالة المزيد من الموارد. |
تغييرات R8
تم تضمين تغييرات R8 التالية في الإصدار 9.0.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android.
خيار إعداد جديد: -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، لن تنطبق قواعد الاحتفاظ على الأساليب المصاحبة. يتوافق ذلك مع حقيقة أنّ قواعد الاحتفاظ لا تنطبق على الحقول أو الطرق أو الفئات الأخرى التي تم إنشاؤها بواسطة برنامج التجميع.
من خلال نقل وحدات بت عدم السماح بالتحسين وعدم السماح بالتقليص إلى الطرق المصاحبة، كانت حالة الاستخدام التالية متاحة في السابق:
- تجميع مكتبة تتضمّن طرق واجهة
default/static/privateفي DEX معminSdk< 24 وقواعد تحتفظ بطرق الواجهة - تجميع تطبيق باستخدام المكتبة في مسار الفئة و
-applymapping - دمج التطبيق والمكتبة
يُرجى العِلم أنّ هذا الإجراء لا يعمل إلا مع -applymapping لأنّه لا يتم نقل الجزء disallow
obfuscation إلى الطرق المصاحبة، أي أنّ الفئات المصاحبة التي تم إنشاؤها من الخطوة 1 ستتضمّن أسماء طرق مخفية.
لن تكون حالة الاستخدام هذه متاحة بعد الآن للإصدارات الأقدم من minSdk <
24. الحلّ البديل هو تنفيذ ما يلي:
- تحويل المكتبة باستخدام طرق واجهة
default/static/privateإلى ملفات فئة باستخدامminSdk< 24. - تجميع العناصر التي تمت إزالة التجميل اللغوي منها باستخدام R8 والقواعد التي تحتفظ بطُرق الواجهة في الفئات المصاحبة
- جمِّع التطبيق باستخدام المكتبة في مسار الفئة.
- دمج التطبيق مع العنصر الذي تمت إزالة التجميل اللغوي منه
ومن الآثار الجانبية الأخرى لذلك أنّه لم يعُد من الممكن الاحتفاظ بسمات الفئة الداخلية والطريقة المضمّنة للفئات المجهولة والمحلية داخل طرق الواجهة المصاحبة.
تغيير ملف المصدر التلقائي الذي تم إصداره إلى r8-map-id-<MAP_ID>
يسري هذا التغيير في الإصدار 8.12.0 من "مكوّن Android Gradle الإضافي".
تتغيّر سمة ملف المصدر التلقائية المنبعثة للفئة من
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 من المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP) أداة L8 (إزالة التجميل اللغوي من المكتبة الأساسية) بحيث يستخدم ملف DEX الذي يحتوي على جميع فئات j$ تنسيقًا جديدًا ومختصرًا لأسماء الفئات الاصطناعية. يستخدم اسم الفئة الجديد معرّفًا رقميًا (على سبيل المثال، $1).
إزالة إمكانية استخدام -addconfigurationdebugging
يزيل الإصدار 9.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" إمكانية استخدام -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 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| دمج Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Shrinker (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||