عند بدء تشغيل التطبيق، يترك تطبيقك الانطباع الأول لدى المستخدمين. يجب أن يكون بدء تشغيل التطبيق سريعًا لتحميل المعلومات التي يحتاجها المستخدم وعرضها لاستخدام تطبيقك. إذا استغرق بدء تشغيل تطبيقك وقتًا طويلاً جدًا، قد يخرج المستخدمون منه لأنّهم ينتظرون وقتًا طويلاً جدًا.
ننصحك باستخدام مكتبة Macrobenchmark لقياس وقت بدء التشغيل. تقدّم المكتبة نظرة عامة وعمليات تتبُّع مفصّلة للنظام لمعرفة ما يحدث بالضبط أثناء بدء التشغيل.
تقدّم عمليات تتبُّع النظام معلومات مفيدة حول ما يحدث على جهازك، ما يساعدك في فهم ما يفعله تطبيقك أثناء بدء التشغيل وتحديد المجالات المحتملة للتحسين.
لتحليل وقت بدء تشغيل تطبيقك، اتّبِع الخطوات التالية:
- إعداد بيئة لتسجيل عمليات تتبُّع وقت بدء تشغيل التطبيق.
- فهم عمليات تتبُّع النظام.
- التنقّل في تقرير التتبُّع باستخدام أدوات Profilers في "استوديو Android" أو Perfetto.
خطوات تحليل وقت بدء التشغيل وتحسينه
غالبًا ما تحتاج التطبيقات إلى تحميل موارد معيّنة أثناء بدء التشغيل تكون ضرورية للمستخدمين النهائيين. يمكن تأخير تحميل الموارد غير الأساسية إلى ما بعد اكتمال بدء التشغيل.
لتحقيق توازن في الأداء، ضَع في اعتبارك ما يلي:
استخدِم مكتبة Macrobenchmark لقياس الوقت الذي تستغرقه كل عملية، وحدِّد العمليات التي تستغرق وقتًا طويلاً لإكمالها.
تأكَّد من أنّ العملية التي تستهلك الكثير من الموارد ضرورية لبدء تشغيل التطبيق. إذا كان بإمكان العملية الانتظار إلى أن يتم عرض التطبيق بالكامل، يمكن أن يساعد ذلك في تقليل قيود الموارد عند بدء التشغيل.
تأكَّد من أنّك تتوقّع تشغيل هذه العملية عند بدء تشغيل التطبيق. في كثير من الأحيان، يمكن استدعاء عمليات غير ضرورية من رمز قديم أو مكتبات خارجية.
انقِل العمليات الطويلة إلى الخلفية، إن أمكن. لا يزال بإمكان عمليات الخلفية التأثير في معدّل استخدام وحدة المعالجة المركزية أثناء بدء التشغيل.
بعد التحقيق في العملية بالكامل، يمكنك تحديد التوازن بين الوقت الذي يستغرقه التحميل وضرورة تضمينها في بدء تشغيل التطبيق. تذكَّر تضمين احتمالية حدوث تراجع أو تغييرات غير متوافقة عند تغيير سير عمل تطبيقك.
يمكنك تحسين وقت بدء تشغيل تطبيقك وإعادة قياسه إلى أن تصبح راضيًا عنه. لمزيد من المعلومات، يُرجى الاطّلاع على استخدام المقاييس لرصد المشاكل وتشخيصها.
قياس وتحليل الوقت المستغرَق في العمليات الرئيسية
عندما يكون لديك عملية تتبُّع كاملة لوقت بدء تشغيل التطبيق، اطّلِع على عملية التتبُّع وقِس الوقت المستغرَق في العمليات الرئيسية، مثل bindApplication أو activityStart. ننصحك باستخدام Perfetto أو أدوات Android
Studio Profilers لتحليل عمليات التتبُّع هذه.
اطّلِع على الوقت الإجمالي المستغرَق أثناء بدء تشغيل التطبيق لتحديد أي عمليات تنطبق عليها الشروط التالية:
- تستغرق أُطرًا زمنية كبيرة ويمكن تحسينها. كل جزء من الثانية مهم في الأداء. على سبيل المثال، ابحث عن
Choreographerأوقات الرسم، أوقات الإنشاء الأولية، أوقات تحميل المكتبة،Binderالمعاملات، أو أوقات تحميل الموارد. للحصول على بداية عامة، اطّلِع على جميع العمليات التي تستغرق أكثر من 20 ملي ثانية. - تحظر سلسلة التعليمات الرئيسية. لمزيد من المعلومات، يُرجى الاطّلاع على التنقّل في تقرير Systrace.
- لا تحتاج إلى التشغيل أثناء بدء التشغيل.
- يمكن أن تنتظر إلى ما بعد رسم الإطار الأول.
تحقَّق من كل عملية تتبُّع من هذه العمليات بشكلٍ أكبر للعثور على الثغرات في الأداء.
تحديد العمليات التي تستهلك الكثير من الموارد في سلسلة التعليمات الرئيسية
من أفضل الممارسات إبقاء العمليات التي تستهلك الكثير من الموارد، مثل عمليات الإدخال والإخراج للملفات والوصول إلى الشبكة، خارج سلسلة التعليمات الرئيسية. ويكتسب ذلك أهمية مماثلة أثناء بدء تشغيل التطبيق، لأنّ العمليات التي تستهلك الكثير من الموارد في سلسلة التعليمات الرئيسية يمكن أن تجعل التطبيق غير مستجيب وتؤخّر العمليات المهمة الأخرى.
StrictMode.ThreadPolicy يمكن أن يساعد
في تحديد الحالات التي تحدث فيها عمليات تستهلك الكثير من الموارد في سلسلة التعليمات الرئيسية.
من أفضل الممارسات تفعيل StrictMode في
إصدارات تصحيح الأخطاء لرصد المشاكل في أقرب وقت ممكن، كما هو موضّح في
المثال التالي:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
...
if (BuildConfig.DEBUG)
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyDeath()
.build()
)
...
}
}
يؤدي استخدام StrictMode.ThreadPolicy إلى تفعيل سياسة سلسلة التعليمات في جميع إصدارات تصحيح الأخطاء وتعطّل التطبيق كلما تم رصد انتهاكات لسياسة سلسلة التعليمات، ما يجعل من الصعب عدم ملاحظة انتهاكات سياسة سلسلة التعليمات.
TTID وTTFD
لمعرفة الوقت الذي يستغرقه التطبيق لإنتاج الإطار الأول، قِس الـ وقت للعرض الأوّلي (TTID). ومع ذلك، لا يعكس هذا المقياس بالضرورة الوقت اللازم حتى يتمكّن المستخدم من بدء التفاعل مع تطبيقك. يكون مقياس وقت العرض الكامل (TTFD) أكثر فائدةً في قياس مسارات الرموز اللازمة للحصول على حالة تطبيق قابلة للاستخدام بالكامل وتحسينها.
للاطّلاع على استراتيجيات الإبلاغ عن وقت رسم واجهة مستخدم التطبيق بالكامل، يُرجى الاطّلاع على تحسين دقة وقت بدء التشغيل.
يمكنك تحسين كل من TTID وTTFD، لأنّ كليهما مهم في مجالاته. يساعد TTID القصير المستخدم في معرفة أنّ التطبيق يتم تشغيله فعلاً. من المهم الحفاظ على TTFD قصيرًا للمساعدة في ضمان إمكانية بدء تفاعل المستخدم مع التطبيق بسرعة.
تحليل حالة سلسلة التعليمات العامة
اختَر وقت بدء تشغيل التطبيق واطّلِع على شرائح سلسلة التعليمات العامة. يجب أن تكون سلسلة التعليمات الرئيسية مستجيبة في جميع الأوقات.
تقدّم أدوات، مثل محلّل استوديو Android وPerfetto، نظرة عامة مفصّلة على سلسلة التعليمات الرئيسية والوقت المستغرَق في كل مرحلة. لمزيد من المعلومات حول عرض عمليات تتبُّع Perfetto، يُرجى الاطّلاع على مستندات واجهة مستخدم Perfetto.
تحديد الأجزاء الرئيسية من حالة سلسلة التعليمات الرئيسية في وضع السكون
إذا كان هناك الكثير من الوقت المستغرَق في وضع السكون، فمن المحتمل أن يكون ذلك نتيجةً لانتظار سلسلة التعليمات الرئيسية في تطبيقك اكتمال العمل. إذا كان لديك تطبيق متعدد سلاسل التعليمات، حدِّد سلسلة التعليمات التي تنتظرها سلسلة التعليمات الرئيسية وفكِّر في تحسين هذه العمليات. يمكن أن يكون من المفيد أيضًا التأكّد من عدم وجود أي نزاع غير ضروري على عمليات التأمين يتسبب في حدوث تأخيرات في مسارك المهم.
تقليل حظر سلسلة التعليمات الرئيسية والسكون غير القابل للانقطاع
ابحث عن كل حالة تنتقل فيها سلسلة التعليمات الرئيسية إلى حالة محظورة. يعرض Perfetto وStudio Profiler ذلك باستخدام مؤشر برتقالي على المخطط الزمني لحالة سلسلة التعليمات. حدِّد العمليات، واستكشِف ما إذا كانت متوقّعة أو يمكن تجنُّبها، وحسِّنها عند الضرورة.
يمكن أن يكون السكون القابل للانقطاع المرتبط بعمليات الإدخال والإخراج فرصة جيدة جدًا للتحسين. يمكن أن تتنافس العمليات الأخرى التي تجري عمليات إدخال وإخراج، حتى إذا كانت تطبيقات غير ذات صلة، مع عمليات الإدخال والإخراج التي يجريها التطبيق العلوي.
تحسين وقت بدء التشغيل
بعد تحديد فرصة للتحسين، استكشِف الحلول الممكنة للمساعدة في تحسين أوقات بدء التشغيل:
- يمكنك تحميل المحتوى بشكل غير مباشر وغير متزامن لتسريع TTID.
- قلِّل من استدعاء الدوال التي تجري عمليات استدعاء Binder. إذا كان لا يمكن تجنُّبها، تأكَّد من تحسين عمليات الاستدعاء هذه من خلال تخزين القيم مؤقتًا بدلاً من تكرار عمليات الاستدعاء أو نقل العمل غير المحظور إلى سلاسل تعليمات الخلفية.
- لجعل بدء تشغيل تطبيقك يبدو أسرع، يمكنك عرض شيء يتطلب الحد الأدنى من العرض للمستخدم بأسرع وقت ممكن إلى أن يتم تحميل بقية الشاشة.
- يمكنك إنشاء ملف بدء تشغيل وإضافته إلى تطبيقك.
- استخدِم مكتبة Jetpack App Startup لـ تبسيط عملية إعداد المكوّنات أثناء بدء تشغيل التطبيق.
تحليل أداء واجهة المستخدم
يشمل بدء تشغيل التطبيق شاشة البداية ووقت تحميل الصفحة الرئيسية. لتحسين وقت بدء تشغيل التطبيق، افحص عمليات التتبُّع لفهم الوقت المستغرَق لرسم واجهة المستخدم.
الحدّ من العمليات أثناء الإعداد
قد يستغرق تحميل بعض الإطارات وقتًا أطول من غيرها. تُعد هذه العمليات عمليات رسم تستهلك الكثير من الموارد بالنسبة إلى التطبيق.
لتحسين الإعداد، اتّبِع الخطوات التالية:
- حدِّد أولويات مراحل الإنشاء والتنسيق البطيئة واخترها لإجراء تحسينات.
- تحقَّق من كل تحذير من Perfetto وتنبيه من Systrace من خلال إضافة أحداث تتبُّع مخصّصة لتقليل عمليات الرسم والتأخيرات التي تستهلك الكثير من الموارد.
قياس بيانات الإطار
هناك طرق متعددة لقياس بيانات الإطار. في ما يلي طرق الجمع الرئيسية الخمس:
- الجمع المحلي باستخدام
dumpsys gfxinfo: لا تكون جميع الإطارات التي يتم رصدها في بيانات dumpsys مسؤولة عن العرض البطيء لتطبيقك أو ليس لها أي تأثير في المستخدمين النهائيين. ومع ذلك، هذا مقياس جيد يمكن الاطّلاع عليه خلال دورات الإصدار المختلفة لفهم الاتجاه العام للأداء. لمعرفة المزيد حول استخدامgfxinfoوframestatsلدمج قياسات أداء واجهة المستخدم في ممارسات الاختبار، يُرجى الاطّلاع على أساسيات اختبار تطبيقات Android. - جمع الحقول باستخدام JankStats: يمكنك جمع أوقات عرض الإطارات من أجزاء معيّنة من تطبيقك باستخدام مكتبة JankStats وتسجيل البيانات وتحليلها.
- في الاختبارات باستخدام Macrobenchmark (Perfetto تحت الغطاء)
- Perfetto FrameTimeline: على Android 12 (مستوى واجهة برمجة التطبيقات 31) أو الإصدارات الأحدث، يمكنك جمع مقاييس المخطط الزمني للإطار من عملية تتبُّع Perfetto لتحديد العمل الذي يتسبب في انخفاض الإطار. يمكن أن تكون هذه الخطوة الأولى لتشخيص سبب انخفاض الإطارات.
- أداة Profiler في "استوديو Android" لرصد حالات التأخير
التحقّق من مدّة تحميل النشاط الرئيسي
قد يحتوي النشاط الرئيسي لتطبيقك على كمية كبيرة من المعلومات التي يتم تحميلها من مصادر متعددة. تحقَّق من واجهة مستخدم Activity الرئيسية، واطّلِع تحديدًا على حدث Choreographer#doFrame.
- استخدِم
reportFullyDrawnلإبلاغ النظام بأنّ تطبيقك معروض بالكامل الآن لأغراض التحسين. - قِس عمليات تشغيل التطبيق والنشاط باستخدام
StartupTimingMetricمع مكتبة Macrobenchmark. - اطّلِع على حالات انخفاض الإطارات.
- حدِّد التنسيقات التي تستغرق وقتًا طويلاً لعرضها أو قياسها.
- حدِّد مواد العرض التي تستغرق وقتًا طويلاً لتحميلها.
- حدِّد عناصر واجهة المستخدم غير الضرورية التي يتم تضمينها في الإنشاء الأوّلي.
ضَع في اعتبارك هذه الحلول الممكنة لتحسين وقت تحميل النشاط الرئيسي:
- اجعل الإنشاء الأوّلي خفيفًا قدر الإمكان. لمزيد من المعلومات، يُرجى الاطّلاع على أداء Jetpack Compose.
- أضِف نقاط تتبُّع مخصّصة لتقديم مزيد من المعلومات حول الإطارات التي تم إسقاطها والتنسيقات المعقّدة.
- قلِّل عدد موارد الصور النقطية وحجمها التي يتم تحميلها أثناء بدء التشغيل. لمزيد من المعلومات، يُرجى الاطّلاع على تحسين الصور النقطية.
إذا كنت تستخدم Jetpack Compose، ننصحك باستخدام الإنشاء المشروط لتأجيل تحميل أجزاء من واجهة المستخدم غير مرئية على الفور عند الإطلاق، مثل شاشات الخطأ أو التفاصيل الاختيارية أو علامات التبويب الثانوية. من خلال تضمين المكوّنات الكبيرة في عملية تحقّق بسيطة من الحالة، يمكنك تجنُّب تنفيذ منطق الإنشاء الخاص بها أثناء نافذة بدء التشغيل المهمة، ما يحافظ على خفة التنسيق الأوّلي.
var shouldLoad by remember {mutableStateOf(false)} if (shouldLoad) { MyComposable() }يمكنك تحميل العناصر القابلة للإنشاء داخل الكتلة الشرطية من خلال تعديل
shouldLoad:LaunchedEffect(Unit) { shouldLoad = true }يؤدي ذلك إلى إعادة التكوين التي تتضمّن الرمز داخل الكتلة الشرطية في المقتطف الأول.
لمزيد من المعلومات حول تحسين أداء Compose، يُرجى الاطّلاع على أفضل الممارسات.
مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما تكون JavaScript غير مفعّلة
- التقاط مقاييس Macrobenchmark
- نظرة عامة على قياس أداء التطبيق * الإطارات المجمّدة