الذاكرة غير المُعدَّة

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

ذاكرة مساحة المستخدم التي تمّت تهيئتها على القيمة 0

منذ Android 12، يتمّ بدء ذاكرة الحزمة بقيمة الصفر في جميع الرموز البرمجية الأصلية للنظام الأساسي (بما في ذلك JNI) ويتمّ بدء ذاكرة الشريحة بقيمة الصفر في جميع العمليات الأصلية للنظام الأساسي (مثل netd) ولكن ليس في zygote أو في التطبيقات.

ننصح بشدة باستخدام -ftrivial-auto-var-init=zero علامة المُجمِّع لإعداد متغيّرات -ftrivial-auto-var-init=zero المحلية في الحزمة البرمجية على القيمة 0 في التطبيقات الأصلية والتطبيقات التابعة لجهات خارجية التي تم إنشاؤها باستخدام حزمة NDK. يعمل المُجمِّع على تحسين أي عمليات وضع صفر غير ضرورية. على سبيل المثال، عند بدء تشغيل متغيّر محلي بشكل صريح (مثلاً، يتم بدء تشغيل المتغيّر int x = 123; مرة واحدة فقط).x إذا كان البرنامج يحتوي على مخزن مؤقت كبير للقوائم في أحد نقاط تركيز الأداء، يمكن للمطوّر إيقاف عملية الإعداد باستخدام سمة compilador:

__attribute__((__uninitialized__)) char buf[BUFSIZ];

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

int mallopt(M_BIONIC_ZERO_INIT, level)

حيث يكون المستوى 0 أو 1.

ذاكرة نواة تمّت تهيئتها بالكامل

يتمّ إعداد حزمة البرامج الأساسية ومساحة التخزين المؤقت على القيمة 0 لبرامج GKI الأساسية، وهو إجراء ننصح به بشدة في CDD.

لإعداد الحزمة، يستخدم GKI ملف الإعداد CONFIG_INIT_STACK_ALL_ZERO، ما يؤدي إلى إنشاء ملف ‎ kernel باستخدام علامة المُجمِّع -ftrivial-auto-var-init=zero. لبدء تشغيل الذاكرة العشوائية، يستخدم GKI CONFIG_INIT_ON_ALLOC_DEFAULT_ON، ما يؤدي إلى بدء تشغيل جميع عمليات تخصيص ذاكرة التخزين المؤقت للصفحات وSLUB وSLUB من الصفر عند إنشائها. هذا الخيار مشابه بشكل فعال لتمرير init_on_alloc=1 كخيار وقت تشغيل للنواة.

تقارير الأخطاء

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

مثال على تقرير خطأ تم إنشاؤه
  بواسطة أداة أمان الذاكرة
الشكل 1: تقارير الأخطاء التي تم إنشاؤها بواسطة أدوات أمان الذاكرة

أثناء التطوير، على المورّدين رصد أي أخطاء من خلال التحقّق من /data/tombstones و logcat بحثًا عن الأعطال الأصلية. لمزيد من المعلومات حول تصحيح أخطاء الرموز البرمجية الأصلية لنظام التشغيل Android، يمكنك الاطّلاع على المعلومات هنا.