Android Profiler هو مجموعة أدوات مدمجة في Android Studio لمراقبة أداء التطبيقات في الوقت الفعلي. يتيح لك تتبع تحميل CPU واستهلاك الذاكرة وحركة مرور الشبكة واستهلاك الطاقة دون تثبيت مكتبات خارجية. وفقًا لـ Android Developers، فإن أداة التحليل مدمجة مباشرة في IDE وتوفر مقاييس بدقة المللي ثانية لأي عملية على الجهاز المتصل.
الرئيسية
Android Profiler هو مكون من Android Studio حل محل Android Monitor وDDMS القديمين. يوفر واجهة موحدة لتحليل جميع جوانب التطبيق: CPU Profiler لتحليل المعالج، Memory Profiler لإدارة الذاكرة، Network Profiler لطلبات الشبكة وEnergy Profiler لاستهلاك الطاقة. يتم جمع البيانات تلقائيًا عند تشغيل التطبيق عبر Android Studio.
تعمل أداة التحليل على كل من المحاكي والجهاز الفعلي المتصل عبر USB. وفقًا لـ Google I/O 2023، يُستخدم Android Profiler في أكثر من 70% من مشاريع Android ويعتبر الأداة القياسية لتشخيص الأداء. الميزة الرئيسية مقارنة بالحلول الخارجية هي التكامل الصفري: لا حاجة لإضافة تبعيات في build.gradle أو تعديل كود التطبيق.
بنية Android Profiler مبنية على Perfetto — متتبع نظام Android الذي يجمع البيانات على مستوى النواة والتطبيق. يوفر Perfetto حملًا زائدًا ضئيلًا (أقل من 1% CPU) ويدعم التسجيل طويل المدى حتى 30 دقيقة. يتيح ذلك تحليل ليس فقط العمليات السريعة ولكن أيضًا السيناريوهات الطويلة — انتقالات الشاشة، المزامنة الخلفية، استهلاك الذاكرة على مدار ساعة من الاستخدام.
تجمع أداة التحليل أربعة أنواع من البيانات: CPU — التحميل لكل نواة وخيط، Memory — Java Heap وNative Heap وStack وGraphics، Network — جميع الطلبات الواردة والصادرة، Energy — فئات استهلاك الطاقة (Idle وLight وMedium وHeavy). البيانات متزامنة على الخط الزمني بحيث يمكنك رؤية كيف تؤثر تغييرات CPU على الذاكرة واستهلاك الطاقة في وقت واحد.
CPU Profiler يظهر تحميل المعالج في الوقت الفعلي على الخط الزمني، مقسمًا حسب خيوط التطبيق. يتم تمثيل كل خيط بخط أو منطقة ملونة — كلما كانت المنطقة أوسع، زاد وقت المعالج الذي يستهلكه الخيط. المناطق الحمراء تعني عمل التطبيق، الزرقاء تعني استدعاءات النظام، والرمادية تعني الانتظار.
للتحليل التفصيلي، يدعم CPU Profiler ثلاثة أوضاع تسجيل: Trace Java Methods (تتبع جميع طرق Java)، Trace C/C++ Functions (تتبع وظائف NDK الأصلية) وSample Java Methods (أخذ عينات، الوضع الموصى به). يوفر أخذ العينات أقل حمل زائد ومناسب للتحليل اليومي، بينما يُستخدم التتبع الكامل لإيجاد المشكلات المعقدة.
// مثال: سيظهر تحليل CPU Profiler هذه الطريقة كعنق زجاجة
class DataProcessor {
suspend fun processLargeDataset(items: List<Item>): List<Result> {
// سيظهر CPU Profiler حملاً عاليًا لـ CPU في inBackgroundThread
return withContext(Dispatchers.Default) {
items.map { it.computeHeavyTransformation() }
}
}
}
// توصية بعد التحليل:
// computeHeavyTransformation يستهلك 80% من الوقت — نخزن النتيجة مؤقتًا
class DataProcessorOptimized {
private val cache = LruCache<String, Result>(100)
suspend fun processLargeDataset(items: List<Item>): List<Result> {
return withContext(Dispatchers.Default) {
items.mapNotNull { cache.get(it.id) ?: it.computeHeavyTransformation().also { cache.put(it.id, it) } }
}
}
}
بعد التسجيل، يعرض CPU Profiler Top-Down Tree — شجرة استدعاء مع وقت تنفيذ كل طريقة. انتبه إلى عمود Self Time/Total: إذا كان Self Time لطريقة ما يتجاوز 16 مللي ثانية ويتم استدعاؤها من خيط UI — فهذا يضمن فقدان الإطار. الحل هو نقل الحسابات الثقيلة إلى خيط خلفية باستخدام Dispatchers.IO أو Default.
Sample Java Methods — الوضع الموصى به للتحليل اليومي مع حمل زائد 3-5%. Trace Java Methods — تتبع كامل لكل استدعاء، حمل زائد يصل إلى 15%، يُستخدم للتسجيلات القصيرة (5-10 ثوانٍ). Trace C/C++ Functions — تتبع كود NDK عبر Linux Perf، لا غنى عنه لتحليل الألعاب والمكتبات بلغة C++. بدل الأوضاع حسب نوع المشكلة.
Memory Profiler يتتبع جميع فئات ذاكرة التطبيق: Java Heap (كائنات JVM)، Native Heap (تخصيصات C/C++ عبر JNI)، Stack (أكوام الخيوط) وGraphics (الأنسجة، مخازن GPU). التصور الرئيسي هو رسم بياني زمني لاستهلاك الذاكرة حيث تظهر كل فئة بلونها الخاص. إذا لم ينخفض الرسم البياني بعد جمع القمامة — اشتبه في تسرب.
للبحث عن التسريبات، استخدم ميزة Capture Heap Dump. في لحظة التفريغ، يوقف Android Profiler التطبيق لمدة ~100 مللي ثانية وينشئ ملف HPROF — لقطة كاملة لجميع كائنات Java Heap الحية. بعد فتح التفريغ، يمكنك فرز الكائنات حسب Retained Size (حجم الذاكرة الذي سيتم تحريره عند حذف الكائن) والبحث عن مثيلات Activity أو Fragment أو Bitmap التي كان يجب أن تُدمر.
وفقًا لـ Google I/O 2022، يغطي Memory Profiler مع LeakCanary 95% من سيناريوهات اكتشاف تسرب الذاكرة على Android. يعمل LeakCanary تلقائيًا — يكتشف التسريبات في الخلفية. Memory Profiler ضروري للتحليل اليدوي: ترى الصورة الكاملة للتخصيصات، وليس فقط التسريبات.
| فئة الذاكرة | الوصف | الحجم النموذجي |
|---|---|---|
| Java Heap | كومة JVM: كائنات Kotlin/Java | 5–200 ميجابايت |
| Native Heap | تخصيصات عبر JNI، NDK | 1–100 ميجابايت |
| Graphics | الأنسجة، مخازن GPU | 10–200 ميجابايت |
| Stack | أكوام جميع الخيوط | 1–10 ميجابايت |
بعد التقاط التفريغ، قم بفرز الكائنات حسب Retained Size — هذا هو حجم الذاكرة الذي سيتم تحريره عند حذف الكائن. ابحث عن مثيلات Activity وFragment وBitmap ذات Retained Size كبير التي لا ينبغي أن تكون في الذاكرة. انتقل إلى علامة التبويب Reference Tree لرؤية سلسلة المراجع التي تمسك بالكائن — غالبًا ما يكون حقلًا ثابتًا لكائن فردي أو رد اتصال غير نظيف. مقياس مهم هو Allocation rate (عدد التخصيصات في الثانية). إذا تجاوز معدل التخصيص 10000 كائن/ثانية، فإن التطبيق يقضي وقتًا طويلاً في إنشاء وحذف الكائنات المؤقتة، مما يثقل GC ويسبب تجميدًا دقيقًا. في هذه الحالة، استخدم View Inspector وابحث عن الأماكن التي يتم فيها إنشاء الكائنات بشكل متكرر في الحلقات.
Network Profiler يعرض جميع طلبات شبكة التطبيق في الوقت الفعلي على الخط الزمني. يظهر كل طلب كشريط أفقي — طوله يتوافق مع وقت التنفيذ، ولونه مع نوع الطلب (GET، POST، PUT، DELETE). يتيح تمرير الخط الزمني رؤية كيفية توزيع الطلبات بمرور الوقت وما إذا كانت مكررة.
جميع المكتبات الشائعة مدعومة: OkHttp وRetrofit وVolley وKtor. بالنسبة لـ Ktor وOkHttp، تظهر أداة التحليل مكدس الاستدعاء الكامل، بما في ذلك المعترضات والمحولات. لكل طلب، تتوفر Request Headers وResponse Headers، ونص الاستجابة (حتى 1 ميجابايت)، ورمز الحالة والمدة.
المشكلات النموذجية التي يكتشفها Network Profiler: عدم وجود تخزين مؤقت (يتم طلب نفس URL في كل فتحة)، الطلبات المكررة (مكونان يحملان نفس البيانات في وقت واحد)، حجم الاستجابة المفرط (يعيد الخادم 5 ميجابايت بينما يحتاج 50 كيلوبايت). يساعدك Network Profiler في رؤية هذه المشكلات حرفيًا بنظرة واحدة على الخط الزمني.
لمحاكاة الشبكات البطيئة، استخدم Network Conditioning في Android Studio — يتيح لك تحديد عرض النطاق الترددي إلى 3G/2G وإضافة تأخير. هذا مهم بشكل حاسم لاختبار سلوك التطبيق في ظروف الشبكة الضعيفة، خاصة للتطبيقات التي تعمل في مناطق ذات إنترنت غير مستقر.
Energy Profiler يقيم تأثير التطبيق على شحن البطارية بناءً على بيانات Perfetto. الأداة لا تقيس الاستهلاك الفعلي بالمللي أمبير، بل تصنف كل عملية إلى واحدة من خمس فئات لاستهلاك الطاقة: Idle وLight وMedium وHigh وOverloaded. الخط الزمني لـ Energy Profiler ملون: الأخضر (حمل خفيف)، الأصفر (متوسط)، الأحمر (مرتفع).
الأسباب الرئيسية للمناطق الحمراء: WakeLock (التطبيق يبقي المعالج نشطًا)، Location GPS (طلبات إحداثيات ثابتة عالية الدقة)، اتصالات Keep-Alive (تبادل متكرر للبيانات مع الخادم)، نقل البيانات الكبيرة (رفع الملفات، البث). يُظهر Energy Profiler بدقة العملية التي تسببت في ذروة استهلاك الطاقة في أي لحظة.
وفقًا لـ Android Developers، يجب أن يقضي التطبيق النموذجي ما لا يزيد عن 5% من الوقت في الفئة High. إذا أظهر Energy Profiler مناطق حمراء لأكثر من 10% من وقت التحليل، لن يجتاز التطبيق المراجعة وفقًا لمعيار استنزاف البطارية. التوصية: استخدم WorkManager للمهام الخلفية، وحد من طلبات Location إلى أقل دقة ضرورية، وجمع طلبات الشبكة في دفعات.
تشغيل Android Profiler بنقرة واحدة: في Android Studio افتح View → Tool Windows → Profiler أو انقر نقرًا مزدوجًا على أيقونة Profiler في اللوحة اليمنى. بعد تشغيل التطبيق على الجهاز المتصل، سيتصل Android Studio تلقائيًا بالعملية ويبدأ جمع البيانات. ستظهر رسوم CPU وMemory وNetwork وEnergy فورًا على الخط الزمني.
للتحليل التفصيلي، حدد علامة التبويب المطلوبة (CPU أو Memory أو Network أو Energy) وابدأ التسجيل. بالنسبة لـ CPU، أوصي بوضع Sample Java Methods بمدة تسجيل 30 ثانية، وهذا كافٍ لسيناريو نموذجي. بالنسبة لـ Memory، التقاط تفريغ كومة بعد إكمال السيناريو (Capture Heap Dump). بالنسبة لـ Network، يبدأ التسجيل تلقائيًا، فقط اضغط على زر Stop بعد الانتهاء من السيناريو.
بعد إيقاف التسجيل، قم بتصدير البيانات: File → Save As يحفظ الجلسة بأكملها في ملف .perf. هذا مناسب لمقارنة المقاييس قبل التحسين وبعده. أنشئ جلسة أساسية (baseline) على الإصدار المستقر الأول وقارن كل جلسة جديدة بها، هذه هي الطريقة الوحيدة لتقييم تغييرات الأداء بشكل موضوعي.
يمكن تشغيل Android Profiler من سطر الأوامر عبر Android Studio CLI وFirebase Test Lab. يدعم Firebase Test Lab تحليل الأداء كجزء من اختبارات UI: تحصل على مقاييس CPU وMemory وNetwork مع نتيجة الاختبار. قم بإعداد pipeline بحيث إذا انخفضت المقاييس بنسبة 10% مقارنة بالخط الأساسي، يتم حظر pipeline CI حتى يراجعه المطور.
الأسئلة الشائعة
التأثير ضئيل. Android Profiler يستخدم Perfetto لجمع البيانات، مما يضيف أقل من 1% حمل زائد على CPU. في وضع Sample Java Methods، يبلغ الحمل الزائد حوالي 3-5%، وهو غير مهم لتحليل السيناريوهات. يمكن أن يعطي التتبع الكامل للطرق حملًا زائدًا يصل إلى 15%، لذلك يُستخدم فقط للتسجيلات القصيرة.
نعم، يمكن تسجيل تتبعات النظام عبر Perfetto CLI مباشرة من الجهاز: adb shell perfetto --out /data/local/tmp/trace.perf. ثم افتح الملف في واجهة Perfetto UI (ui.perfetto.dev) أو استورده إلى Android Studio لعرضه مع ترميز التطبيق الكامل.
Android Profiler هو أداة نظام لا تتطلب إعداد وكيل. يعرض الطلبات مباشرة في IDE في سياق الأداء. Charles Proxy هو خادم وكيل خارجي يوفر تحليلاً أكثر تفصيلاً (اعتراض حركة المرور، تعديل الطلبات، إعادة الإرسال). لتحليل الأداء، استخدم Android Profiler؛ لتحليل عقود API، استخدم Charles.
خذ تفريغ كومة قبل تنفيذ سيناريو (مثلًا، قبل فتح Activity). نفذ السيناريو — افتح Activity وأغلقها. خذ تفريغًا ثانيًا. قارن عدد مثيلات Activity الحية: إذا كان هناك أكثر في التفريغ الثاني، فهذا تسرب. رتب حسب Retained Size، وابحث عن مثيلات Activity الزائدة وافحص Reference Tree لمعرفة السبب.
Energy Profiler يتطلب دعم Power Profiles على مستوى الجهاز وAndroid 8.0+. قد تكون البيانات مفقودة على المحاكيات وبعض البرامج الثابتة (خاصة الصينية). الحل، تحليل استهلاك الطاقة على أجهزة مرجعية مثل Pixel أو Samsung مع برنامج Android ثابت نظيف.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.