يُجري R8 تلقائيًا الكثير من التحسينات لتحسين الأداء والحجم، ولكن قد لا تعمل التحسينات على تطبيقك على الفور. إذا كنت بصدد تفعيل ملف ريبوست 8 (أو تفعيل الوضع الكامل) في تطبيق كبير لأول مرة، حاوِل استخدام التحسينات بشكل تدريجي: أوقِف تشويش الرموز البرمجية مؤقتًا و فعِّل ملف ريبوست 8 لأجزاء من الرموز البرمجية في كل مرة، بدلاً من تفعيله لكل الرموز البرمجية في تطبيقك. ننصحك باتّباع هذا النهج التدريجي أثناء التطوير على الجهاز، ولكن يمكنك أيضًا استخدامه أثناء اختبار ضمان الجودة الداخلي أو حتى في قناة الإصدار العلني كطرحgradual. تعتمد الخطوات الدقيقة التي تتّخذها على الجدول الزمني المطلوب و مستوى ثقتك في تغطية اختبار الإصدار التجريبي.
الحدّ من عمليات التحسين
يُجري 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 بشكل كبير ويتسبّب في مشاكل في
التحسين، فإنّ الحلّ المثالي هو إضافة المزيد من
قواعد الاحتفاظ المستهدفة أو الانتقال إلى حلّ codegen. ولكن
لإزالة حظر تحسين بقية أجزاء التطبيق، يمكنك وضع الرمز الذي يحدِّد
أنواع Gson في حزمة فرعية مخصّصة، وإضافة قاعدة مثل هذه إلىملف
proguard-rules.pro
:
-keep class com.myapp.json.** { *; }
إذا كانت بعض المكتبات التي تستخدمها تتضمّن تأمل في المكونات الداخلية، يمكنك إضافة قاعدة الاحتفاظ بالمكتبة بأكملها بالطريقة نفسها. عليك فحص رمز المكتبة أو حزمة JAR/AAR للعثور على الحزمة المناسبة للاحتفاظ بها. يُرجى العلم أنّه لا يُنصح بالاحتفاظ بهذه الإعدادات على المدى الطويل، ولكن يمكنها إزالة الحظر عن تحسين بقية أجزاء التطبيق:
-keep class com.somelibrary.** { *; }
إزالة قواعد الاحتفاظ بالبيانات على مستوى الحزمة
بعد أن يعمل تطبيقك بشكل صحيح باستخدام قواعد الاحتفاظ على مستوى الحزمة، عليك الرجوع وإضافة قواعد الاحتفاظ المستهدفة أو إزالة استخدام الاستكشاف أو المكتبة التي تتطلّب قاعدة الاحتفاظ في المقام الأول.
على سبيل المثال، من الشائع جدًا الاحتفاظ بجميع القواعد التي تُوسِّع فئة معيّنة في AndroidX للاحتفاظ بالفئات ذات الصلة فقط. بشكل عام، يجب أن تستهدف ميزة "التفكير" فقط الفئات أو الطرق التي تُنشئ فئات مجردة معيّنة، أو تنفِّذ واجهات معيّنة، أو تستهدف فئات تتضمّن تعليقًا توضيحيًا معيّنًا أثناء التشغيل. كلّ من هذه الطرق مسموح بها لتحديد قواعد الاحتفاظ كي لا تحتاج إلى قواعد الاحتفاظ على مستوى الحزمة في تطبيقك النهائي المحسَّن بالكامل.