Ekran özellikleri (ör. ekran modları ve desteklenen HDR türleri), harici olarak bağlanmış ekranlara (HDMI veya DisplayPort ile) sahip cihazlarda (ör. Android TV set üstü kutular ve OTT cihazlar) dinamik olarak değişebilir. Bu değişiklik, kullanıcının bir ekrandan diğerine geçmesi veya cihazı bağlı bir ekran olmadan başlatması gibi bir HDMI hotplug sinyali sonucunda gerçekleşebilir. Android 12 ve sonraki sürümlerde, tak çalıştır ve dinamik ekran özelliklerini işlemek için çerçevede değişiklikler yapıldı.
Bu sayfada, Composer HAL uygulamasında ekran takma/çıkarma işlemlerinin ve ekran özelliklerindeki değişikliklerin nasıl ele alındığı açıklanmaktadır. Ayrıca, ilişkili arabelleklerin nasıl yönetileceği ve bu durumlarda yarış koşullarının nasıl önleneceği de ele alınmaktadır.
Ekran özelliklerini güncelleme
Bu bölümde, Android çerçevesinin Composer HAL tarafından başlatılan ekran özelliklerindeki değişiklikleri nasıl işlediği açıklanmaktadır.
Android'in ekran özelliklerindeki değişiklikleri düzgün şekilde işleyebilmesi için OEM'nin, ekran özelliklerindeki değişiklikleri çerçeveye bildirmek üzere onHotplug(display, connection=CONNECTED)
kullanacak şekilde Composer HAL'yi uygulaması gerekir. Bu işlem uygulandıktan sonra Android, ekran özelliklerindeki değişiklikleri aşağıdaki gibi ele alır:
- Çerçeve, ekran özelliklerinde bir değişiklik algıladığında
onHotplug(display, connection=CONNECTED)
bildirimini alır. - Bildirim alındığında çerçeve, görüntüleme durumunu bırakır ve
getActiveConfig
,getDisplayConfigs
,getDisplayAttribute
,getColorModes
,getHdrCapabilities
vegetDisplayCapabilities
yöntemlerini kullanarak HAL'deki yeni özelliklerle yeniden oluşturur. - Çerçeve yeni bir görüntüleme durumu oluşturduktan sonra, bu tür etkinlikleri dinleyen uygulamalara
onDisplayChanged
geri çağırmasını gönderir.
Çerçeve, sonraki onHotplug(display, connection=CONNECTED)
etkinliklerinde çerçeve arabelleklerini yeniden ayırır. Yeni çerçeve arabelleklerinin ayrılması sırasında hataları önlemek için çerçeve arabellek belleğinin nasıl düzgün şekilde yönetileceği hakkında daha fazla bilgi edinmek için İstemci çerçeve arabelleği yönetimi başlıklı makaleyi inceleyin.
Sık karşılaşılan bağlantı senaryolarını ele alma
Bu bölümde, birincil ekran bağlıyken ve bağlantısı kesilmişken uygulamalarınızdaki çeşitli bağlantı senaryolarının nasıl doğru şekilde ele alınacağı açıklanmaktadır.
Android çerçevesi, mobil cihazlar için geliştirildiğinden bağlantısı kesilmiş bir birincil ekran için yerleşik destek sunmaz. Bunun yerine, birincil ekranın fiziksel olarak bağlantısı kesildiğinde HAL, çerçeveyle etkileşimlerinde birincil ekranı yer tutucu bir ekranla değiştirmelidir.
Aşağıdaki senaryolar, harici olarak bağlanmış ve bağlantısı kesilebilen ekranlara sahip STB'lerde ve TV dongle'larında meydana gelebilir. Bu senaryolar için destek uygulamak üzere aşağıdaki tablodaki bilgileri kullanın:
Senaryo | Kullanım |
---|---|
Başlatma sırasında bağlı ekran yok |
|
Birincil ekran fiziksel olarak bağlı olmalıdır. |
|
Birincil ekranın fiziksel bağlantısı kesilmişse |
|
HDMI dışı bağlantılarla ilgili dikkat edilmesi gereken noktalar
Android TV yalnızca aşağıdaki çözünürlükleri destekler:
- 720x1280
- 1080x1920
- 2160x3840
- 4320x7680
Bir STB veya TV dongle'ı, CVBS bağlantısı üzerinden 480i gibi desteklenmeyen bir çözünürlüğü görüntülemeye çalıştığında kullanıcıya bir hata mesajı gösterilir.
STB veya TV dongle'ında hem HDMI hem de HDMI olmayan bağlantılar varsa HDMI bağlantısı birincil ekran, HDMI olmayan bağlantı ise devre dışı olur. Sonuç olarak, HDMI bağlantısı kesildiğinde HDMI olmayan bağlantı hala bağlıysa SurfaceFlinger'a bir etkinlik gönderilir ve HDMI olmayan ekranın özellikleri getDisplayAttribute
ve diğer iComposerClient
API'leri (ör. getHdrCapabilities
) aracılığıyla yansıtılmalıdır.
Yarış durumlarını önlemek için sıralı yapılandırma kimlikleri kullanma
Composer HAL, desteklenen ekran yapılandırmalarını setActiveConfig
veya setActiveConfigWithConstraints
çağıran çerçeveyle eşzamanlı olarak güncellerse yarış koşulları ortaya çıkabilir.
Bu sorunu önlemek için sıralı kimlikler kullanmak üzere Composer HAL'ı uygulamanız gerekir.
Bu bölümde, yarış koşullarının nasıl oluşabileceği açıklanmakta ve ardından bu koşulları önlemek için sıralı kimlikler kullanacak şekilde Composer HAL'nin nasıl uygulanacağıyla ilgili ayrıntılar verilmektedir.
Yeni sıralı kimlikler yeni görüntülü reklam yapılandırmalarına ATANMADIĞINDA yarış durumu oluşmasına neden olan aşağıdaki etkinlik sırasını göz önünde bulundurun:
Desteklenen ekran yapılandırması kimlikleri şunlardır:
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
Çerçeve,
setActiveConfig(display, config=1)
işlevini çağırır.Aynı anda, Composer HAL, ekran yapılandırmalarındaki bir değişikliği işler ve dahili durumunu aşağıdaki gibi gösterilen yeni bir ekran yapılandırmaları grubuyla günceller:
- id=1, 2160x3840 60 Hz
- id=2, 2160x3840 50 Hz
- id=3, 1080x1920 60 Hz
- id=4, 1080x1920 50 Hz
Composer HAL, desteklenen modlar kümesinin değiştiğini bildirmek için çerçeveye bir
onHotplug
etkinliği gönderir.Composer HAL,
setActiveConfig(display, config=1)
değerini alır (2. adım).HAL, gerçekte 1080x1920 60 Hz istenmesine rağmen çerçevenin 2160x3840 60 Hz için yapılandırma değişikliği istediğini yorumlar.
Sıralı olmayan kimlik atamalarının kullanıldığı süreç, istenen yapılandırma değişikliğinin yanlış yorumlanmasıyla burada sona erer.
Composer HAL'ı sıralı kimlikleri kullanacak şekilde yapılandırma
Bu tür rekabet durumlarını önlemek için OEM, Composer HAL'yi aşağıdaki şekilde uygulamalıdır:
- Composer HAL, desteklenen ekran yapılandırmalarını güncellediğinde yeni ekran yapılandırmalarına yeni ve sıralı kimlikler atar.
- Çerçeve, geçersiz bir yapılandırma kimliğiyle
setActiveConfig
veyasetActiveConfigWithConstraints
işlevini çağırdığında Composer HAL, çağrıyı yoksayar.
Bu adımlar, aşağıdaki tartışmada gösterildiği gibi yarış durumlarını önlemeye yardımcı olur.
Yeni sıralı kimlikler yeni reklam yapılandırmalarına atandığında aşağıdaki etkinlik sırasını göz önünde bulundurun:
Desteklenen ekran yapılandırması kimlikleri şunlardır:
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
Çerçeve,
setActiveConfig(display, config=1)
işlevini çağırır.Görüntü yapılandırmalarında değişiklik işlendiğinde, bir sonraki kullanılmayan tam sayıdan başlayarak aşağıdaki gibi bir sonraki yapılandırma kimlikleri grubu atanır:
id=3, 2160x3840 60 Hz
id=4, 2160x3840 50 Hz
id=5, 1080x1920 60 Hz
id=6, 1080x1920 50 Hz
Composer HAL, desteklenen modlar kümesinin değiştiğini bildirmek için çerçeveye bir
onHotplug
etkinliği gönderir.Composer HAL,
setActiveConfig(display, config=1)
değerini alır (2. adım).ID artık geçerli olmadığından Composer HAL, aramayı yoksayar.
Çerçeve, 4. adımdaki
onHotplug
etkinliğini alır ve işler.getDisplayConfigs
vegetDisplayAttribute
işlevlerini kullanarak Composer HAL'i çağırır. Bu işlevlerle çerçeve, 1080x1920 çözünürlük ve 60 Hz yenileme hızı için istenen yeni kimliği (5) tanımlar.Çerçeve, güncellenmiş kimliği 5 olan başka bir
setActiveConfig
etkinliği gönderir.Composer HAL, 5. adımdan
setActiveConfig(display, config=5)
alır.HAL, çerçevenin 1080x1920 60 Hz'lik bir yapılandırma değişikliği istediğini doğru şekilde yorumlar.
Yukarıdaki örnekte gösterildiği gibi, sıralı kimlik atamalarını kullanan işlem, yarışma koşulunun önlenmesini ve doğru ekran yapılandırması değişikliğinin güncellenmesini sağlar.