Di Android 9 (dan yang lebih lama), SurfaceFlinger dan DisplayManagerService
menganggap adanya maksimal dua layar fisik dengan ID hard code 0
dan 1. Seperti yang dijelaskan dalam
ID
Tampilan Statis, SurfaceFlinger kini memanfaatkan
API Hardware Composer (HWC) untuk menghasilkan ID tampilan yang stabil, yang memungkinkannya
mengelola jumlah tampilan fisik arbitrer.
Framework dapat mencari token IBinder
untuk layar
fisik melalui SurfaceControl#getPhysicalDisplayToken
setelah mendapatkan
ID layar 64-bit dari SurfaceControl#getPhysicalDisplayIds
atau
dari peristiwa hotplug DisplayEventReceiver
.
Di Android 10, layar internal utama adalah
TYPE_BUILT_IN
, dan semua layar sekunder ditandai sebagai
TYPE_HDMI
, terlepas dari jenis koneksinya. Oleh karena itu, layar internal
tambahan saat ini diperlakukan sebagai eksternal. Sebagai solusi,
kode khusus perangkat dapat membuat asumsi tentang
DisplayAddress.Physical#getPort
jika HWC diketahui dan logika
alokasi port dapat diprediksi.
Implementasi
Sebelumnya, layar diidentifikasi dengan ID 32-bit, dengan 0 adalah layar internal, 1 adalah layar eksternal, [2, INT32_MAX] adalah layar virtual HWC, dan -1 mewakili layar yang tidak valid atau layar virtual non-HWC. Agar
SurfaceFlinger dan DisplayManagerService
dapat melacak lebih dari dua
layar dan mengenali layar yang telah dilihat sebelumnya, layar harus diberi ID
yang stabil dan persisten.
Jika HWC mendukung IComposerClient.getDisplayIdentificationData
dan memberikan data identifikasi tampilan, SurfaceFlinger akan mengurai struktur
EDID dan mengalokasikan ID tampilan 64-bit yang stabil untuk tampilan virtual
fisik dan HWC. ID dinyatakan menggunakan jenis opsi, dengan nilai null
mewakili tampilan yang tidak valid atau tampilan virtual non-HWC. Tanpa dukungan HWC,
SurfaceFlinger akan kembali ke perilaku lama dengan maksimal dua layar
fisik.