تُجري أداة R8 تلقائيًا الكثير من عمليات التحسين لتحسين الأداء والحجم، ولكن قد لا تعمل عمليات التحسين هذه على تطبيقك على الفور. إذا كنت بصدد تفعيل أداة R8 (أو تفعيل الوضع الكامل) في تطبيق كبير للمرة الأولى، حاوِل اعتماد عمليات التحسين بشكل تدريجي: أوقِف التشويش مؤقتًا وفعِّل أداة R8 لأجزاء من الرمز البرمجي في كل مرة، بدلاً من تفعيلها لكل الرمز البرمجي في تطبيقك. ننصحك باتّباع هذا النهج التدريجي أثناء التطوير المحلي، ولكن يمكنك أيضًا استخدامه أثناء اختبار تأكيد الجودة الداخلي أو حتى في مرحلة الإصدار العلني كـ طرح تدريجي. تعتمد الخطوات الدقيقة التي تتّخذها على الجدول الزمني المطلوب وثقتك في تغطية الاختبار قبل الإصدار.
الحدّ من عمليات التحسين
تُجري أداة R8 أنواعًا عديدة من عمليات التحسين، بما في ذلك إزالة الرمز البرمجي وإعادة كتابته وإزالة الموارد. في ما يلي بعض الأوصاف عالية المستوى لأنواع عمليات التحسين:
- تخفيض حجم الرموز (أو إزالة الرمز البرمجي غير المستخدَم): يؤدي إلى إزالة الرمز البرمجي غير المُشار إليه
- التشويش (أو تصغير المعرّفات): يؤدي إلى تقصير أسماء الفئات والطرق
- التحسين: يؤدي إلى إعادة كتابة الرمز البرمجي، مثلاً من خلال التضمين
للحدّ من احتمالية حدوث الأخطاء، يمكنك البدء بتفعيل بعض عمليات التحسين هذه فقط.
تفعيل ميزة "إزالة الرمز البرمجي غير المستخدَم" فقط
تؤدي ميزة تخفيض حجم الرموز، المعروفة أيضًا باسم إزالة الرمز البرمجي غير المستخدَم، إلى إزالة الرمز البرمجي الذي يبدو أنّه غير مُشار إليه. ننصحك بالبدء بميزة "إزالة الرمز البرمجي غير المستخدَم" فقط، لأنّها الأسهل.
لتفعيل ميزة "إزالة الرمز البرمجي غير المستخدَم" فقط، أضِف ما يلي إلى ملف proguard-rules.pro لإيقاف الأنواع الأخرى من عمليات التحسين. إنّ إيقاف التشويش أمر أساسي لأنّه يجعل تتبُّع تسلسل استدعاء الدوال البرمجية أسهل بكثير للقراءة.
-dontobfuscate // Use temporarily to turn off identifier minification
-dontoptimize // Use temporarily to turn off optimization
في النهاية، لن تريد شحن هذا الإعداد، لأنّه يحدّ بشكل كبير من قدرة أداة R8 على تحسين الرمز البرمجي، ولكنّه نقطة بداية رائعة عند اعتماد أداة R8 للمرة الأولى في قاعدة رموز برمجية كبيرة تتضمّن مشاكل يجب حلّها.
استخدام وضع التوافق
تُشغّل أداة R8 تلقائيًا في الوضع الكامل. يوفّر الوضع الكامل أداءً أفضل بكثير ويقلّل الحجم بشكل كبير، ولكن يمكنك إيقافه مؤقتًا واستخدام وضع التوافق بدلاً منه عند تفعيل التصغير للمرة الأولى.
لاستخدام وضع التوافق، استخدِم الإعداد التالي في ملف gradle.properties:
android.enableR8.fullMode = false // Use temporarily to disable full mode
تفعيل بقية عمليات التحسين
بعد التأكّد من أنّ ميزة "إزالة الرمز البرمجي غير المستخدَم" تعمل على تطبيقك، يمكنك إزالة الإعدادات السابقة لإعادة تفعيل التشويش والتحسين والوضع الكامل لأداة R8. يُرجى العِلم أنّ التشويش يمكن أن يجعل عملية تصحيح الأخطاء أكثر صعوبة، ولهذا السبب ننصحك بمعالجة مشاكل ميزة "إزالة الرمز البرمجي غير المستخدَم" أولاً.
لمزيد من المعلومات عن إزالة تشويش تتبُّع تسلسل استدعاء الدوال البرمجية، يُرجى الاطّلاع على مقالة استرداد تتبُّع تسلسل استدعاء الدوال البرمجية الأصلي.
الحدّ من نطاق التحسين
يؤدي الإصدار المحسّن بالكامل إلى تحسين كل الرمز البرمجي في كل مكتبة وحزمة، لذا من الشائع مواجهة مشاكل في أداة R8 عند تفعيلها للمرة الأولى. إذا وجدت مشكلة في التحسين في جزء واحد من التطبيق، لا توقِف أداة R8 تمامًا وإلا ستفقد المزايا في كل مكان آخر. بدلاً من ذلك، أوقِف أداة R8 مؤقتًا في أجزاء تطبيقك التي تسبّب مشاكل فقط.
استخدام قواعد الاحتفاظ على مستوى الحزمة
ننصحك باستخدام قواعد الاحتفاظ على مستوى الحزمة كطريقة لإيقاف أداة R8 مؤقتًا في أجزاء من تطبيقك. يجب أن تعود دائمًا لإصلاح مشاكل التحسين هذه لاحقًا، فهذا الحلّ هو حلّ مؤقت بشكل عام لتجنُّب المناطق التي تتضمّن مشاكل.
على سبيل المثال، إذا كان جزء من تطبيقك يستخدم مكتبة Gson بشكل كبير ويسبّب مشاكل في
التحسين، فإنّ الحلّ المثالي هو إضافة قواعد احتفاظ أكثر
استهدافًا أو الانتقال إلى حلّ لإنشاء الرمز البرمجي. ولكن لإلغاء حظر تحسين بقية التطبيق، يمكنك وضع الرمز البرمجي الذي يحدّد أنواع Gson في حزمة فرعية مخصّصة، وإضافة قاعدة مثل هذه إلى ملف proguard-rules.pro:
-keep class com.myapp.json.** { *; }
إذا كانت إحدى المكتبات التي تستخدمها تتضمّن انعكاسًا في المكوّنات الداخلية ، يمكنك إضافة قاعدة احتفاظ للمكتبة بأكملها بشكل مماثل. عليك فحص الرمز البرمجي للمكتبة أو ملف JAR/AAR للعثور على الحزمة المناسبة التي تريد الاحتفاظ بها. مرة أخرى، لا يُنصح بالاحتفاظ بهذه القاعدة على المدى الطويل، ولكن يمكن أن يؤدي ذلك إلى إلغاء حظر تحسين بقية التطبيق:
-keep class com.somelibrary.** { *; }
إزالة قواعد الاحتفاظ على مستوى الحزمة
بعد أن يعمل تطبيقك بشكل صحيح باستخدام قواعد الاحتفاظ على مستوى الحزمة، عليك العودة وإضافة قواعد احتفاظ مستهدَفة أو إزالة استخدام الانعكاس أو المكتبة التي تستدعي قاعدة الاحتفاظ في المقام الأول.
على سبيل المثال، من الشائع جدًا في AndroidX الاحتفاظ بجميع القواعد التي توسّع فئة معيّنة للاحتفاظ بالفئات ذات الصلة فقط. بشكل عام، يجب أن يستهدف الانعكاس الفئات أو الطرق التي توسّع فئات مجرّدة معيّنة أو تنفّذ واجهات معيّنة أو تستهدف فئات تتضمّن تعليقًا توضيحيًا معيّنًا في وقت التشغيل. كل هذه الطرق هي طرق معتمَدة لتحديد قواعد الاحتفاظ حتى لا تحتاج إلى قواعد الاحتفاظ على مستوى الحزمة في تطبيقك النهائي المحسّن بالكامل.
إذا كان الانعكاس موجودًا في قاعدة الرموز البرمجية الخاصة بك، يمكنك استبدال قواعد الاحتفاظ على مستوى الحزمة بميزة Jetpack Keep. القواعد التي يتم إنشاؤها مشروطة: تحتفظ أداة R8 بهدف استدعاء انعكاسي فقط إذا كانت تحتفظ أيضًا بالرمز البرمجي الذي يُجري الاستدعاء. لنقل حزمة، استخدِم عمليات التحقّق من أخطاء Jetpack Keep lint للعثور على استدعاءاتها الانعكاسية وإضافة تعليقات توضيحية إليها، ثم أزِل القاعدة على مستوى الحزمة.