تحديد المشاكل في التحسين وحلّها

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

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

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

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

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

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

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

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

بما أنّ القواعد يتم تطبيقها من تطبيقك، بالإضافة إلى المكتبات المضمّنة، قد تحتاج إلى توضيح إضافي بشأن القواعد المطبَّقة، أو تحتاج إلى تفسير لسبب احتفاظ 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، يُرجى إبلاغنا عن خطأ.