دراسات الحالة

كيف استخدمت Reddit أداة التحسين R8 لإجراء تحسينات كبيرة على الأداء

مدّة القراءة: 4 دقائق
عرض الملف الشخصي لـ "بن فايس"
Ben Weiss مهندس علاقات المطوّرين

في عالم تطبيقات الأجهزة الجوّالة اليوم، لم تعد تجربة المستخدم السلسة ميزة إضافية، بل أصبحت ضرورة. ويمكن أن تشكّل مدّة التحميل الطويلة والواجهات غير المستجيبة وعدم الاستقرار عوائق كبيرة أمام تفاعل المستخدمين والاحتفاظ بهم. أثناء عمل فريق الهندسة في Reddit مع فريق علاقات المطوّرين في Android، استخدموا نتيجة أداء التطبيق لتقييم تطبيقهم. وبعد تقييم الأداء، حدّدوا إمكانية إجراء تحسينات كبيرة وقرّروا اتّخاذ الخطوات اللازمة لتفعيل الإمكانات الكاملة لأداة R8، وهي أداة تحسين تطبيقات Android. أدّى هذا الإجراء المركّز إلى تحسينات ملحوظة في أوقات بدء التشغيل، وتقليل عدد اللقطات البطيئة أو المجمّدة وأخطاء "التطبيق لا يستجيب" (ANR)، وزيادة التقييمات الإجمالية على "متجر Play". توضّح دراسة الحالة هذه كيف حقّقت Reddit هذه النتائج المذهلة.

كيف ساعدت أداة التحسين R8 شركة Reddit؟

أداة التحسين R8 هي أداة أساسية لتحسين الأداء على Android. تتّخذ هذه الأداة خطوات مختلفة لتحسين أداء التطبيق.لنلقِ نظرة سريعة على الخطوات الأكثر تأثيرًا.

  • إزالة الرموز غير المستخدَمة هي أهم خطوة لتقليل حجم التطبيق. في هذه الخطوة، تتم إزالة الرموز غير المستخدَمة من تبعيات التطبيق والتطبيق نفسه.
  • تضمين الأساليب يستبدل استدعاءات الأساليب بالرمز الفعلي، ما يجعل التطبيق أكثر فعالية.
  • دمج الفئات، ويتم تطبيق استراتيجيات أخرى لجعل الرمز أكثر إحكامًا. في هذه المرحلة، لم يعُد الأمر يتعلق بقراءة التعليمات البرمجية المصدرية، بل بجعل التعليمات البرمجية المجمَّعة تعمل بسرعة. لذلك، لا تهم هنا التجريدات، مثل الواجهات أو التسلسلات الهرمية للفئات، وسيتم إزالتها.
  • إزالة البيانات غير الضرورية من المعرّفات تغيّر أسماء الفئات والحقول والأساليب إلى أسماء أقصر وغير ذات معنى. لذلك، بدلاً من MyDataModel، قد ينتهي بك الأمر بفئة تُسمى a.
  • تقليص الموارد  يزيل الموارد غير المستخدَمة، مثل ملفات XML والرسومات، لتقليل حجم التطبيق بشكل أكبر.
image.png

المراحل الرئيسية لتحسين الأداء باستخدام R8

من البيانات الصعبة إلى رضا المستخدمين: تحديد النجاح في مرحلة الإنتاج

لاحظت Reddit نتائج محسّنة للأداء فور طرح إصدار جديد من التطبيق للمستخدمين.من خلال استخدام مؤشرات Android الحيوية وCrashlytics، تمكّنت Reddit من جمع مقاييس الأداء على أجهزة فعلية مع مستخدمين فعليين، ما سمح لها بمقارنة الإصدار الجديد بالإصدارات السابقة.

image.png

كيف حسّنت أداة R8 أداء تطبيق Reddit؟

لاحظ الفريق تشغيل على البارد أسرع بنسبة% 40، وانخفاضًا بنسبة% 30 في أخطاء "التطبيق لا يستجيب" (ANR)، وتحسينًا بنسبة% 25 في عرض اللقطات، وانخفاضًا بنسبة% 14 في حجم التطبيق.

هذه التحسينات ضرورية لرضا المستخدمين. يعني بدء التشغيل الأسرع وقت انتظار أقل ووصولاً أسرع إلى المحتوى. يؤدي انخفاض عدد أخطاء ANR إلى تطبيق أكثر استقرارًا وموثوقية، ما يقلل من إحباط المستخدمين. يؤدي عرض الإطارات بسلاسة إلى إزالة إيقاف مؤقت لعرض واجهة المستخدم، ما يجعل التمرير والصور المتحركة تبدو سلسة ومتجاوبة مع مختلف الأجهزة. كان لهذا التأثير الفني الإيجابي تأثير واضح أيضًا على آراء المستخدمين.

كانت مؤشرات رضا المستخدمين عن نجاح التحسين ظاهرة مباشرةً على "متجر Google Play". بعد طرح الإصدار المحسّن باستخدام R8، لاحظ الفريق تحوّلاً كبيرًا وإيجابيًا في آراء المستخدمين وتفاعلهم.

image.png

Drew Heavner: "تفعيل الأداة التي تتيح الاستفادة من الإمكانات الكاملة لأداة R8 في أقل من أسبوعَين"

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

تأكيد المكاسب: نظرة متعمقة باستخدام الاختبارات المعيارية الكلية

بعد ملاحظة التحسينات الكبيرة في العالم الحقيقي، أجرى فريق الهندسة في Reddit وفريق علاقات المطوّرين في Android في Google اختبارات معيارية تفصيلية لتأكيد المكاسب علميًا وتجربة تحسينات إضافية. لإجراء هذا التحليل، قدّم فريق الهندسة في Reddit إصدارَين من تطبيقهم: أحدهما بدون تحسينات والآخر يطبّق R8 وأداتَين أساسيتَين إضافيتَين لتحسين الأداء: الملفات الشخصية الأساسية و الملفات الشخصية لبدء التشغيل.

تنقل الملفات الشخصية الأساسية بشكل فعّال خطوات التجميع في الوقت المناسب (JIT) من أجهزة المستخدمين إلى أجهزة المطوّرين. لقد ثبت أنّ الرمز المجمَّع الذي تم إنشاؤه قبل وقت التشغيل (AOT) يقلل من وقت بدء التشغيل ومشاكل العرض على حد سواء.

عند تجميع تطبيق، يأخذ برنامج d8 dexer الفئات والأساليب وينشئ ملفات classes.dex لتطبيقك. عندما يفتح المستخدم التطبيق، يتم تحميل ملفات dex هذه واحدًا تلو الآخر إلى أن يتمكّن التطبيق من بدء التشغيل. من خلال تقديم ملف شخصي لبدء التشغيل ، يمكنك إعلام d8 بالفئات والأساليب التي يجب تضمينها في أول ملفات classes.dex. يسمح هذا الهيكل للتطبيق بتحميل عدد أقل من الملفات، ما يؤدي بدوره إلى تحسين سرعة بدء التشغيل.

كانت حزمة Jetpack Macrobenchmark هي الأداة الأساسية لهذه المرحلة، ما يسمح بقياس تفاعلات المستخدم بدقة في بيئة خاضعة للرقابة. لمحاكاة تجربة المستخدم النموذجية، استخدموا واجهة برمجة التطبيقات UIAutomator لإنشاء اختبار يفتح التطبيق، ثم يمرّر لأسفل ثلاث مرات، ثم يمرّر لأعلى.

في النهاية، كل ما كان مطلوبًا لكتابة الاختبار المعياري هو ما يلي:

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

أكّدت بيانات الاختبار المعياري الملاحظات الميدانية وقدّمت إحصاءات أكثر تفصيلاً. بدأ تشغيل التطبيق المحسّن بالكامل أسرع بنسبة% 55 وتمكّن المستخدمون من بدء التصفّح قبل% 18 من الوقت. أظهر التطبيق المحسّن أيضًا انخفاضًا بمقدار الثلثَين في حالات التجميع أثناء التنفيذ (JIT) وانخفاضًا بمقدار الثلث في وقت التجميع أثناء التنفيذ (JIT). تحسّن عرض اللقطات، ما أدّى إلى عرض لقطات أكثر بنسبة% 19 خلال تجربة المستخدم التي تم قياسها. أخيرًا، تم تقليل حجم التطبيق بأكثر من الثلث.

image.png

التحسينات الإجمالية للأداء في 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 وضبطها وحلّ المشاكل فيها.

من تأليف:
متابعة القراءة