أفضل ممارسات إدارة الذاكرة

يفترض هذا المستند أنّك اتّبعت إرشادات أفضل الممارسات المتعلّقة بتطبيقات Android. تحت إدارة الذاكرة، مثل إدارة ذاكرة تطبيقك

مقدمة

تسرُّب الذاكرة هو نوع من تسرُّب الموارد الذي يحدث عندما يستخدم الكمبيوتر لا يؤدي البرنامج إلى إصدار ذاكرة مخصصة لم تعد هناك حاجة إليه. تسرّب إلى طلب التطبيق لذاكرة أكبر من نظام التشغيل المتاحة، مما يؤدي إلى تعطيل التطبيق. عدد من الممارسات غير الصحيحة إلى تسرب الذاكرة في تطبيقات Android، مثل عدم التخلص من أو إلغاء تسجيل المستمعين عند عدم الحاجة إليه.

يقدم لك هذا المستند بعض أفضل الممارسات للمساعدة في منع أو اكتشاف وحل مشكلة تسرُّب الذاكرة في التعليمات البرمجية إذا كنت قد جربت الطرق الواردة في هذا والشك في حدوث تسرُّب للذاكرة في حِزم تطوير البرامج (SDK) لدينا، راجِع كيفية الإبلاغ عن مشاكل حِزم تطوير البرامج (SDK) من Google

قبل التواصل مع فريق الدعم

قبل إبلاغ فريق الدعم في Google عن تسرّب الذاكرة، يُرجى اتّباع أفضل الممارسات وخطوات تصحيح الأخطاء الواردة في هذا المستند والتأكد من عدم وجود الخطأ في التعليمات البرمجية. قد تؤدي هذه الخطوات إلى حل مشكلتك، إلا أنهم لم ينشئوا المعلومات، بل ينشئون المعلومات التي يحتاجها فريق الدعم في Google لمساعدتك.

منع تسرُّب الذاكرة

اتبع أفضل الممارسات التالية للمساعدة في تجنب بعض الأسباب الأكثر شيوعًا تسرّب الذاكرة في الرمز البرمجي الذي يستخدم حِزم تطوير البرامج (SDK) من Google

أفضل الممارسات لتطبيقات Android

تحقق من تنفيذ جميع الإجراءات التالية في تطبيق Android:

  1. تحرير الموارد غير المستخدَمة:
  2. إلغاء تسجيل المستمعين عند عدم الحاجة إليه
  3. إلغاء المهام عند عدم الحاجة إليها:
  4. إعادة توجيه طرق مراحل النشاط لتحرير الموارد:
  5. استخدام أحدث إصدارات حِزم تطوير البرامج (SDK)

للحصول على تفاصيل محددة لكل من هذه الممارسات، يمكنك الاطّلاع على الأقسام التالية.

تحرير الموارد غير المستخدَمة

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

إصدار مراجع "خرائط Google" القديمة في GeoSDKs

من الأخطاء الشائعة أن خريطة Google يمكن أن تتسبب في تسرب للذاكرة إذا تم تخزينها مؤقتًا باستخدام التنقلView أو MapView. تمتلك خريطة Google علاقة من 1 إلى 1 التنقل وطريقة عرض الخرائط التي تم استردادها منها. إِنْتَ التأكد من أن خريطة Google ليست في ذاكرة التخزين المؤقت، أو من أن المرجع يتم إصداره عند استدعاء NavigationView#onDestroy أو MapView#onDestroy. في حال حذف باستخدام NavigationSupportFragment أو MapSupportFragment أو الجزء الخاص بك ملخصًا لهذه المشاهدات، فسيتم إصدار المرجع في Fragment#onDestroyView.

class NavFragment : SupportNavigationFragment() {

  var googleMap: GoogleMap?

  override fun onCreateView(
    inflater: LayoutInflater,
    parent: ViewGroup?,
    savedInstanceState: Bundle?,
  ): View  {
    super.onCreateView(inflater,parent,savedInstanceState)
    getMapAsync{map -> googleMap = map}
  }

  override fun onDestroyView() {
    googleMap = null
  }
}

إلغاء تسجيل المستمعين عند عدم الحاجة إليه

عندما يسجِّل تطبيق Android مستمعًا لحدث، مثل زرّ نقرة أو تغيير في حالة المشاهدة، تأكّد من إلغاء تسجيل المستمع إذا لم يعد التطبيق بحاجة إلى مراقبة الحدث. إذا لم تقم بذلك، يستمر المستمعون في شغل الذاكرة حتى بعد انتهاء التطبيق معهم.

على سبيل المثال، لنفترض أن تطبيقك يستخدم حزمة SDK للتنقل ويطلب المستمع التالي للاستماع إلى أحداث الوصول: addArrivalListener للاستماع إلى أحداث الوصول، فيجب أيضًا استدعاء removeArrivalListener عندما لا تعد بحاجة إلى مراقبة أحداث الوصول.

var arrivalListener: Navigator.ArrivalListener? = null

fun registerNavigationListeners() {
  arrivalListener =
    Navigator.ArrivalListener {
      ...
    }
  navigator.addArrivalListener(arrivalListener)
}

override fun onDestroy() {
  navView.onDestroy()
  if (arrivalListener != null) {
    navigator.removeArrivalListener(arrivalListener)
  }

  ...
  super.onDestroy()
}

إلغاء المهام عند عدم الحاجة إليها

عندما يبدأ أحد تطبيقات Android مهمة غير متزامنة، مثل عملية تنزيل أو طلب الشبكة، فتأكد من إلغاء المهمة عند الانتهاء. إذا كانت المهمة لا يتم إلغاء الاشتراك، يستمر في العمل في الخلفية حتى بعد تشغيل التطبيق قد انتهى منها.

للحصول على مزيد من التفاصيل حول أفضل الممارسات، يُرجى الاطّلاع على إدارة ذاكرة تطبيقك في وثائق Android.

إعادة توجيه طرق مراحل النشاط لتحرير الموارد

إذا كان تطبيقك يستخدم "حزمة تطوير البرامج بالاستناد إلى بيانات التنقّل" أو "خرائط Google"، فاحرص على إصدار الموارد من خلال إعادة توجيه طرق مراحل النشاط (الموضحة بالخط الغامق) إلى navView. يمكنك إجراء ذلك باستخدام "NavigationView" في حزمة تطوير البرامج (SDK) للتنقل أو MapView في "خرائط Google" حزمة SDK للتنقّل يمكنك أيضًا استخدام SupportNavigationFragment أو SupportMapFragment بدلاً من استخدام NavigationView وMapView مباشرةً على التوالي. تتعامل أجزاء الدعم مع إعادة توجيه دورة الحياة الطرق.

class NavViewActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...
    navView = ...
    navView.onCreate(savedInstanceState)
    ...
  }

  override fun onSaveInstanceState(savedInstanceState: Bundle) {
    super.onSaveInstanceState(savedInstanceState)
    navView.onSaveInstanceState(savedInstanceState)
  }

  override fun onTrimMemory(level: Int) {
    super.onTrimMemory(level)
    navView.onTrimMemory(level)
  }

  /* Same with
    override fun onStart()
    override fun onResume()
    override fun onPause()
    override fun onConfigurationChanged(...)
    override fun onStop()
    override fun onDestroy()
  */
}

استخدام أحدث إصدارات حِزم تطوير البرامج (SDK)

يتم تحديث حِزم تطوير البرامج (SDK) من Google باستمرار بميزات جديدة وإصلاحات للأخطاء. تحسينات في الأداء. يجب تحديث حِزم SDK في تطبيقك باستمرار إصلاحات الأخطاء.

تصحيح أخطاء تسرّب الذاكرة

في حال استمرار ظهور تسرّبات للذاكرة بعد تنفيذ جميع اقتراحات سابقة في هذا المستند، اتّبِع هذه العملية لتصحيح الأخطاء.

قبل البدء، يجب أن تكون على دراية بكيفية إدارة Android الذاكرة. لمزيد من المعلومات، يُرجى قراءة مقالة نظرة عامة على إدارة الذاكرة

لتصحيح الأخطاء، اتّبِع الخطوات التالية:

  1. إعادة عرض المشكلة وهذه الخطوة ضرورية لتصحيح الأخطاء.
  2. التحقّق مما إذا كان استخدام الذاكرة متوقعًا تحقق من أن والاستخدام المتزايد الذي يبدو أنه تسرب ليست في الواقع مساحة الذاكرة المطلوبة لتشغيل التطبيق.
  3. تصحيح الأخطاء على مستوى عالٍ: هناك العديد من الأدوات المساعدة التي يمكنك استخدامها لتصحيح الأخطاء. ثلاث مجموعات أدوات عادية مختلفة تساعد في تصحيح مشاكل الذاكرة في Android: Android Studio وPerfetto وAndroid Debug Bridge (adb) برامج سطر الأوامر.
  4. التحقّق من استخدام تطبيقك للذاكرة: تسجيل لقطة لأجزاء من الذاكرة على سبيل المثال، ثم تحليلها.
  5. إصلاح تسرُّب الذاكرة:

تتناول الأقسام التالية هذه الخطوات بالتفصيل.

الخطوة 1: إعادة إظهار المشكلة

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

  • ما هي مجموعة الميزات التي تم تفعيلها؟

  • ما التسلسل المحدد لإجراءات المستخدم الذي يؤدي إلى حدوث التسرب؟

    • هل جربت تكرارات متعددة لتفعيل هذا التسلسل؟
  • ما هي حالات مراحل النشاط التي مرّ بها التطبيق؟

    • هل جربت تكرارات متكررة من خلال حالات دورة حياة مختلفة؟

تأكَّد من إمكانية إعادة إنشاء المشكلة في أحدث إصدار من حِزم تطوير البرامج (SDK). تشير رسالة الأشكال البيانية مشكلة من إصدار سابق قد تم حلها بالفعل.

الخطوة 2: التحقّق ممّا إذا كان استخدام الذاكرة للتطبيق متوقَّعًا

وتتطلّب كل ميزة ذاكرة إضافية. وعند تصحيح أخطاء سيناريوهات مختلفة، التفكير فيما إذا كان من الممكن أن يكون هذا الاستخدام متوقعًا أو ما إذا كان في الواقع تسريب الذاكرة. على سبيل المثال، بالنسبة للميزات المختلفة أو مهام المستخدم، ضع في اعتبارك الاحتمالات التالية:

  • تسرُّب محتمل: تفعيل السيناريو من خلال تكرارات تحسينية متعددة يؤدي إلى زيادة استخدام الذاكرة بمرور الوقت.

  • الاستخدام المتوقّع للذاكرة على الأرجح: تمت استعادة الذاكرة بعد السيناريو متوقف.

  • الاستخدام المتوقع للذاكرة: يزيد استخدام الذاكرة لمدة الوقت ثم ينخفض. وقد يرجع السبب في ذلك إلى وجود ذاكرة تخزين مؤقت محدودة أو توقعات أخرى استخدام الذاكرة.

إذا كان سلوك التطبيق هو استخدام متوقّع للذاكرة، قد تكون المشكلة من خلال إدارة ذاكرة التطبيق. للحصول على المساعدة، يُرجى الاطّلاع على إدارة ذاكرة تطبيقك

الخطوة 3: تصحيح الأخطاء على مستوى عالٍ

عند تصحيح الأخطاء المرتبطة بتسرّب الذاكرة، ابدأ من المستوى الأعلى، ثم توغّل في التفاصيل. بمجرد تضييق نطاق الاحتمالات. استخدم أحد هذه الأعمدة رفيعة المستوى أدوات تصحيح الأخطاء لتحليلها أولاً إذا كان هناك تسرّب بيانات بمرور الوقت:

محلّل الذاكرة في "استوديو Android"

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

عدادات ذاكرة Perfetto

يمنحك خيار Perfetto إمكانية تحكُّم دقيقة. على تتبع عدة مقاييس ويقدمها كلها في مدرج تكراري واحد. بالنسبة مزيد من المعلومات، راجع عدّادات الذاكرة:

واجهة مستخدم Perfetto

أدوات سطر أوامر جسر تصحيح أخطاء Android (adb)

معظم البيانات التي يمكنك تتبّعها باستخدام Perfetto متوفّرة أيضًا على شكل adb. التي يمكنك الاستعلام عنها مباشرةً. اثنان من هي:

  • تتيح لك أداة Meminfo الاطلاع على معلومات الذاكرة التفصيلية في وقت معيّن.

  • توفّر Procstats بعض الإحصاءات المجمّعة المهمة بمرور الوقت.

من الإحصاءات المهمة التي يجب النظر إليها هنا هي الحد الأقصى للبصمة الفعلية على الذاكرة (maxRSS) التي يتطلبها التطبيق بمرور الوقت. قد لا تكون MaxPSS دقيقة. بالنسبة طريقة لزيادة الدقة، انظر علم واحد (adb shell dumpsys procstats --help –start-testing)

تتبُّع التوزيع

يحدِّد تتبُّع التخصيص عملية تتبُّع تسلسل استدعاء الدوال البرمجية التي تم تخصيص الذاكرة فيها إذا لم يتم تحريره. هذه الخطوة مفيدة بشكل خاص عند تتبع التسريبات في الرمز الأصلي. وبما أن هذه الأداة تحدد تتبُّع تسلسل استدعاء الدوال البرمجية، قد تكون حلاً إصلاح السبب الجذري بسرعة أو معرفة كيفية إعادة إنشاء المشكلة. لمعرفة خطوات استخدام تتبُّع التخصيص، اطّلِع على تصحيح أخطاء الذاكرة في الرمز الأصلي باستخدام ميزة تتبُّع التخصيص:

الخطوة 4: التحقّق من استخدام التطبيق للذاكرة باستخدام لقطة لأجزاء من الذاكرة

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

يمكن أن يرصد "استوديو Android" تسرُّب الذاكرة الذي لا يمكن إصلاحه من خلال خدمة تجميع البيانات. عند التقاط الصورة لقطة لأجزاء من الذاكرة، يتحقّق "استوديو Android" مما إذا كان هناك نشاط أو جزء التي لا يزال من الممكن الوصول إليها، ولكن سبق أن تم تدميرها.

  1. التقاط لقطة لأجزاء من الذاكرة:
  2. تحليل لقطة لأجزاء من الذاكرة للعثور على تسرّبات الذاكرة
  3. إصلاح تسرُّب الذاكرة:

لمعرفة التفاصيل، يُرجى الاطّلاع على الأقسام التالية.

تسجيل لقطة لأجزاء من الذاكرة

لتسجيل لقطة لأجزاء من الذاكرة، يمكنك استخدام Android Debug Bridge (adb) أو محلّل الذاكرة في "استوديو Android"

استخدام أداة adb لتسجيل لقطة لأجزاء من الذاكرة

لتسجيل لقطة لأجزاء من الذاكرة باستخدام adb، اتّبِع الخطوات التالية:

  1. وصِّل جهاز Android بجهاز الكمبيوتر.
  2. افتح موجه الأوامر وانتقل إلى الدليل حيث توجد أدوات adb.
  3. لتسجيل لقطة لأجزاء من الذاكرة، نفِّذ الأمر التالي :

    adb shell am dumpheap my.app.name $PHONE_FILE_OUT

  4. لاسترداد لقطة لأجزاء من الذاكرة، نفِّذ الأمر التالي:

    adb pull $PHONE_FILE_OUT $LOCAL_FILE.

استخدام "استوديو Android" لتسجيل لقطة لأجزاء من الذاكرة

لتسجيل لقطة لأجزاء من الذاكرة باستخدام محلّل الذاكرة في "استوديو Android"، يُرجى اتّباع الخطوات التالية: الخطوات في Android التقاط لقطة لأجزاء من الذاكرة .

تحليل لقطة لأجزاء من الذاكرة للعثور على تسرّبات الذاكرة

بعد تسجيل لقطة لأجزاء من الذاكرة، يمكنك استخدام ميزة "الذاكرة" في "استوديو Android" محلّل لتحليلها. لإجراء ذلك، اتّبع الخطوات التالية:

  1. افتح مشروع Android في "استوديو Android".

  2. اختَر تشغيل، ثمّ اختَر ضبط تصحيح الأخطاء.

  3. افتح علامة التبويب أداة تحليل البيانات على Android.

  4. انقر على الذاكرة.

  5. انقر على فتح لقطة لأجزاء من الذاكرة ثم اختَر ملف لقطة لأجزاء من الذاكرة الذي أنشأته. يعرض محلّل الذاكرة رسمًا بيانيًا يعرض استخدام التطبيق للذاكرة.

  6. استخدِم الرسم البياني لتحليل لقطة لأجزاء من الذاكرة:

    • تحديد العناصر التي لم تعد مستخدمة.

    • تحديد العناصر التي تستخدم قدرًا كبيرًا من الذاكرة.

    • يمكنك الاطّلاع على حجم الذاكرة التي يستخدمها كل عنصر.

  7. استخدِم هذه المعلومات لتضييق نطاق البحث أو العثور على مصدر تسرُّب الذاكرة وإصلاحها.

الخطوة 5: حلّ مشكلة تسرّب الذاكرة

بمجرد تحديد مصدر تسرُّب الذاكرة، يمكنك إصلاحه. يساعد إصلاح تسرُّب الذاكرة في تطبيقات Android في تحسين الأداء تطبيقاتك وثباتها. وتختلف التفاصيل وفقًا للسيناريو. ومع ذلك، يمكن أن تساعدك الاقتراحات التالية:

أدوات تصحيح الأخطاء الأخرى

بعد اكتمال هذه الخطوات، إذا لم تتمكن من العثور على علامة تبويب أو إصلاحها تسرّب الذاكرة، جرِّب الأدوات التالية:

تصحيح أخطاء الذاكرة في الرمز الأصلي باستخدام ميزة تتبُّع التخصيص

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

ويتميز تتبع التخصيص أيضًا بميزة واضحة تتمثل في السماح لك بمشاركة النتائج بدون تضمين معلومات حساسة يمكن العثور عليها في إحدى الكوميدات.

رصد التسريبات باستخدام LeakCanary

LeakCanary هو أداة فعالة لتحديد تسرُّب الذاكرة في تطبيقات Android. لمزيد من المعلومات حول كيفية استخدام LeakCanary في تطبيقك، يمكنك الانتقال إلى LeakCanary:

كيفية الإبلاغ عن مشاكل في حِزم تطوير البرامج (SDK) من Google

في حال تجربة الإجراءات الواردة في هذا المستند والشك في حدوث تسرُّب للذاكرة في حِزم تطوير البرامج (SDK) الخاصة بنا، يُرجى التواصل مع فريق دعم العملاء وتزويدنا بأكبر قدر من المعلومات التالية قدر الإمكان:

  • خطوات إعادة إنشاء تسرّب الذاكرة إذا كانت الخطوات تتطلب ترميزًا معقدًا، قد يكون من المفيد نسخ الرمز الذي ينسخ المشكلة إلى نموذج التطبيق وتقديم خطوات إضافية يلزم اتخاذها في واجهة المستخدم لتشغيل تسرّب.

  • لقطات لأجزاء من الذاكرة التي تم التقاطها من تطبيقك مع إعادة إنشاء المشكلة التقاط لقطة لأجزاء من الذاكرة يفاجأ في نقطتين مختلفتين من الزمن تشير إلى أن استخدام الذاكرة بنسبة كبيرة.

  • إذا كان هناك تسرُّب أصلي للذاكرة، يمكنك مشاركة التخصيص تتبع الناتج من

  • تقرير خطأ تم تسجيله بعد إعادة إنشاء حالة تسرُّب البيانات.

  • تتبُّع تسلسل استدعاء الدوال البرمجية لأي أعطال متعلّقة بالذاكرة

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