إنّ تحسين الذاكرة أمر مهم لضمان الأداء السلس ومنع تعطُّل التطبيقات والحفاظ على ثبات النظام وسلامة المنصة. على الرغم من أنّه يجب مراقبة استخدام ملف الذاكرة وتحسينه في كل تطبيق، تواجه تطبيقات المحتوى المخصّصة للتلفزيون أجهزة تحديات محدّدة تختلف عن تطبيقات Android العادية المخصّصة للأجهزة الجوّالة.
يمكن أن يؤدي استهلاك الذاكرة بشكلٍ كبير إلى حدوث مشاكل في سلوك التطبيق والنظام، ويشمل ذلك ما يلي:
- يمكن أن يصبح التطبيق نفسه بطيئًا أو يتأخّر في التحميل، أو قد يتم إيقافه نهائيًا في أسوأ الحالات.
- خدمات النظام التي تظهر للمستخدم (عناصر التحكّم في مستوى الصوت وإعدادات الصورة لوحة البيانات و"مساعد Google الصوتي" وما إلى ذلك) تصبح بطيئة جدًا أو قد لا تعمل على الإطلاق.
- يمكن إيقاف مكونات النظام، ثم إعادة تشغيلها، مما يؤدي إلى تصاعد طلبات الموارد بشكل كبير ويؤثر بشكل مباشر في التطبيق الذي يعمل في المقدّمة.
- يمكن أن يتأخّر الانتقال إلى مشغّل التطبيقات بشكل كبير، ويبدو أنّ التطبيق الذي يعمل في المقدّمة لا يستجيب إلى أن تنتهي عملية النقل.
- قد يدخل النظام في حالة استرداد مباشر، ويؤدي ذلك إلى إيقاف تنفيذ سلاسل المهام مؤقتًا أثناء انتظار تخصيص الذاكرة. يمكن أن يحدث ذلك لأي سلسلة تعليمات، مثل السلسلة الرئيسية أو سلاسل التعليمات ذات الصلة بترميز الفيديو، مما قد يؤدي إلى تقطُّع لقطات الصوت والفيديو وظهور أخطاء في واجهة المستخدم.
ملاحظات حول الذاكرة على أجهزة التلفزيون
عادةً ما تحتوي أجهزة التلفزيون على ذاكرة أقل بكثير من الهواتف أو الأجهزة اللوحية. على سبيل المثال، يمكننا رؤية إعداد على التلفزيون يتضمن ذاكرة وصول عشوائي (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 التي كانت ستظهر في ذاكرة الرسومات وذاكرة المستخدِم المجهول.
- في المكتبات مثل Glide، فعِّل ميزة
- تجنَّب عمليات العرض المؤقتة وعمليات إعادة العرض
- يمكن تحديد هذه المشاكل باستخدام أداة Android GPU Inspector:
- ابحث في قسم "المواد" عن الصور التي تمثّل خطوات نحو العرض النهائي بدلاً من أن تكون فقط العناصر التي تشكلها، وهذا هو ما يُعرف عادةً باسم "العرض الوسيط".
- بالنسبة إلى تطبيقات حزمة تطوير البرامج (SDK) لنظام التشغيل Android، يمكنك في أغلب الأحيان إزالة هذه العناصر باستخدام علامة ملف التصميم
forceHasOverlappedRendering:false
لتعطيل عمليات التقديم المؤقتة لهذا التنسيق. - يمكنك الاطّلاع على المقالة تجنُّب عمليات العرض المتداخلة حول عمليات العرض المتداخلة كمرجع رائع.
- تجنَّب تحميل صور العناصر النائبة متى أمكن، واستخدِم
@android:color/
أو@color
لمواد عرض العناصر النائبة. - تجنَّب إنشاء تركيبة من عدة صور على الجهاز عندما يمكن إجراء عملية التركيب بلا اتصال بالإنترنت. يُفضَّل تحميل صور مستقلة بدلاً من إنشاء صور من الصور التي تم تنزيلها.
- اتّبِع دليل التعامل مع ملفات الخطوط الممسوحة ضوئيًا للتعامل بشكل أفضل مع ملفات الخطوط الممسوحة ضوئيًا.
ذاكرة Anon+Swap
يتألف Anon+Swap من عمليات تخصيص الذاكرة لبرامج Native وJava وStack في أداة تحليل ذاكرة Android Studio. استخدِم
ActivityManager.isLowMemoryDevice()
للتحقّق مما إذا كان الجهاز يواجه نقصًا في الذاكرة، والتكيّف مع هذا الموقف
باتّباع هذه الإرشادات.
- الوسائط:
- تحديد حجم متغيّر لمخازن الوسائط المؤقتة استنادًا إلى الجهاز
وذاكرة الوصول العشوائي (RAM) ودقة تشغيل الفيديو من المفترض أن يمثّل ذلك دقيقة واحدة
من تشغيل الفيديو:
- من 40 إلى 60 ميغابايت لسعة 1 غيغابايت / 1080p
- من 60 إلى 80 ميغابايت لفيديو بسعة 1.5 غيغابايت بدقة 1080p
- من 80 إلى 100 ميغابايت لفيديو بسعة 1.5 غيغابايت ودقة 2160p
- من 100 إلى 120 ميغابايت لفيديو بسعة 2 غيغابايت / بدقة 2160p
- إلغاء تخصيص ذاكرة الوسائط عند تغيير حلقة لمنع الزيادة في إجمالي مقدار الذاكرة المجهولة
- أطلِق موارد الوسائط وأوقِفها على الفور عند
إيقاف تطبيقك: استخدِم الاستدعاءات المتكرّرة لدورة حياة
النشاط لمعالجة موارد الصوت والفيديو. إذا لم تكن من تطبيقات الصوت،
أوقِف التشغيل عند حدوث
onStop()
في نشاطاتك، واحفظ كل العمل الذي تُجريه واضبط مواردك لإخلاء ذاكرتها. لتحديد موعد لعمل قد تحتاج إليه لاحقًا. اطّلِع على القسم المهام والتنبيهات.- يمكنك استخدام المكوّنات المتوافقة مع دورة الحياة
مثل
LiveData
وLifecycleOwner
لمساعدتك في التعامل مع طلبات دورة حياة النشاط. - لجعل عملك مدركًا لدورة الحياة، يمكنك أيضًا استخدام كوروتينات Kotlin وعمليات Kotlin.
- يمكنك استخدام المكوّنات المتوافقة مع دورة الحياة
مثل
- الانتباه إلى ذاكرة التخزين المؤقت عند تقديم الفيديو: غالبًا ما يخصّص المطوّرون من 15 إلى 60 ثانية إضافية من المحتوى المستقبلي عند محاولة تجهيز الفيديو للمستخدم، ولكنّ ذلك يتسبب في زيادة استهلاك الذاكرة.
بشكل عام، لا تشغّل أكثر من 5 ثوانٍ من الفيديو المحفوظ مؤقتًا في المستقبل إلى أن يحدد المستخدم
موضع الفيديو الجديد. إذا كنت بحاجة إلى مزيد من الوقت لتحميل المحتوى مسبقًا أثناء التقديم أو الإيقاف، يُرجى اتّباع الخطوات التالية:
- تخصيص مساحة التخزين المؤقت للتقديم أو الإيقاف مسبقًا وإعادة استخدامها
- يجب ألا يزيد حجم المخزن المؤقت عن 15 إلى 25 ميغابايت (حسب ذاكرة الجهاز).
- تحديد حجم متغيّر لمخازن الوسائط المؤقتة استنادًا إلى الجهاز
وذاكرة الوصول العشوائي (RAM) ودقة تشغيل الفيديو من المفترض أن يمثّل ذلك دقيقة واحدة
من تشغيل الفيديو:
- عمليات التوزيع:
- اتّبِع إرشادات ذاكرة الرسومات لضمان عدم تكرار الصور في الذاكرة المجهولة
- .
- غالبًا ما تكون الصور هي أكبر مستخدم للذاكرة، لذا فإن تكرارها يمكن أن يضع ضغطًا كبيرًا على الجهاز. وينطبق ذلك بشكل خاص أثناء التنقّل المكثّف في طرق عرض شبكات الصور.
- إلغاء التخصيصات عن طريق إزالة مراجعها عند نقل الشاشات: تأكّد من عدم توفّر أيّ إشارات إلى ملفات الأشكال الممسوحة وعناصر أخرى.
- اتّبِع إرشادات ذاكرة الرسومات لضمان عدم تكرار الصور في الذاكرة المجهولة
- المكتبات:
- عمليات تخصيص الذاكرة للملف الشخصي من المكتبات عند إضافة مكتبات جديدة، لأنّه قد تحمّل المكتبات الإضافية أيضًا، ما قد يؤدي بدوره إلى عمليات تخصيص وإنشاء عمليات ربط.
- التواصل:
- لا تُجري عمليات حظر لطلبات البيانات من الشبكة أثناء بدء تشغيل التطبيق، لأنّها تبطئ وقت بدء تشغيل التطبيق وتؤدي إلى زيادة في استخدام الذاكرة أثناء التشغيل، حيث تكون الذاكرة مقيّدة بشكل خاص بتحميل التطبيق. يمكنك عرض شاشة تحميل أو شاشة البداية أولاً ثم إرسال طلبات إلى الشبكة بعد أن يتم تجهيز واجهة المستخدِم.
عمليات الربط
تؤدي عمليات الربط إلى زيادة استهلاك الذاكرة لأنّها تُحمِّل التطبيقات الأخرى في الذاكرة أو تزيد من استهلاك الذاكرة للتطبيق المرتبط (إذا كان في الذاكرة سابقًا) لتسهيل طلب البيانات من واجهة برمجة التطبيقات. ونتيجةً لذلك، يقلّ حجم المساحة التخزينية المتاحة للتطبيق الذي يعمل في المقدّمة. عند ربط خدمة، انتبه إلى وقت استخدام عملية الربط ومدتها. احرص على إلغاء الربط فورًا بعد أن تصبح هذه الميزة غير ضرورية.
عمليات الربط النموذجية وأفضل الممارسات:
- واجهة برمجة التطبيقات 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 نهائيًا ويجب نقل التطبيقات إلى ميزة "إنشاء تطبيقات للتلفزيون".
- لتطبيقات Compose:
- استخدام ميزة تحويل النص إلى كلام في Gboard لتنفيذ ميزة البحث الصوتي
- يمكنك استخدام ميزة المشاهدة تاليًا لجعل محتوى الوسائط في تطبيقك قابلاً للاكتشاف.
- بالنسبة إلى تطبيقات وضع الاستلقاء: استخدِم ميزة تحويل النص إلى كلام في Gboard أو مكتبة
androidx.leanback.
الخدمات التي تعمل في المقدّمة
الخدمات التي تعمل في المقدّمة هي نوع خاص من الخدمات مرتبط بإشعار. يتم عرض هذا الإشعار في علبة الإشعارات على الهواتف والأجهزة اللوحية، ولكن لا تتضمّن أجهزة التلفزيون علبة إشعارات بالمعنى نفسه. حتى إذا كانت الخدمات التي تعمل في المقدّمة مفيدة لأنّه يمكن إبقاءها تعمل عندما يكون التطبيق في الخلفية، يجب أن تتّبع تطبيقات التلفزيون الإرشادات التالية:
في 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 المتوقّفة نهائيًا الآن لإعادة استخدام طرق العرض وعدم إعادة إنشاء عناصر القائمة. - تخزين العناصر التي تم قراءتها من مزوّدي المحتوى الخارجيين والتي من المرجّح ألا تتغيّر في ذاكرة التخزين المؤقت على الجهاز وتحديد فواصل التعديل التي تمنع تخصيص ذاكرة خارجية إضافية
- تحقَّق من أي تسرُّب محتمل للذاكرة.
- توخّ الحذر من حالات تسرُّب الذاكرة الشائعة، مثل المراجع داخل سلاسل المهام المجهولة، وإعادة تخصيص ذاكرة التخزين المؤقت للفيديو التي لا يتم إطلاقها أبدًا، وغيرها من الحالات المشابهة.
- استخدِم تجميع الذاكرة لمحاولة تصحيح أخطاء تسرّب الذاكرة.
- أنشئ ملفات تعريف أساسية لتقليل مقدار المدة التي تستغرقها عملية الترجمة أثناء التشغيل عند تنفيذ تطبيقك في عملية التشغيل على البارد.
ملخّص الأدوات
- استخدِم أداة أداة تحليل الذاكرة في "استوديو Android"
للتحقّق من استهلاك الذاكرة أثناء الاستخدام.
- استخدِم heapdump لفحص عمليات تخصيص محددة للكائنات وملفات البِت المميّزة.
- استخدِم أداة تحليل الذاكرة الأصلية للتحقّق من عمليات تخصيص الذاكرة غير المرتبطة بلغة Java أو Kotlin.
- استخدِم أداة Android GPU Inspector للتحقّق من عمليات تخصيص الرسومات.