اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release بدلاً من aosp-main لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
في حِزمة الرسومات، يتم وضع ذاكرة تخزين مؤقت لكل طبقة بين Composer HAL و
SurfaceFlinger لتقليل الوقت المستغرَق في إرسال أوصاف الملفات
عبر واجهة برمجة التطبيقات (IPC). قبل Android 14، لم يكن يتم تنظيف ذاكرة التخزين المؤقت للمخازن المؤقتة عند انقطاع اتصال
GraphicBufferProducer بـ SurfaceFlinger
GraphicBufferConsumer، مثل عند انقطاع اتصال
MediaCodec بـ SurfaceView. بدءًا من الإصدار
14 من نظام التشغيل Android، يمكنك محو ذاكرة التخزين المؤقت للمرءّع بشكلٍ قسري لمحاولة
تقليل استهلاك ذاكرة الرسومات.
اختَر أحد الخيارَين التاليَين:
بالنسبة إلى الأجهزة التي تعمل بالإصدار 14 من نظام التشغيل Android والإصدارات الأحدث،
يجب تنفيذ الإصدار 3.2 من واجهة برمجة التطبيقات Composer HAL API. يتم تفعيل
هذا الخيار تلقائيًا ويوفر أكبر قدر من الذاكرة. يمكن للأجهزة التي يتم ترقيتها إلى الإصدار 14 والإصدارات الأحدث أيضًا استخدام هذا الخيار للاستفادة من مزايا الذاكرة الكاملة.
بالنسبة إلى الأجهزة التي يتم ترقيتها إلى Android 14 والتي
لا تريد تنفيذ واجهة برمجة التطبيقات Composer HAL 3.2 API عليها، يمكنك تفعيل
الخيار المتوافق مع الإصدارات القديمة. يحفظ هذا الخيار قدرًا من الذاكرة يقارب الحجم الذي يحفظه
الخيار السابق.
يوضّح القسمان التاليان كيفية تنفيذ كل خيار.
تنفيذ واجهة برمجة التطبيقات Composer HAL 3.2
للاستفادة من مزايا ذاكرة التخزين المؤقت للرسومات بالكامل، يجب:
حدِّث عملية تنفيذ HAL في Composer إلى الإصدار 3.2.
عالج العملية LayerCommand::bufferSlotsToClear من خلال إزالة إدخالات ملف التخزين المؤقت في المخزن المؤقت
المشار إليها بأرقام الفتحات المتوفّرة في القائمة.
واجهات برمجة التطبيقات الخاصة بـ Composer HAL 3.2 والمرتبطة بذاكرة التخزين المؤقت للرسومات، بما في ذلك
LayerCommand:bufferSlotsToClear، متوفّرة في
LayerCommand.aidl-.
تفعيل خيار التوافق مع الإصدارات القديمة
يحلّ خيار تقليل الذاكرة المتوافق مع الإصدارات القديمة محلّ مخزن مؤقت حقيقي في
فتحة التخزين المؤقت بمخزن مؤقت 1×1، ما يؤدي إلى توفير ذاكرة
لجميع الفتحات التي تمّت إزالتها، باستثناء فتحة المخزن المؤقت النشطة الحالية. للاستفادة من
مزايا توفير الذاكرة الجزئية، فعِّل الخيار المتوافق مع الإصدارات القديمة من خلال
ضبط surface_flinger.clear_slots_with_set_layer_buffer sysprop على
true. يمكن العثور على sysprop هذا في ملف
property_contexts.
يتطلب ضبط هذا sysprop أن يعالج تنفيذ HAL في Composer
بشكل صحيح أوامر setLayerBuffer متعددة للطبقة نفسها في دورة
عرض واحدة.
يؤدي تفعيل خيار التوافق مع الإصدارات القديمة إلى التأثيرات التالية:
بالنسبة إلى واجهات برمجة التطبيقات لHAL في واجهة برمجة التطبيقات (AIDL): تُرسِل SurfaceFlinger عدّة مثيلات من LayerCommand لطبقة واحدة، وكلّ منها يتضمّن BufferCommand واحدًا. يحتوي كل BufferCommand على معرّف عنصر نائب ومقدار ذاكرة التخزين المؤقت 1×1 ورقم خانة ذاكرة التخزين المؤقت التي
يجب تنظيفها.
بالنسبة إلى واجهات HIDL HAL: يُرسِل SurfaceFlinger عدة أوامر SELECT_DISPLAYSELECT_LAYERSET_BUFFER. تحتوي هذه الأوامر على معرّف ملف احتياطي
للعنصر النائب 1×1 ورقم خانة لخانة ملف التخزين المؤقت التي يجب
محو بياناتها.
قد يؤدي خيار التوافق مع الإصدارات القديمة إلى تعطُّل HAL في Composer على بعض
الأجهزة. قد تتمكّن من تعديل HAL في Composer لحلّ هذه المشكلة. يمكنك العثور على
الرمز الذي يتحكّم في هذا السلوك هنا:
لا يمكن للاختبارات التحقّق مما إذا كانت عمليات تنفيذ HAL
تُفرِغ خانات ذاكرة التخزين المؤقت. ومع ذلك، يمكنك استخدام أدوات تصحيح الأخطاء لمراقبة
استخدام وحدة تخزين الرسومات. أثناء المراقبة، من المفترض أن تلاحظ انخفاضًا في عدد
أخطاء "الذاكرة غير كافية" في السيناريوهات التي يتم فيها إيقاف
وتشغيل فيديوهات متعددة مختلفة بشكل متتابع وسريعة على YouTube.
تتوفّر اختبارات VTS للتحقّق من أنّ تنفيذ HAL قادر
وظيفيًا على تلقّي طلبات بيانات واجهة برمجة التطبيقات الجديدة (الإصدار 3.2 من HAL والإصدارات الأحدث) أو
أوامر setLayerBuffer متعددة لتنفيذ التوافق مع الإصدارات القديمة. ومع ذلك، لا يجب اعتبار هذا الاختبار كافيًا لتقييم
الوظائف المناسبة، لأنّ بعض الأجهزة تجتاز اختبارات VTS هذه،
ولكنّها لا تجتاز حالات الاستخدام في العالم الواقعي.
بالنسبة إلى اختبارات VTS الجديدة، انتقِل إلى الروابط التالية:
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Reduce graphics memory consumption\n\nIn the graphics stack, a per-layer buffer cache sits between Composer HAL and\nSurfaceFlinger to reduce the overhead associated with sending file descriptors\nover IPC. Prior to Android 14, this buffer cache\nwasn't purged when a\n[`GraphicBufferProducer`](https://android.googlesource.com/platform/frameworks/native/+/android16-release/libs/gui/include/gui/IGraphicBufferProducer.h) disconnects from a SurfaceFlinger\n[`GraphicBufferConsumer`](https://android.googlesource.com/platform/frameworks/native/+/android16-release/libs/gui/include/gui/IGraphicBufferConsumer.h), such as when a\nMediaCodec is disconnected from a SurfaceView. Starting with Android\n14, you can forcefully purge this buffer cache to\nreduce graphics memory consumption.\n| **Note:** The benefits of this feature are most apparent when a user is starting and stopping videos within an app on a device with a high-resolution display and limited memory, such as a television.\n\nChoose from one of the two following options:\n\n- For devices launching with Android 14 and higher, you must implement the new Composer HAL API version 3.2. This option is activated by default and saves the most memory. Devices upgrading to 14 and later can also use this option to achieve full memory benefits.\n- For devices upgrading to Android 14 for which you don't want to implement Composer HAL 3.2 API, you can enable the backward-compatible option. This option saves almost as much memory as the previous option.\n\nThe following two sections explain how to implement each option.\n\nImplement the Composer HAL 3.2 API\n----------------------------------\n\nTo achieve full graphics buffer memory benefits, you must:\n\n1. Update your Composer HAL implementation to version 3.2.\n2. Process `LayerCommand::bufferSlotsToClear` by purging buffer cache entries indicated by the slot numbers found in the list.\n\nThe Composer HAL 3.2 APIs related to graphic buffer memory, including\n`LayerCommand:bufferSlotsToClear`, are in\n[`LayerCommand.aidl-`](https://cs.android.com/android/platform/superproject/+/android-latest-release:hardware/interfaces/graphics/composer/aidl/android/hardware/graphics/composer3/LayerCommand.aidl).\n\nEnable the backward-compatible option\n-------------------------------------\n\nThe backward-compatible memory reduction option replaces a real buffer in\nthe cache slot with a 1x1 placeholder buffer, resulting in memory savings\nfor all purged slots, except for the current active buffer slot. To achieve\npartial memory saving benefits, enable the backward-compatible option by\nsetting the `surface_flinger.clear_slots_with_set_layer_buffer` sysprop to\n`true`. This sysprop is found in the\n[`property_contexts`](https://cs.android.com/android/platform/superproject/+/android-latest-release:system/sepolicy/private/property_contexts?q=%22surface_flinger.clear_slots_with_set_layer_buffer%22)\nfile.\n\nSetting this sysprop requires your Composer HAL implementation to correctly\nhandle multiple `setLayerBuffer` commands for the same layer in a single\npresent cycle.\n\nEnabling the backward-compatible option has the following affects:\n\n- For AIDL HALs: SurfaceFlinger sends multiple `LayerCommand` instances for a\n single layer, each with a single `BufferCommand`. Each `BufferCommand` contains a 1x1\n placeholder buffer handle and a slot number for the cache buffer slot that\n needs to be purged.\n\n- For HIDL HALs: SurfaceFlinger sends multiple `SELECT_DISPLAY`,\n `SELECT_LAYER`, `SET_BUFFER` commands. These commands contain a 1x1 placeholder\n buffer handle and a slot number for the cache buffer slot that needs to be\n purged.\n\nThe backward-compatible option might cause the Composer HAL to crash on some\ndevices. You might be able to modify your Composer HAL to solve this issue. The\ncode controlling this behavior is found here:\n\n- [SurfaceFlinger code for AIDL HALs](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp#854)\n\n- [SurfaceFlinger code for HIDL HALs](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp#718)\n\nTest graphics buffer cache memory consumption\n---------------------------------------------\n\nTests can't verify whether the cache slots are purged by HAL\nimplementations. However, you can use your debugging tools to monitor\ngraphic buffer usage. As you monitor, you should notice that there are fewer\nout-of-memory errors in scenarios where multiple different videos are stopped\nand started in quick succession on YouTube.\n\nVTS tests are available that verify that the HAL implementation is\nfunctionally capable of receiving the new API calls (HAL version 3.2+) or\nmultiple `setLayerBuffer` commands for the backward-compatible\nimplementation. However, this shouldn't be considered sufficient testing for\nproper functionality, as some devices pass these VTS tests,\nbut fail during real-world use cases.\n\nFor new VTS tests, navigate to the following links:\n\n- HIDL compatible: [`GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp#891)\n\n- AIDL 3.1 compatible: [`GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp#1817)\n\n- AIDL 3.2: [`GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp#1770)"]]