الإصدار 3.6.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android (شباط (فبراير) 2020)
يتطلب هذا الإصدار من مكوّن Android الإضافي ما يلي:
الحد الأدنى للإصدار | الإصدار التلقائي | ملاحظات | |
---|---|---|---|
قاعدة مخروطية | 5.6.4 | 5.6.4 | لمعرفة المزيد من المعلومات، يمكنك الاطّلاع على تحديث Gradle. |
أدوات إنشاء حِزم تطوير البرامج (SDK) | 28.0.3 | 28.0.3 | تثبيت أدوات إنشاء حزمة تطوير البرامج (SDK) أو ضبطها |
يتوافق هذا التحديث الثانوي مع الإعدادات التلقائية الجديدة ميزات لـ مستوى عرض الحِزم في Android 11
راجع ملاحظات الإصدار 4.0.1 للحصول على التفاصيل.
الميزات الجديدة
يتضمّن هذا الإصدار من المكوّن الإضافي لنظام Gradle المتوافق مع Android الإصدار الجديد التالي الجديدة.
ربط العرض
توفر ربط العرض أمان وقت التجميع عند الإشارة إلى طرق العرض في
التعليمة البرمجية. يمكنك الآن استبدال findViewById()
بـ
مرجع فئة الربط الذي يتم إنشاؤه تلقائيًا. لبدء استخدام ربط العرض،
عليك تضمين ما يلي في ملف build.gradle
الخاص بكل وحدة:
android { viewBinding.enabled = true }
android { viewBinding.enabled = true }
لمزيد من المعلومات، يُرجى قراءة مقالة عرض مستندات الربط
إتاحة المكوّن الإضافي Maven Publish
يتضمن المكوّن الإضافي لنظام Gradle المتوافق مع Android دعمًا Maven نشر مكوّن Gradle الإضافي، الذي يسمح لك بنشر عناصر التصميم في مستودع Apache Maven. ينشئ المكوّن الإضافي لنظام Gradle المتوافق مع Android المكوّن لكل عنصر إصدار يمكنك استخدامه في تطبيقك أو في وحدة المكتبة استخدامها لتخصيص جهة النشر إلى مستودع Maven.
لمزيد من المعلومات، انتقِل إلى صفحة كيفية استخدام Maven Publish المكوّن الإضافي.
أداة تلقائية جديدة لتجميع الحزم
عند إنشاء إصدار تصحيح الأخطاء من تطبيقك، يستخدم المكوّن الإضافي
حزمة APK، يُطلق عليها zipflinger، لإنشاء ملف APK. هذا الجديد
تحسين سرعة الإصدار. إذا كانت أداة التغليف الجديدة
لا يعمل كما تتوقع،
يُرجى الإبلاغ عن خطأ. يمكنك العودة إلى
باستخدام أداة التغليف القديمة من خلال تضمين ما يلي في
ملف gradle.properties
:
android.useNewApkCreator=false
إحالة الإصدارات المدمجة مع المحتوى
يمكنك الآن تحديد المدة الزمنية التي يستغرقها كلانج لإنشاء وربط كل ملف C/C++ في مشروعك. بإمكان Gradle الخروج بسجلّ Chrome يحتوي على طوابع زمنية لأحداث التجميع هذه وفهم الوقت المطلوب لإنشاء مشروعك. للحصول على هذا الإصدار يمكنك إجراء ما يلي:
-
إضافة العلامة
-Pandroid.enableProfileJson=true
عند تشغيل إصدار Gradle. مثلاً:gradlew assembleDebug -Pandroid.enableProfileJson=true
-
افتح متصفّح Chrome واكتب
chrome://tracing
. شريط البحث. -
انقر على الزر تحميل وانتقل إلى
<var>project-root</var>/build/android-profile
للعثور على الملف. تتم تسمية الملفprofile-<var>timestamp</var>.json.gz
يمكنك الاطّلاع على بيانات تحديد المصدر للإصدار الأصلي بالقرب من أعلى المُشاهد:
تغييرات السلوك
عند استخدام هذا الإصدار من المكوّن الإضافي، قد تواجه ما يلي للتغيرات في السلوك.
المكتبات الأصلية التي تم جمعها غير مضغوطة بواسطة تلقائي
عند إنشاء تطبيقك، يحدد المكون الإضافي
extractNativeLibs
إلى "false"
بحلول
الافتراضي. بمعنى أن المكتبات الأصلية تتم محاذاة صفحاتها وتجميعها
غير مضغوط. يترتب على ذلك زيادة حجم التحميل، إلا أنّ المستخدمين
يستفيد مما يلي:
- أصغر حجمًا لتثبيت التطبيق لأن النظام الأساسي يمكنه الوصول إلى التطبيق الأصلي من مكتبات APK المثبَّتة مباشرةً، بدون إنشاء نسخة من المكتبات.
- حجم التنزيل أصغر لأنّ ضغط "متجر Play" يكون عادةً يمكن تحسينه عند تضمين مكتبات مدمجة مع المحتوى غير مضغوطة في حزمة APK أو مجموعة حزمات تطبيق Android.
إذا كنت ترغب في ضغط المكوّن الإضافي لنظام Gradle المتوافق مع Android بدلاً من ذلك المكتبات المجمّعة من رموز برمجية أصلية، ضمِّن ما يلي في بيان تطبيقك:
<application
android:extractNativeLibs="true"
... >
</application>
ملاحظة: بيان extractNativeLibs
تم استبدال السمة بـ useLegacyPackaging
DSL
. لمزيد من المعلومات، يُرجى الاطّلاع على ملاحظة الإصدار.
استخدام DSL لإنشاء حزمة مضغوطة
المكتبات المجمّعة من رموز برمجية أصلية
إصدار NDK التلقائي
في حال تنزيل إصدارات متعددة من NDK، المكوّن الإضافي لنظام Gradle المتوافق مع Android
الآن إصدارًا افتراضيًا لاستخدامه في تجميع ملفات رمز المصدر.
في السابق، حدد المكون الإضافي أحدث نسخة تم تنزيلها من NDK.
استخدِم السمة android.ndkVersion
في
build.gradle
لإلغاء المكوّن الإضافي التلقائي الذي اختاره المكوّن الإضافي.
إنشاء فئة R مبسّطة
يعمل المكوّن الإضافي لنظام Gradle المتوافق مع Android على تبسيط مسار فئة التجميع من خلال إنشاء فئة R واحدة فقط لكل وحدة مكتبة في مشروعك ومشاركة فئات R هذه مع تبعيات الوحدة الأخرى. هذا التحسين إلى إنشاء إصدارات أسرع، إلا أن ذلك يتطلب الحفاظ على مع وضع ما يلي في الاعتبار:
- لأن المجمِّع يشارك فئات R مع الوحدة الرئيسية الإضافية، فمن المهم أن تستخدم كل وحدة في مشروعك اسم الحزمة الفريد.
- رؤية فئة R للمكتبة لتبعيات المشروع الأخرى
من خلال التهيئة المستخدمة لتضمين المكتبة
والتبعية. على سبيل المثال، إذا كانت المكتبة أ تشتمل على المكتبة ب على أنها "واجهة برمجة تطبيقات"
والمكتبية والمكتبة أ والمكتبات الأخرى التي تعتمد على المكتبة أ
الوصول إلى فئة R في المكتبة ب. ومع ذلك، قد لا تحتوي المكتبات الأخرى على
الوصول إلى فئة R في المكتبة ب. إذا كانت المكتبة "أ" تستخدم
إعدادات التبعية
implementation
. للتعلّم المزيد، قراءة عن تبعية من الإعدادات.
إزالة الموارد المفقودة من الإعدادات التلقائية الإعدادات
بالنسبة إلى وحدات "المكتبة"، في حال تضمين مرجع للغة
عدم تضمينها في المجموعة الافتراضية للموارد - على سبيل المثال، إذا قمت بتضمين
hello_world
كمورد سلسلة في
/values-es/strings.xml
ولكن لم يتم تحديد هذا المورد فيه
/values/strings.xml
: لم يعُد المكوّن الإضافي لنظام Gradle المتوافق مع Android
هذا المورد عند تجميع مشروعك. هذا التغيير في السلوك
من المفترض أن يؤدي ذلك إلى عدد أقل من Resource Not Found
من استثناءات بيئة التشغيل
وتحسين سرعة الإصدار
يلتزم D8 الآن بسياسة الاحتفاظ بالبيانات في Class. للتعليقات التوضيحية
عند تجميع تطبيقك، سيراعي D8 الآن الحالات التي تنطبق فيها التعليقات التوضيحية على Class. وسياسة الاحتفاظ بالبيانات، ولم تعد هذه التعليقات التوضيحية متاحة وقت التشغيل. ينطبق هذا السلوك أيضًا عند ضبط حزمة تطوير البرامج (SDK) المستهدَفة للتطبيق على المستوى 23 من واجهة برمجة التطبيقات، والذي كان يسمح في السابق بالوصول إلى هذه التعليقات التوضيحية أثناء وقت التشغيل عند تجميع تطبيقك باستخدام إصدارات قديمة من واجهة برمجة التطبيقات Android Gradle المكون الإضافي وD8.
تغييرات أخرى في السلوك
-
لم يعُد تطبيق "
aaptOptions.noCompress
" حسّاسًا لحالة الأحرف على جميع الأجهزة. والأنظمة الأساسية (لكل من حِزم APK والحِزم) وتحترم المسارات التي تستخدم بأحرف كبيرة. -
أصبح ربط البيانات الآن بشكل تدريجي بشكل تلقائي. لمزيد من المعلومات، يُرجى مراجعة المشكلة رقم 110061530.
-
أصبحت جميع اختبارات الوحدات، بما في ذلك اختبارات الوحدات الكهربائية، جاهزة بالكامل للتخزين المؤقت. لمزيد من المعلومات، يُرجى مراجعة المشكلة رقم #115873047.
إصلاح الأخطاء
يتضمّن هذا الإصدار من المكوّن الإضافي لنظام Gradle المتوافق مع Android الخطأ التالي الحلول:
- أصبحت اختبارات الوحدة النمطية متاحة الآن في وحدات المكتبة التي تستخدم وربط البيانات. لمزيد من المعلومات، يُرجى مراجعة المشكلة رقم #126775542.
- يمكنك الآن تنفيذ مهمتَين (
connectedAndroidTest
) على مستوى وحدات متعددة في حين أن واجهة Gradle الموازية وضع التنفيذ.
المشاكل المعروفة
يوضِّح هذا القسم المشاكل المعروفة التي تحدث في المكوّن الإضافي لنظام Gradle المتوافق مع Android. 3.6.0
الأداء البطيء لمهمة Android Lint
يمكن أن يستغرق إكمال أداة Android Lint وقتًا أطول في بعض المشاريع بسبب انخفاض في البنية الأساسية للتحليل، ما يؤدي إلى بطء في العمليات الحسابية الأنواع المستنتَجة لدالة lambda في بُنى رموز معيّنة.
يتم الإبلاغ عن المشكلة باعتبارها خطأ في IDEA وسيتم إصلاحه في الإصدار 4.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android.
لم يتم تضمين فئة البيان {:#agp-hidden-manifest}
إذا حدَّد تطبيقك أذونات مخصّصة في ملف البيان الخاص به، سيتغيّر نظام Android
ينشئ المكوّن الإضافي Gradle عادةً فئة Manifest.java
التي
يتضمن الأذونات المخصصة كثوابت سلسلة. حزم المكونات الإضافية
بهذا الصف بتطبيقك، بحيث يمكنك الرجوع بسهولة أكبر إلى تلك
الأذونات في وقت التشغيل.
إنّ إنشاء فئة البيان غير مفعّل في المكوّن الإضافي 3.6.0 لنظام Gradle المتوافق مع Android.
إذا أنشأت تطبيقك باستخدام هذا الإصدار من المكوّن الإضافي، وكان يشير إلى
فئة البيان، قد ترى العلامة ClassNotFoundException
. لحلّ هذه المشكلة، يمكنك تنفيذ أحد الإجراءات التالية:
-
أشِر إلى الأذونات المخصّصة باستخدام اسمها المؤهّل بالكامل. على سبيل المثال:
"com.example.myapp.permission.DEADLY_ACTIVITY"
-
حدد الثوابت لديك، كما هو موضح أدناه:
public final class CustomPermissions { public static final class permission { public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY"; } }