تحسين استخدام الذاكرة

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

يمكن أن يؤدي استهلاك الذاكرة بشكلٍ كبير إلى حدوث مشاكل في سلوك التطبيق والنظام، ويشمل ذلك ما يلي:

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

ملاحظات حول الذاكرة على أجهزة التلفزيون

عادةً ما تحتوي أجهزة التلفزيون على ذاكرة أقل بكثير من الهواتف أو الأجهزة اللوحية. على سبيل المثال، يمكن أن نرى على التلفزيون إعدادًا يتضمّن ذاكرة وصول عشوائي (RAM) بسعة 1 غيغابايت ودقة فيديو بدقة 1080p. في الوقت نفسه، تتضمّن معظم تطبيقات التلفزيون ميزات مشابهة، وبالتالي تواجه تحديات وعمليات تنفيذ مشابهة. يتسبب كلا الحالتَين في حدوث مشاكل لا تظهر في أنواع الأجهزة والتطبيقات الأخرى:

  • تتألف تطبيقات الوسائط التلفزيونية عادةً من طرق عرض الصور في شبكة وصور خلفية في وضع ملء الشاشة، ما يتطلّب تحميل الكثير من الصور إلى الذاكرة في فترة زمنية قصيرة.
  • تشغِّل تطبيقات التلفزيون عمليات بث وسائط متعددة تتطلّب تخصيص مقدار معيّن من الذاكرة لتشغيل الفيديو والصوت، كما تحتاج إلى ذاكرة تخزين مؤقت كبيرة لضمان التشغيل السلس.
  • يمكن أن تؤدي ميزات الوسائط الإضافية (التقديم/الترجيع وتغيير الحلقة وتغيير المقطع الصوتي وغيرها) إلى زيادة الضغط على الذاكرة في حال عدم تنفيذها بشكل صحيح.

فهم أجهزة التلفزيون

يركز هذا الدليل بشكل أساسي على استخدام ذاكرة التطبيقات واستهدافات الذاكرة للأجهزة التي تتضمّن ذاكرة وصول عشوائي منخفضة.

على أجهزة التلفزيون، يجب مراعاة الخصائص التالية:

  • ذاكرة الجهاز: مقدار ذاكرة الوصول العشوائي (RAM) المُثبَّتة في الجهاز
  • درجة دقة واجهة المستخدم على الجهاز: هي درجة الدقة التي يستخدمها الجهاز لعرض واجهة مستخدم نظام التشغيل والتطبيقات، وتكون عادةً أقل من درجة دقة الفيديو على الجهاز.
  • دقة الفيديو: الحد الأقصى لدقة الفيديوهات التي يمكن للجهاز تشغيلها

يؤدّي ذلك إلى تصنيف أنواع الأجهزة المختلفة وكيفية استخدامها للذاكرة.

ملخّص أجهزة التلفزيون

ذاكرة الجهاز درجة دقة الفيديو على الجهاز درجة دقة واجهة المستخدم على الجهاز isLowRAMDevice()‎
غيغابايت واحدة 1080 بكسل 720 بكسل نعم
‫1.5 غيغابايت ‫2160p 1080 بكسل نعم
‫≥1.5 غيغابايت 1080 بكسل ‫720p أو 1080p لا*
‫≥2 غيغابايت ‫2160p 1080 بكسل لا*

أجهزة التلفزيون التي تحتوي على ذاكرة وصول عشوائي (RAM) منخفضة

هذه الأجهزة في حالة قيود على الذاكرة وسيتم الإبلاغ عن ActivityManager.isLowRAMDevice() على أنّه صحيح. يجب أن تطبِّق التطبيقات التي تعمل على أجهزة التلفزيون ذات ذاكرة الوصول العشوائي (RAM) المنخفضة إجراءات إضافية للتحكّم في الذاكرة.

تندرج الأجهزة التي تتضمّن الخصائص التالية ضمن هذه الفئة:

  • الأجهزة التي تتضمّن ذاكرة وصول عشوائي بسعة 1 غيغابايت: ذاكرة وصول عشوائي بسعة 1 غيغابايت، ودقة واجهة المستخدم 720p/دقة عالية (1280x720)، ودقة الفيديو 1080p/دقة فائقة (1920x1080)
  • الأجهزة التي تضم ذاكرة وصول عشوائي بسعة 1.5 غيغابايت: ذاكرة وصول عشوائي بسعة 1.5 غيغابايت، دقة واجهة مستخدم 1080p/دقة فائقة (1920x1080)، دقة فيديو 2160p/دقة فائقة/4K (3840x2160)
  • الحالات الأخرى التي حدّد فيها المصنّع الأصلي للجهاز العلامة ActivityManager.isLowRAMDevice() بسبب قيود إضافية على الذاكرة

أجهزة التلفزيون العادية

لا تواجه هذه الأجهزة ضغطًا كبيرًا على الذاكرة. ونعتبر أنّ هذه الأجهزة تتسم بالسمات التالية:

  • ذاكرة وصول عشوائي (RAM) بسعة 1.5 غيغابايت على الأقل، وواجهة مستخدم بدقة 720p أو 1080p ودقة فيديو 1080p
  • ذاكرة وصول عشوائي (RAM) بسعة 2 غيغابايت على الأقل، وواجهة مستخدم بدقة 1080p ودقة فيديو 1080p أو 2160p

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

استهدافات الذاكرة على أجهزة التلفزيون ذات ذاكرة وصول عشوائي منخفضة

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

محلّل الذاكرة

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

  • الذاكرة المجهولة + الذاكرة التبادلية: تتألف من ذاكرة Java + الذاكرة الأصلية + ذاكرة تخصيص الذاكرة في الذاكرة العلوية في "استوديو Android".
  • الرسومات: يتم الإبلاغ عنها مباشرةً في أداة تحليل الأداء. تتألف عادةً من ملمسات الرسومات.
  • الملف: تم الإبلاغ عنه ضمن الفئتَين "الرمز" + "غير ذلك" في Android Studio.

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

نوع الذاكرة الغرض استهدافات الاستخدام (1 غيغابايت)
رمز غير معروف + رمز مُستبدَل (Java + رمز أصلي + رمز حزمة) تُستخدَم هذه الذاكرة لعمليات التوزيع ووسائط التخزين المؤقت والمتغيّرات والمهام الأخرى التي تستهلك ذاكرة كبيرة. ‫< 160 ميغابايت
الرسومات تستخدمها وحدة معالجة الرسومات للعناصر المفصّلة وعرض المخزن المؤقت ذي الصلة من 30 إلى 40 ميغابايت
ملف تُستخدَم لصفحات الرموز البرمجية والملفات في الذاكرة. من 60 إلى 80 ميغابايت

يجب ألا يتجاوز إجمالي الحد الأقصى للذاكرة (الذاكرة المؤقتة + الذاكرة التبادلية + الرسومات + الملفات) القيم التالية:

  • 280 ميغابايت من إجمالي استخدام الذاكرة (Anon+Swap + Graphics + File) لأجهزة ذاكرة الوصول العشوائي (RAM) التي تبلغ سعتها 1 غيغابايت

ننصح بشدة بعدم تجاوز:

  • استخدام 200 ميغابايت من الذاكرة في (Anon+Swap + Graphics)

ذاكرة الملف

في ما يلي إرشادات عامة حول الذاكرة المستندة إلى الملفات:

  • بشكل عام، تتعامل إدارة الذاكرة في نظام التشغيل مع ذاكرة الملفات بشكل جيد.
  • لم نتمكّن من العثور على سبب رئيسي لضغط الذاكرة في الوقت الحالي.

ومع ذلك، عند التعامل مع ذاكرة الملفات بشكل عام:

  • لا تُدرِج مكتبات غير مستخدَمة في حِزمك، واستخدِم مجموعات فرعية صغيرة من المكتبات بدلاً من المكتبات الكاملة كلما أمكن.
  • لا تترك الملفات الكبيرة مفتوحة في الذاكرة، واحرِرها فور الانتهاء من استخدامها.
  • تقليل حجم الرموز المجمَّعة لفئات Java وKotlin، اطّلِع على دليل تصغير حجم تطبيقك وتعتيمه وتحسينه.

اقتراحات محددة للبرامج التلفزيونية

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

ذاكرة الرسومات

استخدِم تنسيقات الصور ودرجات دقتها المناسبة.

  • لا تحمِّل صورًا بدرجة دقة أعلى من درجة دقة واجهة المستخدم على الجهاز. على سبيل المثال، يجب تصغير حجم الصور بدقة 1080p إلى 720p على جهاز بواجهة مستخدم بدقة 720p.
  • استخدِم ملفات الأشكال الممسوحة ضوئيًا المستندة إلى الأجهزة كلما أمكن.
    • في مكتبات مثل Glide، فعِّل ميزة Downsampler.ALLOW_HARDWARE_CONFIG التي تكون غير مفعّلة تلقائيًا. يؤدي تفعيل هذا الخيار إلى تجنُّب تكرار ملفات BMP التي كانت ستظهر في ذاكرة الرسومات وذاكرة المستخدِم المجهول.
  • تجنَّب عمليات العرض الوسيطة وعمليات إعادة العرض
    • يمكن تحديد هذه المشاكل باستخدام أداة Android GPU Inspector:
    • ابحث في قسم "المواد" عن الصور التي تمثّل خطوات نحو العرض النهائي بدلاً من أن تكون فقط العناصر التي تشكلها، وهذا هو ما يُعرف عادةً باسم "العرض الوسيط".
    • بالنسبة إلى تطبيقات حزمة تطوير البرامج (SDK) لنظام التشغيل Android، يمكنك في أغلب الأحيان إزالة هذه العناصر باستخدام علامة ملف التصميم forceHasOverlappedRendering:false لإيقاف عمليات التقديم المؤقتة لهذا التنسيق.
    • يمكنك الاطّلاع على تجنُّب عمليات العرض المتداخلة كأحد المراجع الرائعة حول عمليات العرض المتداخلة.
  • تجنَّب تحميل صور العناصر النائبة متى أمكن، واستخدِم @android:color/ أو @color لمواد عرض العناصر النائبة.
  • تجنَّب إنشاء تركيبة من عدة صور على الجهاز عندما يمكن إجراء عملية التركيب بلا اتصال بالإنترنت. يُفضَّل تحميل صور مستقلة بدلاً من إنشاء صور من الصور التي تم تنزيلها.
  • اتّبِع دليل التعامل مع ملفات الأشكال الممسوحة ضوئيًا للتعامل بشكل أفضل مع ملفات الأشكال الممسوحة ضوئيًا.

ذاكرة Anon+Swap

يتألف Anon+Swap من عمليات تخصيص الذاكرة لبرامج Native وJava وStack في أداة تحليل ذاكرة Android Studio. استخدِم ActivityManager.isLowMemoryDevice() للتحقّق مما إذا كان الجهاز يواجه نقصًا في الذاكرة، والتكيّف مع هذا الموقف باتّباع هذه الإرشادات.

  • الوسائط:
    • تحديد حجم متغيّر لمخازن الوسائط المؤقتة استنادًا إلى الجهاز وذاكرة الوصول العشوائي (RAM) ودقة تشغيل الفيديو من المفترض أن يمثّل ذلك دقيقة واحدة من تشغيل الفيديو:
      1. من 40 إلى 60 ميغابايت لسعة 1 غيغابايت / 1080p
      2. من 60 إلى 80 ميغابايت لفيديو بسعة 1.5 غيغابايت بدقة 1080p
      3. من 80 إلى 100 ميغابايت لفيديو بسعة 1.5 غيغابايت ودقة 2160p
      4. من 100 إلى 120 ميغابايت لفيديو بسعة 2 غيغابايت / بدقة 2160p
    • إلغاء تخصيص ذاكرة الوسائط عند تغيير حلقة لمنع الزيادة في إجمالي مقدار الذاكرة المجهولة
    • أطلِق موارد الوسائط وأوقِفها على الفور عند إيقاف تطبيقك: استخدِم الاستدعاءات المتكرّرة لدورة حياة النشاط لمعالجة موارد الصوت والفيديو. إذا لم تكن من تطبيقات الصوت، أوقِف التشغيل عند حدوث onStop() في نشاطاتك، واحفظ كل العمل الذي تُجريه واضبط مواردك لإخلاء ذاكرتها. لتحديد موعد لعمل قد تحتاج إليه لاحقًا. اطّلِع على القسم المهام والتنبيهات.
    • الانتباه إلى ذاكرة التخزين المؤقت عند تقديم الفيديو: غالبًا ما يخصّص المطوّرون من 15 إلى 60 ثانية إضافية من المحتوى المستقبلي عند محاولة تجهيز الفيديو للمستخدم، ولكنّ ذلك يتسبب في زيادة استهلاك الذاكرة. بشكل عام، لا تشغّل أكثر من 5 ثوانٍ من الفيديو المحفوظ مؤقتًا في المستقبل إلى أن يحدد المستخدم موضع الفيديو الجديد. إذا كنت بحاجة إلى مزيد من الوقت لتحميل المحتوى مسبقًا أثناء التقديم أو الإيقاف، يُرجى التأكّد مما يلي:
      • تخصيص مساحة التخزين المؤقت للتقديم أو الإيقاف مسبقًا وإعادة استخدامها
      • يجب ألا يزيد حجم المخزن المؤقت عن 15 إلى 25 ميغابايت (حسب ذاكرة الجهاز).
  • عمليات التوزيع:
    • اتّبِع إرشادات ذاكرة الرسومات للتأكّد من عدم تكرار الصور في الذاكرة المجهولة
        .
      • غالبًا ما تكون الصور هي أكبر مستخدم للذاكرة، لذا فإن تكرارها يمكن أن يضع ضغطًا كبيرًا على الجهاز. وينطبق ذلك بشكل خاص أثناء التنقّل المكثّف في طرق عرض شبكات الصور.
    • إلغاء التخصيصات من خلال إزالة مراجعها عند نقل الشاشات: تأكّد من عدم توفّر أيّ إشارات إلى ملفات الأشكال الممسوحة وعناصر متبقية.
  • المكتبات:
    • عمليات تخصيص الذاكرة للملف الشخصي من المكتبات عند إضافة مكتبات جديدة، لأنّه قد تحمّل المكتبات الإضافية أيضًا، ما قد يؤدي بدوره إلى عمليات تخصيص وإنشاء عمليات ربط.
  • التواصل:
    • لا تُجري عمليات حظر لطلبات البيانات من الشبكة أثناء بدء تشغيل التطبيق، لأنّها تبطئ وقت بدء تشغيل التطبيق وتؤدي إلى زيادة في استخدام الذاكرة أثناء الإطلاق، حيث تكون الذاكرة مقيّدة بشكل خاص بتحميل التطبيق. يمكنك عرض شاشة تحميل أو شاشة البداية أولاً ثم إرسال طلبات إلى الشبكة بعد أن يتم تجهيز واجهة المستخدِم.

عمليات الربط

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

عمليات الربط النموذجية وأفضل الممارسات:

  • واجهة برمجة التطبيقات Play Integrity API: تُستخدَم للتحقّق من سلامة الجهاز
    • التحقّق من سلامة الجهاز بعد ظهور شاشة التحميل وقبل تشغيل الوسائط
    • يجب إزالة أيّ إشارات إلى PlayIntegrity StandardIntegrityManager قبل تشغيل المحتوى.
  • مكتبة الفوترة في Play: تُستخدَم لإدارة الاشتراكات والمشتريات باستخدام Google Play
    • يمكنك إعداد المكتبة بعد ظهور شاشة التحميل، ومعالجة كل المهام المتعلّقة بالحساب قبل تشغيل أي وسائط.
    • استخدِم الرمز BillingClient.endConnection() عند الانتهاء من استخدام المكتبة وقبل تشغيل الفيديو أو الوسائط في كل مرة.
    • استخدِم BillingClient.isReady() وBillingClient.getConnectionState() للتحقّق مما إذا تم قطع الاتصال بالخدمة في حال الحاجة إلى إكمال أي عمل متعلق بالفوترة، ثم استخدِم BillingClient.endConnection() مرة أخرى بعد الانتهاء.
  • GMS FontsProvider
    • يُفضَّل استخدام الخطوط المستقلة على الأجهزة التي تتضمّن ذاكرة وصول عشوائي منخفضة بدلاً من استخدام موفّر الخطوط، لأنّ تنزيل الخطوط باهظ التكلفة وسيؤدي FontsProvider إلى ربط الخدمات لإجراء ذلك.
  • مكتبة مساعد Google: يتم استخدامها أحيانًا للبحث والبحث داخل التطبيق. استبدِل هذه المكتبة إن أمكن.
    • بالنسبة إلى تطبيقات وضع الاستراحة: استخدِم ميزة "التحويل النصي إلى كلام" في Gboard أو مكتبة androidx.leanback.
      • اتّبِع إرشادات "بحث Google" لتنفيذ ميزة البحث.
      • ملاحظة: تم إيقاف leanback نهائيًا ويجب نقل التطبيقات إلى ميزة "إنشاء تطبيقات للتلفزيون".
    • لتطبيقات "الإنشاء":
      • استخدِم ميزة تحويل النص إلى كلام في Gboard لتنفيذ ميزة البحث الصوتي.
    • يمكنك استخدام ميزة المشاهدة تاليًا لجعل محتوى الوسائط في تطبيقك قابلاً للاكتشاف.

الخدمات التي تعمل في المقدّمة

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

في Android TV وGoogle TV، لا يُسمح بمتابعة تنفيذ الخدمات التي تعمل في المقدّمة إلا بعد مغادرة المستخدم للتطبيق:

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

الوظائف والمنبّهات

WorkManager هي أحدث واجهة برمجة تطبيقات لنظام التشغيل Android لجدولة المهام المتكررة في الخلفية. سيستخدم WorkManager الإصدار الجديد JobScheduler عند توفّره (حزمة SDK 23 والإصدارات الأحدث) والإصدار القديم AlarmManager عند عدم توفّره. للحصول على أفضل الممارسات لتنفيذ المهام المُجدوَلة على التلفزيون، اتّبِع الخطوات التالية:

  • تجنَّب استخدام واجهات برمجة تطبيقات AlarmManager، في الإصدار 23 من حزمة تطوير البرامج (SDK) والإصدارات الأحدث، ولا سيما AlarmManager.set()، AlarmManager.setExact() والطُرق المشابهة، لأنّها لا تسمح للنظام بتحديد الوقت المناسب لتشغيل المهام (على سبيل المثال، عندما يكون الجهاز في وضع السكون).
  • على الأجهزة التي تتضمّن ذاكرة وصول عشوائي منخفضة، تجنَّب تنفيذ المهام ما لم تكن ضرورية للغاية. إذا لزم الأمر، استخدِم WorkManager WorkRequest لتعديل الاقتراحات بعد التشغيل فقط، وحاول إجراء ذلك مع بقاء التطبيق مفتوحًا.
  • حدِّد WorkManager Constraints للسماح للنظام بتنفيذ مهامك في الوقت المناسب:

Kotlin

Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresStorageNotLow(true)
    .setRequiresDeviceIdle(true)
    .build()

Java

Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresStorageNotLow(true)
    .setRequiresDeviceIdle(true)
    .build()
  • إذا كان عليك تنفيذ المهام بانتظام (على سبيل المثال، لتعديل المشاهدة تاليًا استنادًا إلى نشاط مشاهدة المحتوى من قِبل المستخدم في تطبيقك على جهاز آخر)، عليك تقليل استخدام الذاكرة والحفاظ على استهلاك الذاكرة للمهمة أدنى من 30 ميغابايت.

اعتبارات عامة حول الذاكرة

تقدّم الإرشادات التالية معلومات عامة حول تطوير تطبيقات Android:

  • عليك تقليل عمليات تخصيص العناصر وتحسين إعادة استخدامها وإلغاء تخصيص أي عناصر غير مستخدَمة على الفور.
    • لا تحتفظ بمراجع إلى العناصر، خاصةً ملفات الأشكال الممسوحة ضوئيًا.
    • تجنَّب استخدام System.gc() وطلبات تحرير الذاكرة المباشرة لأنّها تتداخل مع عملية معالجة الذاكرة في النظام: على سبيل المثال، في الأجهزة التي تستخدم zRAM، يمكن أن يؤدي الطلب القسري على gc() إلى زيادة مؤقتة في استخدام الذاكرة بسبب ضغط الذاكرة وفك ضغطها.
    • استخدِم LazyList كما هو موضّح في متصفّح الكتالوج في Compose أو RecyclerView في مجموعة أدوات واجهة مستخدم Leanback UI المتوقّفة نهائيًا الآن لإعادة استخدام طرق العرض وعدم إعادة إنشاء عناصر القائمة.
    • تخزين العناصر التي تم قراءتها من مزوّدي المحتوى الخارجيين والتي من المرجّح ألا تتغيّر في ذاكرة التخزين المؤقت على الجهاز وتحديد فواصل التعديل التي تمنع تخصيص ذاكرة خارجية إضافية
  • تحقَّق من أي تسرُّب محتمل للذاكرة.
    • توخّ الحذر من حالات تسرُّب الذاكرة الشائعة، مثل المراجع داخل سلاسل المهام المجهولة، وإعادة تخصيص ذاكرة التخزين المؤقت للفيديو التي لا يتم إطلاقها أبدًا، وغيرها من الحالات المشابهة.
    • استخدِم تجميع الذاكرة لمحاولة تصحيح أخطاء تسرّب الذاكرة.
  • أنشئ ملفات تعريف أساسية لتقليل مقدار الترجمة الفورية المطلوبة عند تنفيذ تطبيقك في عملية التشغيل على البارد.

فهم استرداد الذاكرة المباشر

عندما يطلب تطبيق Android TV ذاكرة وكان النظام تحت الضغط، قد يضطرّ "النواة" في نظام التشغيل Linux، الذي يشكّل أساس Android، إلى استخدام استرداد الذاكرة مباشرةً.

تتضمّن العملية إيقاف أي سلسلة تعليمات مخصّصة مؤقتًا في انتظار صفحات الذاكرة التي تمّت تحريرها. ويحدث ذلك عندما يتعذّر على ميزة "استرداد الذاكرة في الخلفية" الحفاظ على ذاكرة كافية بشكل استباقي.

ويمكن أن يؤدي ذلك إلى حدوث توقفات أو تقطُّعات ملحوظة في تجربة المستخدم لأنّه يوقف النظام مؤقتًا عملية تخصيص سلاسل المهام إلى أن تتوفّر ذاكرة كافية. وبهذا المعنى، لا تقتصر عملية تخصيص سلاسل المهام على طلبات رمز التطبيق مثل malloc()، بل يجب تخصيص الذاكرة للصفحة في صفحات الرموز البرمجية، على سبيل المثال.

ملخّص الأدوات