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

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

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

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

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

تُعدّ أداة R8 Optimizer أداة أساسية لتحسين الأداء على 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

درو هيفنر: "استغرق تفعيل إمكانات R8 الكاملة أقل من أسبوعين"

والأهم من ذلك أنّ هذا الإنجاز تم من خلال جهود مركّزة. أشار "درو هيفنر"، مهندس البرمجيات في Reddit الذي عمل على هذه المبادرة، إلى أنّ تنفيذ التغييرات للاستفادة من إمكانات R8 الكاملة استغرق أقل من أسبوعين.

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

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

تنقل "ملفات Baseline" خطوات التجميع أثناء التنفيذ (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) وانخفاضًا بمقدار الثلث في وقت التجميع أثناء التنفيذ. تحسّن عرض اللقطات، ما أدى إلى عرض لقطات أكثر بنسبة% 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 وضبطها وتحديد مشاكلها وحلّها.

من كتابة:
متابعة القراءة