Dekorasi sistem

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.