Dekoracje systemu

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.getDisplayIdentificationDatai 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.