زخارف النظام

في الإصدار 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 إلى السلوك القديم مع شاشةَين ماديتَين كحد أقصى.