Android 9 (ve önceki sürümler)'de SurfaceFlinger ve DisplayManagerService
, sabit kodlu 0 ve 1 kimliklerine sahip en fazla iki fiziksel ekranın varlığını varsayıyordu. Statik Ekran Tanımlayıcıları bölümünde açıklandığı gibi, SurfaceFlinger artık kararlı ekran kimlikleri oluşturmak için bir Donanım Bestecisi (HWC) API'sinden yararlanıyor. Bu sayede, herhangi bir sayıda fiziksel ekranı yönetebiliyor.
Çerçeve, SurfaceControl#getPhysicalDisplayIds
'den veya DisplayEventReceiver
hotplug etkinliğinden 64 bit ekran kimliğini aldıktan sonra SurfaceControl#getPhysicalDisplayToken
aracılığıyla fiziksel bir ekran için IBinder
jetonunu arayabilir.
Android 10'da birincil dahili ekran TYPE_BUILT_IN
, tüm ikincil ekranlar ise bağlantı türünden bağımsız olarak TYPE_HDMI
olarak işaretlenir. Bu nedenle, ek dahili ekranlar şu anda harici olarak kabul edilir. Geçici çözüm olarak, cihaza özgü kod, HWC biliniyorsa ve bağlantı noktası tahsis mantığı tahmin edilebilirse DisplayAddress.Physical#getPort
hakkında varsayımlarda bulunabilir.
Uygulama
Daha önce ekranlar 32 bit kimliklerle tanımlanıyordu. Bu kimliklerde 0 dahili ekranı, 1 harici ekranı, [2, INT32_MAX] HWC sanal ekranlarını ve -1 geçersiz ekranı veya HWC olmayan sanal ekranı temsil ediyordu. SurfaceFlinger ve DisplayManagerService
'ün ikiden fazla ekranı izlemesi ve daha önce görülen ekranları tanıması için ekranlara kararlı ve kalıcı kimlikler verilmelidir.
HWC, IComposerClient.getDisplayIdentificationData
desteği sağlıyorsa ve ekran tanımlama verileri sağlıyorsa SurfaceFlinger, EDID yapısını ayrıştırır ve fiziksel ve HWC sanal ekranlar için kararlı 64 bit ekran kimlikleri ayırır. Kimlikler, boş değerin geçersiz bir ekranı veya HWC olmayan sanal ekranı temsil ettiği bir seçenek türü kullanılarak ifade edilir. HWC desteği olmadan SurfaceFlinger, en fazla iki fiziksel ekranla eski davranışa geri döner.