في عالم تطبيقات الأجهزة الجوّالة اليوم، لا تُعدّ تجربة المستخدم السلسة ميزة فحسب، بل هي ضرورة. يمكن أن تشكّل أوقات التحميل البطيئة وواجهات المستخدم غير المستجيبة وعدم الاستقرار عوائق كبيرة أمام تفاعل المستخدمين والاحتفاظ بهم. أثناء عمل فريق الهندسة في Reddit مع فريق علاقات المطوّرين في Android، استخدم نتيجة أداء التطبيق لتقييم التطبيق. وبعد تقييم الأداء، حدّد الفريق إمكانية تحسين كبيرة وقرّر اتّخاذ الخطوات اللازمة للاستفادة من جميع مزايا R8، أداة تحسين تطبيقات Android. أدّت هذه المبادرة المركّزة إلى تحسينات ملحوظة في أوقات بدء التشغيل، وانخفاض في اللقطات البطيئة أو المجمدة وأخطاء ANR، وزيادة عامة في التقييمات على "متجر Play". توضّح دراسة الحالة هذه كيف حقّقت Reddit هذه النتائج الرائعة.
كيف ساعدت أداة R8 Optimizer شركة Reddit؟
R8 Optimizer هي أداة أساسية لتحسين الأداء على Android. يجب اتّخاذ خطوات مختلفة لتحسين أداء التطبيق، لذا لنلقِ نظرة سريعة على الخطوات الأكثر تأثيرًا.
- إزالة الرموز البرمجية غير المستخدَمة هي أهم خطوة لتقليل حجم التطبيق. في هذه المرحلة، تتم إزالة الرموز غير المستخدَمة من تبعيات التطبيق والتطبيق نفسه.
- تستبدل عملية تضمين الرمز البرمجي للدالة استدعاءات الدوال بالرمز البرمجي الفعلي، ما يجعل التطبيق أكثر فعالية.
- يتم تطبيق دمج الفئات واستراتيجيات أخرى لجعل الرمز أكثر إيجازًا. في هذه المرحلة، لم يعُد الأمر يتعلق بقراءة رمز المصدر من قِبل الإنسان، بل يتعلق بتسريع عمل الرمز المجمَّع. لذلك، لا تهم هنا التجريدات، مثل الواجهات أو التسلسلات الهرمية للفئات، وسيتم إزالتها.
-
تغيّر تصغير المعرّفات أسماء الفئات والحقول والطرق إلى أسماء أقصر وبلا معنى. لذلك، بدلاً من
MyDataModel، قد ينتهي بك الأمر بإنشاء صف باسم a. - يؤدي تقليص الموارد إلى إزالة الموارد غير المستخدَمة، مثل ملفات XML والرسومات القابلة للرسم، وذلك لتقليل حجم التطبيق بشكل أكبر.
المراحل الرئيسية لعملية تحسين R8
من البيانات الصعبة إلى رضا المستخدمين: تحديد النجاح في مرحلة الإنتاج
لاحظت Reddit تحسُّنًا في نتائج الأداء فور طرح إصدار جديد من التطبيق للمستخدمين. باستخدام مؤشرات Android الحيوية وCrashlytics، تمكّنت Reddit من تسجيل مقاييس الأداء على أجهزة حقيقية مع مستخدمين فعليين، ما أتاح لها مقارنة الإصدار الجديد بالإصدارات السابقة.
كيف ساهمت أداة R8 في تحسين أداء تطبيق Reddit؟
لاحظ الفريق سرعة بدء التشغيل على البارد بنسبة 40% وانخفاضًا في أخطاء "التطبيق لا يستجيب" (ANR) بنسبة 30% وتحسّنًا في عرض اللقطات بنسبة 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 الأولى. يسمح هذا البناء للتطبيق بتحميل عدد أقل من الملفات، ما يؤدي بدوره إلى تحسين سرعة بدء التشغيل.
كانت أداة Jetpack Macrobenchmark هي الأداة الأساسية لهذه المرحلة، إذ تتيح قياس تفاعلات المستخدمين بدقة في بيئة خاضعة للرقابة. لمحاكاة رحلة المستخدم النموذجية، استخدموا 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 • مدة القراءة: دقيقتان
-
دراسات الحالة
TikTok هي منصة عالمية للفيديوهات القصيرة تشتهر بقاعدة المستخدمين الضخمة والميزات المبتكرة.
Ben Trengrove, Ajesh Pai • مدة القراءة: دقيقتان
-
دراسات الحالة
توفّر منصّتا Instagram وFacebook تشغيلاً فوريًا وتزيدان من تفاعل المستخدمين مع Media3 PreloadManager
في عالم وسائل التواصل الاجتماعي الديناميكي، يمكن جذب انتباه المستخدمين أو فقدانه بسرعة. تُعدّ تطبيقات Meta (Facebook وInstagram) من بين أكبر المنصات الاجتماعية في العالم، وهي تخدم مليارات المستخدمين على مستوى العالم.
Mayuri Khinvasara Khabya • مدة القراءة: 4 دقائق
البقاء على اطّلاع على آخر التحديثات
يمكنك تلقّي أحدث الإحصاءات حول تطوير تطبيقات Android في بريدك الوارد أسبوعيًا.