حلّ مشاكل التحسين

بما أنّ تحسينات R8 تعدِّل رمز تطبيقك، من المهم إجراء اختبارات مكثّفة لسلوك تطبيقك للتأكّد من أنّه يعمل على النحو المتوقّع. في حال حدوث سلوك غير متوقّع، استخدِم هذه الصفحة كدليل لتحديد المشاكل المحتمَلة وحلّها بعد التحسين. لمزيد من المعلومات عن القواعد التي يمكنك استخدامها لتحديد المشاكل وحلّها في عملية التحسين، يُرجى الاطّلاع على مقالة استخدام القواعد لتحديد المشاكل وحلّها في عملية التحسين.

أثناء تحديد المشاكل وحلّها، ركِّز على الحالات التالية:

  • التحسين المفرط الذي يؤدي إلى تعطُّل التطبيق: يتعطّل تطبيقك لأنّ R8 حسّن الكثير من الرموز البرمجية.
  • التحسين غير الواضح أو غير الكافي: لم يحسِّن R8 تطبيقك بقدر ما توقّعت أو تحتاج إلى مزيد من التوضيحات بشأن التحسينات.

أعطال التطبيق

إذا تعطّل تطبيقك بعد تحسينه باستخدام R8، يكون ذلك عادةً بسبب الانعكاس المعطّل. لتحديد الانعكاس المعطّل، اتّبِع الإرشادات التالية:

  • يظهر لك استثناء يعني أنّه يتم استخدام الفئة أو الطريقة أو الحقل المشار إليه من خلال الانعكاس. عادةً ما تكون هذه الاستثناءات أحد ما يلي: ClassNotFoundException أو NoSuchMethodException أو NoSuchFieldException أو NoClassDefFoundError أو NoSuchMethodError أو NoSuchFieldError.
  • يظهر لك رمز يشير إلى الانعكاس باستخدام import kotlin.reflect.* أو import java.lang.reflect.*.
  • يظهر لك استخدام منشئ فئة على النحو التالي: Something::class.constructors.
  • يظهر لك Class.forName(...).

الحلّ: أضِف قاعدة الاحتفاظ بالبيانات.

إذا كان الرمز البرمجي الخاص بك هو الذي ينفّذ الانعكاس، يمكنك إضافة تعليقات Jetpack Keep التوضيحية إلى هذا الرمز بدلاً من إضافة قاعدة الاحتفاظ بالبيانات. تضع عمليات التحقّق من أخطاء Jetpack Keep lint علامة أيضًا على طلبات الانعكاس الأخرى التي لم تتم إضافة تعليقات توضيحية إليها، ما يساعدك في منع حدوث أعطال مماثلة.

التحسين غير الواضح أو غير الكافي

بما أنّه يتم تطبيق القواعد من تطبيقك ومن المكتبات المضمّنة، قد تحتاج إلى مزيد من الوضوح بشأن القواعد المطبّقة، أو تحتاج إلى تفسير لسبب احتفاظ R8 بأقسام معيّنة من الرمز البرمجي التي توقّعت تحسينها.

  • الغموض بشأن القواعد المطبّقة: بما أنّ القواعد من المكتبات المضمّنة تنطبق أيضًا على تطبيقك، وتنتقل الخيارات العامة من هذه المكتبات أيضًا إلى تطبيقك، قد لا تكون متأكدًا من القواعد المطبّقة.

    الحلّ: اطّلِع على القواعد المطبّقة من خلال عرض تقرير جميع الـ قواعد التي يطبّقها R8 عند إنشاء مشروعك. يمكنك العثور على هذا التقرير في ./app/build/outputs/mapping/configuration.txt. يحتوي هذا التقرير على جميع القواعد المدمَجة من كل مكتبة ووحدة تم استخدامها لضبط R8، ويمكن استخدامه لتحديد القواعد غير الفعّالة.

  • الاحتفاظ بالكثير من الرموز البرمجية: قد يحتفظ تحسين R8 بالرموز البرمجية التي توقّعت إزالتها.

    الحلّ: استخدِم خيار الإعداد -whyareyoukeeping للمساعدة في فهم سبب الاحتفاظ بالرمز البرمجي. يحتوي الناتج على مسار من الرمز البرمجي المحتفظ به إلى إحدى نقاط دخول تطبيقك. لمزيد من المعلومات، يُرجى الاطّلاع على -whyareyoukeeping.

  • صعوبة فهم تتبُّع تسلسل استدعاء الدوال البرمجية الأصلي: يغيِّر R8 الرمز البرمجي بطرق مختلفة، ما يجعل تتبُّع تسلسل استدعاء الدوال البرمجية لم يعُد يشير إلى الرمز البرمجي الأصلي. على سبيل المثال، يمكن أن تتغيّر أرقام الأسطر وأسماء الفئات والطرق.

    الحلّ: بدءًا من الإصدار 3 من Android Studio Otter Feature Drop والإصدار 9.0 من "مكوّن Android الإضافي لبرنامج Gradle"، يزيل Logcat تلقائيًا الغموض عن تتبُّع تسلسل استدعاء الدوال. ومع ذلك، إذا كنت تستخدم إصدارًا سابقًا من "استوديو Android"، عليك استرداد تتبُّع تسلسل استدعاء الدوال البرمجية الأصلي يدويًا. لاسترداد تتبُّع تسلسل استدعاء الدوال البرمجية الأصلي، استخدِم الـ retrace أداة سطر الأوامر المضمّنة في حزمة الـ أدوات سطر الأوامر.

    لاستخدام retrace، عليك تزويد الأمر بمسار إلى ملف ربط وملف تتبع تسلسل استدعاء الدوال البرمجية. يتم تلقائيًا تضمين ملف الربط، الذي يُسمى mapping.txt، في "مجموعة حزمات تطبيق Android" ‏ (AAB). لمزيد من التفاصيل، يُرجى الاطّلاع على مستندات أداة retrace ومقالة مركز مساعدة Play Console حول كيفية إزالة التشويش عن تتبّع تسلسل استدعاء الدوال البرمجية لتعطُّل التطبيق. عند استخدام Play وFirebase Crashlytics، استخدِم ملف mapping.txt مع الأعطال التي تجمعها الخدمة من مستخدِمي التطبيق. يوضّح الأمر التالي كيفية تشغيل retrace من جذر مشروعك:

    $ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
    

الإبلاغ عن الأخطاء

إذا لم تتمكّن من حلّ مشكلة في R8، أبلِغ عن خطأ.