ใน Android 9 (และต่ำกว่า) SurfaceFlinger และ DisplayManagerService
assumed the existence of at most two physical displays with hard-coded IDs 0 and 1 ดังที่อธิบายไว้ในตัวระบุการแสดงผลแบบคงที่ ตอนนี้ SurfaceFlinger ใช้ประโยชน์จาก API ของเครื่องมือจัดระเบียบฮาร์ดแวร์ (HWC) เพื่อสร้างรหัสการแสดงผลที่เสถียร ซึ่งช่วยให้สามารถจัดการจอแสดงผลจริงได้จำนวนเท่าใดก็ได้
เฟรมเวิร์กจะค้นหาโทเค็น IBinder
สำหรับจอแสดงผลจริงผ่าน SurfaceControl#getPhysicalDisplayToken
หลังจากได้รับรหัสจอแสดงผล 64 บิตจาก SurfaceControl#getPhysicalDisplayIds
หรือจากเหตุการณ์การเสียบปลั๊ก DisplayEventReceiver
ใน Android 10 จอแสดงผลภายในหลักจะแสดงเป็น TYPE_BUILT_IN
และจอแสดงผลรองทั้งหมดจะแสดงเป็น TYPE_HDMI
ไม่ว่าการเชื่อมต่อจะเป็นประเภทใดก็ตาม ดังนั้น จอแสดงผลภายในเพิ่มเติมจึงถือเป็นจอแสดงผลภายนอกในขณะนี้ วิธีแก้ปัญหาชั่วคราวคือ รหัสเฉพาะอุปกรณ์จะคาดเดาเกี่ยวกับDisplayAddress.Physical#getPort
ได้หากทราบ HWC และสามารถคาดการณ์ตรรกะการจัดสรรพอร์ตได้
การใช้งาน
ก่อนหน้านี้ จอแสดงผลจะระบุด้วยรหัส 32 บิต โดยที่ 0 คือจอแสดงผลภายใน 1 คือจอแสดงผลภายนอก [2, INT32_MAX] คือจอแสดงผลเสมือน HWC และ -1 แสดงถึงจอแสดงผลที่ไม่ถูกต้องหรือจอแสดงผลเสมือนที่ไม่ใช่ HWC หากต้องการให้ SurfaceFlinger และ DisplayManagerService
ติดตามจอแสดงผลมากกว่า 2 จอและจดจำจอแสดงผลที่เคยเห็นก่อนหน้านี้ จอแสดงผลควรมีรหัสที่คงที่และถาวร
หาก HWC รองรับ IComposerClient.getDisplayIdentificationData
และระบุข้อมูลการระบุจอแสดงผล SurfaceFlinger จะแยกวิเคราะห์โครงสร้าง EDID และจัดสรรรหัสจอแสดงผล 64 บิตที่เสถียรสำหรับจอแสดงผลจริงและจอแสดงผลเสมือนของ HWC รหัสจะแสดงโดยใช้ประเภทตัวเลือก โดยค่าว่างจะแสดงถึงจอแสดงผลที่ไม่ถูกต้องหรือจอแสดงผลเสมือนที่ไม่ใช่ HWC หากไม่มีการสนับสนุน HWC ทาง SurfaceFlinger จะกลับไปใช้ลักษณะการทำงานเดิมที่มีจอแสดงผลจริงได้สูงสุด 2 จอ