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

يتطلّب هذا الإصدار ما يلي:

الإصدار الأدنى الإصدار التلقائي ملاحظات
Gradle 5.6.4 5.6.4 لمزيد من المعلومات، اطّلِع على تحديث Gradle.
أدوات تصميم حزمة تطوير البرامج (SDK) 28.0.3 28.0.3 تثبيت أو ضبط أدوات إنشاء حزمة تطوير البرامج (SDK).

الميزات الجديدة

يتضمّن هذا الإصدار من المكوّن الإضافي لنظام Gradle المتوافق مع Android الميزات الجديدة التالية.

عرض الربط

توفّر ميزة "ربط الملفات الشخصية" أمانًا في وقت التجميع عند الإشارة إلى الملفات الشخصية في الرمز البرمجي. يمكنك الآن استبدال findViewById() بمرجع فئة الربط الذي تم إنشاؤه تلقائيًا. لبدء استخدام ميزة "عرض الروابط"، يُرجى تضمين ما يلي في ملف build.gradle لكل وحدة:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

لمزيد من المعلومات، يُرجى الاطّلاع على مستندات View Binding.

إتاحة المكوّن الإضافي Maven Publish

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

لمزيد من المعلومات، انتقِل إلى الصفحة التي تتناول كيفية استخدام مكوّن Maven Publish الإضافي.

أداة حزم تلقائية جديدة

عند إنشاء إصدار تصحيح الأخطاء من تطبيقك، يستخدم المكوّن الإضافي أداة حزم جديدة تُسمى zipflinger لإنشاء حزمة APK. من المفترض أن توفّر هذه الأداة الجديدة تحسينات في سرعة الإنشاء. إذا لم تعمل أداة الحزم الجديدة على النحو المتوقّع، يُرجى الإبلاغ عن خطأ. يمكنك العودة إلى استخدام أداة الحزم القديمة من خلال تضمين ما يلي في ملف gradle.properties:

        android.useNewApkCreator=false
      

تحديد مصدر الإصدار الأصلي

يمكنك الآن تحديد المدة التي يستغرقها Clang لإنشاء كل ملف C/C++‎ وربطه في مشروعك. يمكن لـ Gradle إخراج تتبُّع Chrome الذي يحتوي على طوابع زمنية لأحداث برنامج التجميع هذه حتى تتمكّن من فهم الوقت المطلوب لإنشاء مشروعك بشكل أفضل. لإخراج ملف تحديد مصدر الإصدار هذا، اتّبِع الخطوات التالية:

  1. أضِف العلامة -Pandroid.enableProfileJson=true عند تشغيل إصدار Gradle. على سبيل المثال:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. افتح متصفّح Chrome واكتب chrome://tracing في شريط البحث.

  3. انقر على الزر تحميل وانتقِل إلى <var>project-root</var>/build/android-profile للعثور على الملف. اسم الملف هو profile-<var>timestamp</var>.json.gz.

يمكنك الاطّلاع على بيانات تحديد المصدر الأصلية للإصدار بالقرب من أعلى عارض البيانات:

تتبُّع مصدر الإصدار الأصلي في Chrome

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

عند استخدام هذا الإصدار من المكوّن الإضافي، قد تلاحظ التغييرات التالية في السلوك.

المكتبات المجمّعة من رموز برمجية أصلية يتم تجميعها بدون ضغط بشكل تلقائي

عند إنشاء تطبيقك، يضبط المكوّن الإضافي الآن extractNativeLibs على "false" تلقائيًا. أي أنّه تتم محاذاة صفحات المكتبات المجمّعة من رموز برمجية أصلية وتجميعها بدون ضغط. على الرغم من أنّ ذلك يؤدي إلى زيادة حجم التحميل، يستفيد المستخدمون من المزايا التالية:

  • حجم تثبيت التطبيق أصغر لأنّ النظام الأساسي يمكنه الوصول إلى المكتبات المجمّعة من رموز برمجية أصلية مباشرةً من حزمة APK المثبَّتة، بدون إنشاء نسخة من المكتبات.
  • حجم تنزيل أصغر لأنّ ضغط &quot;متجر Google Play&quot; يكون عادةً أفضل عند تضمين مكتبات مجمّعة من رموز برمجية أصلية غير مضغوطة في حزمة APK أو مجموعة حزمات تطبيق Android.

إذا أردت أن يقوم المكوّن الإضافي لنظام Gradle المتوافق مع Android بتجميع المكتبات المجمّعة من رموز برمجية أصلية والمضغوطة، أضِف ما يلي إلى ملف بيان تطبيقك:

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

ملاحظة: تم استبدال سمة البيان extractNativeLibs بخيار DSL‏ useLegacyPackaging. لمزيد من المعلومات، يُرجى الاطّلاع على ملاحظة الإصدار استخدام DSL لإنشاء حِزم من المكتبات المجمّعة من رموز برمجية أصلية والمضغوطة.

إصدار NDK التلقائي

إذا نزّلت إصدارات متعددة من NDK، سيختار المكوّن الإضافي لنظام Gradle المتوافق مع Android الآن إصدارًا تلقائيًا لاستخدامه في تجميع ملفات الرموز المصدر. في السابق، كان المكوّن الإضافي يختار أحدث إصدار تم تنزيله من NDK. استخدِم السمة android.ndkVersion في ملف build.gradle الخاص بالوحدة لتجاوز الإعداد التلقائي الذي اختاره المكوّن الإضافي.

إنشاء فئة R مبسّطة

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

  • بما أنّ برنامج التجميع يشارك فئات R مع تبعيات الوحدات في المصدر، من المهم أن تستخدم كل وحدة في مشروعك اسم حزمة فريدًا.
  • يتم تحديد مستوى ظهور فئة R الخاصة بالمكتبة لتبعيات المشروع الأخرى من خلال الإعدادات المستخدَمة لتضمين المكتبة كـ تبعية. على سبيل المثال، إذا كانت المكتبة "أ" تتضمّن المكتبة "ب" كاعتمادية "api"، سيكون بإمكان المكتبة "أ" والمكتبات الأخرى التي تعتمد على المكتبة "أ" الوصول إلى فئة 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.

  • أصبحت جميع اختبارات الوحدات، بما في ذلك اختبارات وحدات Roboelectric، قابلة للتخزين المؤقت بالكامل. لمزيد من المعلومات، يُرجى الاطّلاع على المشكلة رقم 115873047.

إصلاح الأخطاء

يتضمّن هذا الإصدار من المكوّن الإضافي لنظام Gradle المتوافق مع Android إصلاحات الأخطاء التالية:

  • أصبحت اختبارات وحدات Robolectric متاحة الآن في وحدات المكتبة التي تستخدم ربط البيانات. لمزيد من المعلومات، يمكنك الاطّلاع على المشكلة رقم 126775542.
  • يمكنك الآن تنفيذ مهام connectedAndroidTest في وحدات متعددة أثناء تفعيل وضع التنفيذ المتوازي في Gradle.

المشاكل المعروفة

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

بطء أداء مهمة Android Lint

قد يستغرق Android Lint وقتًا أطول بكثير لإكمال بعض المشاريع بسبب تراجع في البنية الأساسية للتحليل، ما يؤدي إلى بطء في احتساب الأنواع المستنتَجة لدوال lambda في بعض بُنى الرموز البرمجية.

تم الإبلاغ عن المشكلة على أنّها خطأ في IDEA وسيتم إصلاحها في الإصدار 4.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android.

فئة Manifest غير متوفّرة {:#agp-missing-manifest}

إذا كان تطبيقك يحدّد أذونات مخصّصة في ملف البيان، ينشئ المكوّن الإضافي لنظام Gradle المتوافق مع Android عادةً فئة 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";
                  }
                }