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

يتطلب هذا الإصدار من مكوّن Android الإضافي ما يلي:

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

يتضمّن هذا الإصدار من المكوّن الإضافي لنظام 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 يحتوي على طوابع زمنية لأحداث التجميع هذه وفهم الوقت المطلوب لإنشاء مشروعك. للحصول على هذا الإصدار يمكنك إجراء ما يلي:

  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 المثبَّتة مباشرةً، بدون إنشاء نسخة من المكتبات.
  • حجم التنزيل أصغر لأنّ ضغط "متجر 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";
                  }
                }