فهم مشاكل ذاكرة Android وتحديدها وحلّها

تُعدّ الذاكرة من الموارد المهمة والمحدودة على الأجهزة التي تعمل بنظام التشغيل Android. بصفتك مطوّرًا لنظام Android الأساسي أو مصنّعًا أصليًا للأجهزة، من الضروري فهم طريقة عمل الذاكرة على كل المستويات، بدءًا من بيئة Java وقت التشغيل وصولاً إلى نواة Linux، وذلك لإنشاء نظام فعّال ومستقر.

يقدّم هذا الدليل نظرة عامة شاملة على بنية ذاكرة Android، والأدوات المتاحة للتحليل، والتمارين العملية لمساعدتك في تحديد المشاكل المتعلّقة بالذاكرة وحلّها.

الأهداف

بعد إكمال هذا الدليل، ستتمكّن من:

  • شرح المفاهيم الأساسية لذاكرة Android، بما في ذلك نموذج عملية Zygote والملفات المعيّنة في الذاكرة
  • التمييز بين حجم المجموعة المقيمة (RSS) وحجم المجموعة النسبي (PSS) وحجم المجموعة الفريد (USS)
  • استخدِم أدوات سطر الأوامر العادية، مثل dumpsys meminfo وshowmap، لتقييم استخدام الذاكرة بسرعة.
  • التقاط لقطات لأجزاء من الذاكرة في Java وتحليلها باستخدام AHAT للعثور على عمليات التسرُّب وعمليات التخصيص المفرطة
  • استخدِم Perfetto وheapprofd لتحليل ذاكرة Java والذاكرة الأصلية على مستوى النظام بأكمله.
  • فهم مؤشرات الضغط على الذاكرة على مستوى النظام، مثل معلومات توقُّف الضغط (PSI)، ومراقبة نشاط "آلية إنهاء العمليات عند انخفاض الذاكرة" (LMK)
  • مراقبة نشاط الاسترداد على مستوى النواة، بما في ذلك تبديل ZRAM وإخلاء ذاكرة التخزين المؤقت للصفحة

بنية الدليل

ينقسم هذا الدليل إلى الأقسام التالية، والمصممة لتتم قراءتها بالتسلسل:

  1. المفاهيم الأساسية: المبادئ الفنية الأساسية لذاكرة Android
  2. أدوات التقييم السريع: استخدام meminfo وshowmap وprocstats لتصنيف الحالات بسرعة
  3. تحليل ذاكرة Java: نظرة متعمّقة على أجزاء من الذاكرة في Java باستخدام أداة AHAT
  4. الصور النقطية والذاكرة: فهم تأثير الصور في ذاكرة الوصول العشوائي (RAM) واستخدام الأدوات لتحليلها
  5. تحليل الذاكرة الأصلية: تحليل ذاكرة C/C++‎ باستخدام Perfetto وheapprofd
  6. ‫WebView والذاكرة: فهم بنية العمليات المتعدّدة واستهلاك الذاكرة في مكوّنات WebView.
  7. رمز التطبيق هو الذاكرة: فهم كيفية تأثير تحميل الفئات وتضخّم ملفات dex في ذاكرة الوصول العشوائي (RAM).
  8. سلاسل المحادثات والذاكرة: تحليل تكلفة حِزم سلاسل المحادثات الأصلية
  9. موضع الذاكرة والأداء: فهم كيفية تأثير أنماط الوصول إلى البيانات في أداء وحدة المعالجة المركزية
  10. عمليات ربط الخدمات وحالات العمليات: فهم كيفية تأثير التبعيات بين العمليات في نتائج نفاد الذاكرة (OOM).
  11. تحديد المشاكل وحلّها على مستوى النظام: مراقبة PSI وLMK ومساحة التبديل في ZRAM وإخلاء ذاكرة التخزين المؤقت للصفحة
  12. استعادة الذاكرة: الإخلاء والمبادلة: فهم memcg، والشحن، والاستعادة الاستباقية باستخدام memory.reclaim.
  13. التفاعل بين kswapd وlmkd: فهم كيفية عمل kswapd وlmkd معًا تحت الضغط
  14. إعادة صفحات الذاكرة إلى نظام التشغيل: استخدام madvise وposix_fadvise لإعادة صفحات الذاكرة الديناميكية غير المستخدَمة وصفحات ذاكرة التخزين المؤقت للملفات إلى النواة
  15. مواصلة العمل في الخلفية باستخدام عملية بسيطة: يمكنك نقل الخدمات والعمليات التي تُشغَّل في الخلفية إلى عملية مخصّصة لكي لا يتم منح واجهة المستخدم وذاكرة الرسومات أولوية عالية.

المتطلبات الأساسية والبيئة

يقدّم هذا الدليل سير عمل مرجعيًا وبيانات قياس الأداء ودراسات حالة توضّح كيفية تشخيص مشاكل الذاكرة في Android وحلّها.

  • أدوات التحليل: تستخدم الأساليب الواردة في هذا الدليل بشكل أساسي أدوات الأداء العادية في Android، بما في ذلك Perfetto وdumpsys meminfo وshowmap وAHAT.
  • امتيازات الجذر: تتطلّب بعض عمليات سير العمل التشخيصية على مستوى النظام (مثل فحص ضغط ذاكرة النواة أو عدّادات وحدة إدارة الطاقة في الأجهزة) امتيازات جذر مرتفعة (adb root) على جهاز تصحيح أخطاء المستخدم أو إصدار المحاكي.

البدء من هنا: المفاهيم الأساسية