W Androidzie 9 (i starszych) SurfaceFlinger i DisplayManagerService
zakładały istnienie maksymalnie 2 fizycznych wyświetlaczy z zakodowanymi identyfikatorami 0 i 1. Zgodnie z opisem w artykule Identyfikatory statycznych wyświetlaczy aplikacja SurfaceFlinger korzysta teraz z interfejsu API kompozytora sprzętowego (HWC) do generowania stabilnych identyfikatorów wyświetlaczy, co umożliwia zarządzanie dowolną liczbą fizycznych wyświetlaczy.
Framework może wyszukiwać token IBinder
dla fizycznego wyświetlacza za pomocą SurfaceControl#getPhysicalDisplayToken
po uzyskaniu 64-bitowego identyfikatora wyświetlacza z SurfaceControl#getPhysicalDisplayIds
lub ze zdarzenia DisplayEventReceiver
hotplug.
W Androidzie 10 główny wewnętrzny wyświetlacz jest oznaczony jakoTYPE_BUILT_IN
, a wszystkie dodatkowe wyświetlacze są oznaczane jakoTYPE_HDMI
niezależnie od typu połączenia. Dlatego dodatkowe wyświetlacze wewnętrzne są obecnie traktowane jako zewnętrzne. Jako obejście problemu kod specyficzny dla urządzenia może zakładać, że DisplayAddress.Physical#getPort
jest znany, a logika przypisywania portów jest przewidywalna.
Implementacja
Wcześniej wyświetlacze były identyfikowane za pomocą 32-bitowych identyfikatorów, gdzie 0 to wyświetlacz wewnętrzny, 1 to wyświetlacz zewnętrzny, [2, INT32_MAX] to wirtualne wyświetlacze HWC, a -1 to nieprawidłowy wyświetlacz lub wirtualny wyświetlacz inny niż HWC. Aby SurfaceFlinger i DisplayManagerService
mogły śledzić więcej niż 2 wyświetlacze i rozpoznawać wcześniej wyświetlane wyświetlacze, wyświetlacze powinny mieć stabilne i trwałe identyfikatory.
Jeśli HWC obsługuje IComposerClient.getDisplayIdentificationData
i zawiera dane identyfikacyjne wyświetlacza, SurfaceFlinger analizuje strukturę EDID i przydziela stabilne 64-bitowe identyfikatory wyświetlaczy dla fizycznych i wirtualnych wyświetlaczy HWC. Identyfikatory są wyrażane za pomocą typu opcji, gdzie wartość null reprezentuje nieprawidłowy wyświetlacz lub wirtualny wyświetlacz, który nie jest wyświetlaczem z usługą HWC. Bez obsługi HWC SurfaceFlinger korzysta z zachowania zgodnego ze starszymi wersjami, w których jest maksymalnie 2 wyświetlacze fizyczne.