การตกแต่งระบบ

ใน 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 จอ