كيف استخدمت Reddit أداة التحسين R8 لتحقيق تحسينات كبيرة في الأداء
مدّة القراءة: 4 دقائق
في عالم تطبيقات الأجهزة الجوّالة اليوم، لا تُعدّ تجربة المستخدم السلسة ميزة فحسب، بل هي ضرورة. يمكن أن تشكّل سرعات التحميل البطيئة والواجهات غير المستجيبة وعدم الاستقرار عوائق كبيرة أمام تفاعل المستخدمين والاحتفاظ بهم. أثناء عمل فريق الهندسة في Reddit مع فريق علاقات المطوّرين في Android، استخدم الفريق مقياس أداء التطبيق لتقييم التطبيق. وبعد تقييم الأداء، رصد الفريق إمكانية تحسين كبيرة وقرّر اتّخاذ الخطوات اللازمة للاستفادة من الإمكانات الكاملة لأداة R8، وهي أداة تحسين تطبيقات Android. أدّت هذه المبادرة المركّزة إلى تحسينات ملحوظة في أوقات بدء التشغيل، وانخفاض في اللقطات البطيئة أو المجمدة وأخطاء ANR، وزيادة عامة في التقييمات على "متجر Google Play". توضّح دراسة الحالة هذه كيف حقّق Reddit هذه النتائج الرائعة.
كيف ساعدت أداة تحسين R8 شركة Reddit؟
أداة التحسين R8 هي أداة أساسية لتحسين الأداء على Android. يجب اتّخاذ خطوات مختلفة لتحسين أداء التطبيق، لذا لنلقِ نظرة سريعة على الخطوات الأكثر تأثيرًا.
- استبعاد الرموز غير المستخدَمة هو الخطوة الأهم لتقليل حجم التطبيق. في هذه المرحلة، تتم إزالة الرموز غير المستخدَمة من تبعيات التطبيق والتطبيق نفسه.
- تستبدل عملية تضمين الرمز البرمجي للدالة استدعاءات الدوال بالرمز البرمجي الفعلي، ما يجعل أداء التطبيق أفضل.
- يتم تطبيق دمج الفئات واستراتيجيات أخرى لجعل الرمز أكثر إيجازًا. في هذه المرحلة، لم يعُد الأمر يتعلق بقراءة رمز المصدر من قِبل الإنسان، بل بتسريع عمل الرمز المجمَّع. لذلك، لا تهم هنا التجريدات، مثل الواجهات أو التسلسلات الهرمية للفئات، وسيتم إزالتها.
- تؤدي عملية تصغير المعرّفات إلى تغيير أسماء الفئات والحقول والطُرق إلى أسماء أقصر وبلا معنى. لذلك، بدلاً من
MyDataModel، قد ينتهي بك الأمر بصف اسمه a. - تؤدي عملية تصغير الموارد إلى إزالة الموارد غير المستخدَمة، مثل ملفات XML والرسومات القابلة للرسم، لتقليل حجم التطبيق بشكل أكبر.
المراحل الرئيسية لتحسين R8
من البيانات الصعبة إلى رضا المستخدمين: تحديد النجاح في مرحلة الإنتاج
لاحظت Reddit تحسّنًا في نتائج الأداء فور طرح إصدار جديد من التطبيق للمستخدمين. باستخدام مؤشرات Android الحيوية وCrashlytics، تمكّنت Reddit من تسجيل مقاييس الأداء على أجهزة فعلية مع مستخدمين فعليين، ما أتاح لها مقارنة الإصدار الجديد بالإصدارات السابقة.
كيف ساهمت الأداة R8 في تحسين أداء تطبيق Reddit
لاحظ الفريق سرعة تشغيل على البارد أعلى بنسبة% 40 وانخفاضًا بنسبة% 30 في أخطاء "التطبيق لا يستجيب" (ANR) وتحسّنًا بنسبة% 25 في عرض اللقطات وانخفاضًا بنسبة% 14 في حجم التطبيق.
هذه التحسينات ضرورية لضمان رضا المستخدمين. يعني بدء التشغيل بشكل أسرع انتظارًا أقل ووصولاً أسرع إلى المحتوى. يؤدي انخفاض عدد أخطاء ANR إلى توفير تطبيق أكثر استقرارًا وموثوقية، ما يقلّل من إحباط المستخدمين. يؤدي عرض الإطارات بشكل أكثر سلاسة إلى إزالة إيقاف مؤقت لعرض واجهة المستخدم، ما يجعل التمرير والصور المتحركة تبدو سلسة ومتجاوبة مع مختلف الأجهزة. كان هذا التأثير الفني الإيجابي واضحًا أيضًا في آراء المستخدمين.
كانت مؤشرات رضا المستخدمين عن نجاح التحسين ظاهرة مباشرةً على "متجر Google Play". بعد طرح الإصدار المحسَّن من R8، لاحظ الفريق تحسّنًا كبيرًا وإيجابيًا في آراء المستخدمين ومعدّل تفاعلهم.
درو هيفنر: "تفعيل أداة إمكانات R8 الكاملة في أقل من أسبوعَين"
والأمر الأكثر إثارة للإعجاب هو أنّ هذا الإنجاز تمّ بجهد مركّز. أشار "درو هيفنر"، مهندس البرامج في Reddit الذي عمل على هذه المبادرة، إلى أنّ تنفيذ التغييرات للاستفادة من إمكانات R8 الكاملة استغرق أقل من أسبوعَين.
تأكيد التحسينات: نظرة تفصيلية باستخدام اختبارات الأداء الشاملة
بعد ملاحظة التحسينات الكبيرة في الأداء الفعلي، أجرى فريق الهندسة في Reddit وفريق علاقات المطوّرين في Android في Google مقاييس أداء تفصيلية للتأكّد علميًا من التحسينات وتجربة المزيد من عمليات التحسين. لإجراء هذا التحليل، قدّم فريق الهندسة في Reddit إصدارَين من التطبيق: أحدهما بدون تحسينات والآخر يطبّق R8 وأداتَين أساسيتَين إضافيتَين لتحسين الأداء: ملفات Baseline Profiles وملفات Startup Profiles.
تعمل "ملفات تعريف الخط الأساس" على نقل خطوات التجميع أثناء التنفيذ (JIT) من أجهزة المستخدمين إلى أجهزة المطوّرين. لقد ثبت أنّ الرمز البرمجي الذي تم تجميعه مسبقًا (AOT) يقلّل من وقت بدء التشغيل ومشاكل العرض على حد سواء.
عند إنشاء حِزمة تطبيق، يأخذ برنامج d8 لتحويل الرموز البرمجية إلى صيغة DEX الفئات والطُرق وينشئ ملفات classes.dex لتطبيقك. عندما يفتح المستخدم التطبيق، يتم تحميل ملفات dex هذه واحدًا تلو الآخر إلى أن يتمكّن التطبيق من البدء. من خلال توفير ملف إعداد، يمكنك إعلام أداة d8 بالفئات والطرق التي يجب تضمينها في ملفات classes.dex الأولى. يسمح هذا البناء للتطبيق بتحميل عدد أقل من الملفات، ما يؤدي بدوره إلى تحسين سرعة بدء التشغيل.
كانت أداة Macrobenchmark من Jetpack هي الأداة الأساسية لهذه المرحلة، حيث سمحت بقياس تفاعلات المستخدمين بدقة في بيئة خاضعة للرقابة. لمحاكاة رحلة المستخدم النموذجية، استخدموا UIAutomator API لإنشاء اختبار يفتح التطبيق وينتقل للأسفل ثلاث مرات ثم يعود للأعلى.
في النهاية، كل ما كان مطلوبًا لكتابة مقياس الأداء هو ما يلي:
uiAutomator {
startApp(REDDIT)
repeat(3) {
onView { isScrollable }.fling(Direction.DOWN) }
repeat(3) {
onView {isScrollable }.fling(Direction.UP)
}
}أكّدت بيانات قياس الأداء الملاحظات الميدانية وقدّمت إحصاءات أكثر تفصيلاً. بدأ التطبيق المحسَّن بالكامل بسرعة أكبر بنسبة% 55، وتمكّن المستخدمون من بدء التصفّح بسرعة أكبر بنسبة% 18. أظهر التطبيق المحسَّن أيضًا انخفاضًا بمقدار الثلثَين في عدد مرات تجميع أثناء التنفيذ (JIT) وانخفاضًا بمقدار الثلث في وقت تجميع أثناء التنفيذ (JIT). تحسّن عرض اللقطات، ما أدّى إلى عرض 19% لقطات أكثر مقارنةً برحلة المستخدم التي تم قياسها. وأخيرًا، تم تقليل حجم التطبيق بمقدار الثلث.
تحسينات على الأداء العام في Reddit
يمكنك قياس وقت التجميع أثناء التنفيذ باستخدام مقياس مخصّص لقسم التتبُّع في Macrobenchmark، على النحو التالي:
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")تفعيل التكنولوجيا التي تتيح عملية التحويل: R8
لتفعيل أداة R8 في الوضع الكامل، عليك ضبط ملف app/build.gradle.kts من خلال ضبط minifyEnabled وshrinkResources على true في نوع الإصدار.
android {
...
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"keep-rules.pro",
)
}
}
}يجب أن تتبع هذه الخطوة اختبارًا شاملاً من البداية إلى النهاية، لأنّ تحسينات الأداء يمكن أن تؤدي إلى سلوك غير مرغوب فيه، ومن الأفضل رصده قبل أن يرصده المستخدمون.
كما هو موضّح سابقًا في هذه المقالة، يعمل R8 على إجراء تحسينات شاملة من أجل تحقيق أقصى استفادة من الأداء. يُجري R8 تعديلات كبيرة على الرمز البرمجي، بما في ذلك إعادة تسمية الفئات والحقول والطُرق ونقلها وإزالتها. إذا لاحظت أنّ هذه التعديلات تتسبّب في حدوث أخطاء، عليك تحديد الأجزاء التي يجب ألا يعدّلها R8 من خلال تعريفها في قواعد الاحتفاظ.
اتّبِع مثال Reddit في تطبيقك
يُعدّ نجاح Reddit في استخدام R8 دراسة حالة فعّالة لأي فريق تطوير يتطلّع إلى إحداث تأثير كبير وبأقل جهد ممكن على أداء التطبيق. إنّ العلاقة المباشرة بين التحسينات الفنية والارتفاع اللاحق في رضا المستخدمين تؤكّد أهمية تحسين الأداء.
من خلال اتّباع المخطط الموضّح في دراسة الحالة هذه، أي استخدام أدوات مثل نتيجة أداء التطبيق لتحديد فرص التحسين، وتفعيل إمكانات التحسين الكاملة في R8، وتتبُّع البيانات الفعلية، واستخدام مقاييس الأداء لتأكيد الفهم وتعميقه، يمكن للمطوّرين الآخرين تحقيق مكاسب مماثلة.
لبدء استخدام R8 في تطبيقك، يُرجى الرجوع إلى المستندات والإرشادات الرسمية التي تم تعديلها حديثًا بشأن تفعيل أداة تحسين R8 وإعدادها وتحديد المشاكل فيها وحلّها.
-
دراسات الحالةMonzo هو بنك رقمي في المملكة المتحدة يضم 15 مليون عميل ويتزايد عددهم. مع توسّع التطبيق، أدرك فريق الهندسة أنّ وقت بدء تشغيل التطبيق يمثّل مجالاً مهمًا للتحسين، ولكنّه كان قلقًا من أنّ ذلك سيتطلّب إجراء تغييرات كبيرة على قاعدة الرموز البرمجية.
Ben Weiss, Tracy Agyemang • مدّة القراءة: دقيقتان -
دراسات الحالةأنشأ الفريق قاعدة رموز برمجية لواجهة مستخدم متوافقة مع الذكاء الاصطناعي أصغر بنسبة% 50 من عملية التنفيذ الأصلية، مع تحقيق انخفاض بنسبة% 35 في وقت تنفيذ وكيل الذكاء الاصطناعي، وانخفاض بنسبة% 32 في عدد عمليات تبادل المعلومات بين المهندس والوكيل، وانخفاض بنسبة% 33 في تكلفة الرموز المميزة.
Pavlo Stavytskyi, Rebecca Franks • 11 دقيقة قراءة -
دراسات الحالةWhatsApp هي أكبر منصة مراسلة في العالم، ويستخدمها مليارات الأشخاص حول العالم. وهي أداة التواصل التلقائية للأشخاص في مختلف المناطق، إذ تربط المستخدمين من خلال الرسائل الخاصة والموثوقة والآمنة.
Niharika Arora, Tracy Agyemang, Mayank Jain • مدّة القراءة: 8 دقائق
يمكنك تلقّي أحدث الإحصاءات حول تطوير تطبيقات Android في بريدك الوارد أسبوعيًا.