في الإصدار 9 من Android (والإصدارات الأقدم)، افترضت SurfaceFlinger وDisplayManagerService
توفُّر شاشتَين أصليتين كحد أقصى بمعرّفات 0
و1 مُبرمَجة بشكل ثابت. كما هو موضّح في مقالة
معرّفات الشاشة
الثابتة، يستخدم SurfaceFlinger الآن
واجهة برمجة تطبيقات Hardware Composer (HWC) لإنشاء أرقام تعريف ثابتة للشاشات، ما يتيح له
إدارة عدد عشوائي من الشاشات.
يمكن للإطار البحث عن رمز IBinder
المميّز لشاشة
أصلية من خلال SurfaceControl#getPhysicalDisplayToken
بعد الحصول على
معرّف الشاشة المكوّن من 64 بت من SurfaceControl#getPhysicalDisplayIds
أو
من حدث hotplug في DisplayEventReceiver
.
في الإصدار 10 من Android، تكون الشاشة الداخلية الأساسية
TYPE_BUILT_IN
، ويتم وضع علامة على جميع الشاشات الثانوية على أنّها
TYPE_HDMI
بغض النظر عن نوع الاتصال. لذلك، يتم حاليًا التعامل مع الشاشات العميقة
الداخلية الإضافية على أنّها خارجية. كحل بديل، يمكن للرمز المخصّص للجهاز أن يفترض DisplayAddress.Physical#getPort
إذا كان معرّف الجهاز الثابت معروفًا وكان منطق تخصيص المنفذ قابلاً للتوقّع.
التنفيذ
في السابق، كان يتم تحديد الشاشات باستخدام أرقام تعريف 32 بت، حيث يمثّل الرقم 0 الشاشة
الداخلية، ويمثّل الرقم 1 الشاشة الخارجية، ويمثّل الرقمان [2، INT32_MAX] الشاشات الافتراضية التي تستخدم تقنية "العرض عالي الدقة" (HWC)، ويمثّل الرقم -1 شاشة غير صالحة أو شاشة افتراضية لا تستخدم تقنية "العرض عالي الدقة". لكي يتمكّن كل من
SurfaceFlinger وDisplayManagerService
من تتبُّع أكثر من
عرضَين والتعرّف على الشاشات التي سبق أن تمّ عرضها، يجب منح الشاشات أرقام تعريف
ثابتة ومستدامة.
إذا كان "شركاء المعالجة المركزية للأجهزة" يتيحون IComposerClient.getDisplayIdentificationData
ويقدّمون بيانات تعريف الشاشة، يحلّل SurfaceFlinger بنية EDID
ويخصّص أرقام تعريف شاشة ثابتة بسعة 64 بت للشاشات المادية والافتراضية في "شركاء المعالجة المركزية للأجهزة". يتم التعبير عن الأرقام التعريفية باستخدام نوع خيار، حيث تمثل القيمة الفارغة
شاشة غير صالحة أو شاشة افتراضية غير متوافقة مع تقنية "العرض عالي الدقة". في حال عدم توفّر واجهة برمجة التطبيقات HWC، يعود SurfaceFlinger إلى السلوك القديم مع شاشةَين ماديتَين كحد أقصى.