تكوين ذاكرة الوصول العشوائي المنخفضة

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

تحسينات منصة Android kernel 4.4

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

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

ذاكرة النظام منخفضة

  • قلص system_server والعمليات UI نظام (حفظ عدة ميغابايت).
  • مخابئ dex المحملة مسبقًا في Dalvik (حفظت عدة ميغا بايت).
  • خيار JIT-off تم التحقق منه (يوفر ما يصل إلى 1.5 ميغابايت لكل عملية).
  • تقليل عبء التخزين المؤقت للخط لكل عملية.
  • قدم ArrayMap / ArraySet وتستخدم على نطاق واسع في إطار كبديل البصمة أخف ل HashMap / HashSet .

بروستاتس

تمت إضافة خيار مطور لإظهار حالة الذاكرة واستخدام ذاكرة التطبيق مرتبة حسب عدد مرات تشغيلها ومقدار الذاكرة المستهلكة.

API

واضاف ActivityManager.isLowRamDevice() للسماح التطبيقات للكشف عند تشغيل على أجهزة ذاكرة منخفضة واختيار الميزات-RAM كبيرة تعطيل.

تتبع الذاكرة

وأضاف memtrack HAL لتعقب تخصيص الذاكرة الرسومات، معلومات إضافية في dumpsys meminfo وملخصات أوضح في meminfo (على سبيل المثال، ذكرت يتضمن ذاكرة الوصول العشوائي RAM الحرة العمليات مؤقتا، بحيث مصنعي المعدات الأصلية لا تحاول تحسين شيء خاطئ).

تكوين وقت البناء

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

و ActivityManager.isLowRamDevice() يحدد العلم إذا التطبيقات يجب إيقاف ميزات معينة تستهلك ذاكرة أن العمل سيئة على الأجهزة الذاكرة منخفضة.

ل512 MB الأجهزة، ومن المتوقع أن يعود هذا العلم true . يمكن تمكينه من خلال خاصية النظام التالية في ملف makefile الخاص بالجهاز.

PRODUCT_PROPERTY_OVERRIDES += ro.config.low_ram=true

قاذفة Configs

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

تكوين النواة

ضبط kernel / ActivityManager لتقليل الاسترداد المباشر

يحدث الاسترداد المباشر عندما تحاول عملية أو النواة تخصيص صفحة من الذاكرة (إما بشكل مباشر أو بسبب خطأ في صفحة جديدة) وتستخدم النواة كل الذاكرة الخالية المتاحة. يتطلب هذا من النواة حظر التخصيص أثناء تحرير الصفحة. وهذا بدوره غالبا ما يتطلب القرص I / O لطرد صفحة المدعومة ملف القذرة أو الانتظار ل lowmemorykiller لوقف العملية. يمكن أن يؤدي هذا إلى إدخال / إخراج إضافي في أي مؤشر ترابط ، بما في ذلك مؤشر ترابط واجهة المستخدم.

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

الحد الأدنى الافتراضي لتشغيل استعادة الخلفية منخفض إلى حد ما ، حيث يبلغ حوالي 2 ميجابايت على جهاز بسعة 2 جيجابايت و 636 كيلو بايت على جهاز بسعة 512 ميجابايت. تستعيد النواة بضعة ميغا بايت فقط من الذاكرة في استعادة الخلفية. هذا يعني أن أي عملية تخصص بسرعة أكثر من بضعة ميغا بايت ستصل بسرعة إلى استرداد مباشر.

تمت إضافة دعم kernel tunable في فرع kernel Android-3.4 كـ patch 92189d47f66c67e5fd92eafaa287e153197a454f ("أضف كيلو بايتات مجانية إضافية قابلة للضبط"). الكرز اختيار هذا التصحيح إلى نواة جهاز يسمح ActivityManager لنقول للنواة في محاولة للحفاظ على ثلاثة ملء الشاشة 32 مخازن BPP الذاكرة مجانا.

يمكن تكوين هذه العتبات مع config.xml الإطار.

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists).  A high value will increase the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier.  A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller.  Overrides the default value chosen by ActivityManager based
on screen size.  0 prevents keeping any extra memory over what the kernel keeps
by default.  -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists).  0 uses the default value chosen by
ActivityManager.  A positive value  will increase the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier.  A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller.  Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

ضبط LowMemoryKiller

ActivityManager بتكوين عتبات LowMemoryKiller لتتناسب مع توقعاتها لمجموعة العمل الصفحات المدعومة من ملف (الصفحات المخبأة) المطلوبة لتشغيل العمليات في كل دلو مستوى الأولوية. إذا كان للجهاز متطلبات عالية لمجموعة العمل ، على سبيل المثال إذا كانت واجهة المستخدم الخاصة بالمورد تتطلب ذاكرة أكبر أو إذا تمت إضافة المزيد من الخدمات ، فيمكن زيادة العتبات.

يمكن تقليل العتبات إذا تم حجز قدر كبير جدًا من الذاكرة للصفحات المدعومة بالملفات ، بحيث يتم إيقاف عمليات الخلفية قبل وقت طويل من حدوث تحطم القرص بسبب صغر حجم ذاكرة التخزين المؤقت.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel.  A high value will cause the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory.  A low value will keep more
processes in memory but may cause thrashing if set too low.  Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets.  -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel.  A high value will cause the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory.  A low value will
keep more processes in memory but may cause thrashing if set too low.  Directly
added to the default value chosen by          ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>

مبادلة إلى zram

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

يتعامل Android مع المبادلة zram على عدة مستويات.

  • أولاً ، قم بتمكين خيارات kernel هذه لاستخدام مبادلة zram بفعالية:
    • CONFIG_SWAP
    • CONFIG_ZRAM
  • إضافة سطر يشبه هذا fstab الخاص بك:
    /dev/block/zram0 none swap defaults zramsize=<size in bytes>,swapprio=<swap partition priority>
    
    • zramsize إلزامي ويشير إلى مدى الذاكرة غير مضغوط المبلغ الذي ترغب في منطقة zram إلى الانتظار. يمكنك توقع نسب الضغط في نطاق 30-50٪.
    • swapprio هو اختياري وفقط للاستخدام إذا كان لديك مساحة تبادل أكثر من واحد.

    تسمية الجهاز كتلة المرتبطة باعتباره swap_block_device في جهاز معين sepolicy/file_contexts بحيث يتم التعامل معها بشكل صحيح من قبل سيلينو.

    /dev/block/zram0 u:object_r:swap_block_device:s0
    
  • بشكل افتراضي ، يتم تبديل Linux kernel في ثماني صفحات من الذاكرة في المرة الواحدة. عند استخدام zram ، فإن التكلفة الإضافية لقراءة صفحة واحدة في كل مرة لا تكاد تذكر ويمكن أن تساعد إذا كان الجهاز تحت ضغط الذاكرة الشديد. لقراءة صفحة واحدة فقط في كل مرة، إضافة ما يلي إلى حسابك init.rc :
    write /proc/sys/vm/page-cluster 0
    
  • في الخاص init.rc بعد mount_all /fstab.X الخط، إضافة:
    swapon_all /fstab.X
    
  • يتم تكوين مجموعات مجموعات الذاكرة تلقائيًا في وقت التمهيد إذا تم تمكين الميزة في النواة.
  • إذا هي سيغروبس الذاكرة المتوفرة، ActivityManager علامات المنخفض أولوية المواضيع على أنها أكثر قابلة للتبديل من المواضيع الأخرى. إذا كانت هناك حاجة الذاكرة، تبدأ النواة الروبوت المهاجرة صفحات الذاكرة لتبادل zram، وإعطاء أولوية أعلى لصفحات الذاكرة التي تميزت ActivityManager .

المنحوتات والأيونات وتخصيص الذاكرة المتجاورة (CMA)

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

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

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

نصائح تحسين التطبيق

  • مراجعة إدارة الذاكرة في تطبيقك وهذه بلوق وظائف:
  • إزالة أي أصول غير المستخدمة من التطبيقات المثبتة مسبقا باستخدام development/tools/findunused (وهذا يساعد على جعل التطبيق أصغر).
  • استخدم تنسيق PNG للأصول ، خاصةً عندما تحتوي على مناطق شفافة.
  • إذا كتابة التعليمات البرمجية الأصلية، واستخدام calloc() بدلا من malloc / memset .
  • لا تقم بتمكين الكود الذي يكتب بيانات الحزمة على القرص ويقرأها لاحقًا.
  • استخدم تصفية SSP بدلاً من الاشتراك في كل حزمة مثبتة. إضافة تصفية مثل هذا:
    <data android:scheme="package" android:ssp="com.android.pkg1" />
    <data android:scheme="package" android:ssp="com.myapp.act1" />
    

افهم حالات العمليات المختلفة في Android

حالة المعنى تفاصيل
SERVICE
SERVICE_RESTARTING
التطبيقات التي تعمل في الخلفية لأسباب متعلقة بالتطبيق. SERVICE SERVICE_RESTARTING هي أكثر المشاكل شيوعا التطبيقات لها عند تشغيلها في الخلفية كثيرا. استخدام٪ مدة * جهاز الأمن الوقائي أو مدة٪ بأنه "السوء" المتري. من الناحية المثالية ، لا ينبغي أن تعمل هذه التطبيقات على الإطلاق.
IMPORTANT_FOREGROUND
RECEIVER
التطبيقات التي تعمل في الخلفية (لا تتفاعل مباشرة مع المستخدم). هذه تضيف تحميل الذاكرة إلى النظام. استخدام (٪ مدة * PSS) قيمة "السوء" لأجل هذه العمليات. ومع ذلك ، فإن العديد من هذه التطبيقات تعمل لأسباب وجيهة. حجم جهاز الأمن الوقائي هو جزء مهم من الحمل ذاكرتهم.
PERSISTENT عملية النظام المستمرة. تتبع جهاز الأمن الوقائي لمراقبة هذه العمليات تزداد كبيرة جدا.
TOP العملية التي يتفاعل معها المستخدم حاليًا. جهاز الأمن الوقائي هو مهم متري هنا، والتي تبين مقدار الذاكرة تحميل يخلق التطبيق في حين الاستخدام.
HOME
CACHED_EMPTY
العمليات التي يحتفظ بها النظام في حالة الحاجة إليها مرة أخرى. يمكن قتل هذه العمليات بحرية في أي وقت وإعادة إنشائها إذا لزم الأمر. يتم حساب حالة الذاكرة (عادية ، معتدلة ، منخفضة ، حرجة) بناءً على عدد هذه العمليات التي يقوم النظام بتشغيلها. المفتاح المتري لهذه العمليات هو جهاز الامن الوقائي. في هذه الحالة ، تقلل هذه العمليات من آثار الذاكرة الخاصة بها قدر الإمكان ، للسماح بالاحتفاظ بأقصى عدد إجمالي من العمليات. في هذه الحالة، التطبيق تصرفت بشكل جيد عموما لديها بصمة PSS أصغر بكثير مما هي عليه في TOP الدولة.
CACHED_ACTIVITY
CACHED_ACTIVITY_CLIENT
بالمقارنة مع TOP ، وهذه تظهر مدى التطبيق بتحرير الذاكرة في الخلفية. باستثناء CACHED_EMPTY الدولة يجعل هذه البيانات بشكل أفضل، لأنه يزيل الحالات عندما بدأت عملية لبعض الأسباب إلى جانب التفاعل مع المستخدم. هذا يزيل التعامل مع واجهة المستخدم فوق CACHED_EMPTY يحصل عندما الأنشطة ذات الصلة المستخدم.

تحليل

جارٍ تحليل وقت بدء تشغيل التطبيق

لتحليل وقت بدء تشغيل التطبيق الخاص بك، قم بتشغيل $ adb shell am start -P أو --start-profiler والبدء في التطبيق الخاص بك. يبدأ ملف التعريف بعد أن يتم تشعب العملية من zygote وقبل تحميل أي كود في fork.

التحليل باستخدام تقارير الأخطاء

تحتوي تقارير الأخطاء العديد من الخدمات، بما في ذلك batterystats ، netstats ، procstats ، و usagestats ، والتي يمكن استخدامها من أجل التصحيح. يمكن أن تتضمن التقارير سطورًا مثل هذا:

------ CHECKIN BATTERYSTATS (dumpsys batterystats --checkin) ------
7,0,h,-2558644,97,1946288161,3,2,0,340,4183
7,0,h,-2553041,97,1946288161,3,2,0,340,4183

التحقق من وجود أي عمليات مستمرة

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

إجراء اختبارات طول العمر

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