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, çalışırken takma 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 çerçeve arabelleğinin nasıl yönetileceği ve bu durumlarda yarış koşullarının nasıl önleneceği de ele alınmaktadır.
Görüntüleme ö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 şekilde ele alır:
- Çerçeve, ekran özelliklerinde bir değişiklik algıladığında
onHotplug(display, connection=CONNECTED)bildirimi alır. - Bildirim alındığında çerçeve, görüntüleme durumunu bırakır ve
getActiveConfig,getDisplayConfigs,getDisplayAttribute,getColorModes,getHdrCapabilitiesvegetDisplayCapabilitiesyö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
onDisplayChangedgeri arama işlevini gönderir.
Çerçeve, sonraki onHotplug(display, connection=CONNECTED) etkinliklerinde çerçeve arabelleklerini yeniden ayırır. Yeni çerçeve arabellekleri ayrılırken 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ı yönetme
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ğlı 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 donanım anahtarı, 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 donanım anahtarı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 dışı bağlantı hala bağlıyken HDMI bağlantısı kesilirse SurfaceFlinger'a bir etkinlik gönderilir ve HDMI dışı ekranın özellikleri getDisplayAttribute ve diğer IComposerClient API'leri (ör. getHdrCapabilities) aracılığıyla yansıtılmalıdır.
Yarış koşullarını önlemek için sıralı yapılandırma kimlikleri kullanma
Composer HAL, desteklenen ekran yapılandırmalarını setActiveConfig veya setActiveConfigWithConstraints çerçeve çağrısıyla eşzamanlı olarak güncellerse yarış durumu oluşabilir. Bu sorunu önlemek için Composer
HAL'ı uygulayarak sıralı kimlikler kullanabilirsiniz.
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 gösterim yapılandırmalarına yeni ve sıralı kimlikler ATANMADIĞINDA yarış durumu oluşmasına neden olan aşağıdaki etkinlik sırasını göz önünde bulundurun:
Desteklenen görüntülü reklam yapılandırma 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
onHotplugetkinliği gönderir.Composer HAL,
setActiveConfig(display, config=1)(2. adımdan) değerini alır.HAL, gerçekte 1080x1920 60 Hz seçilmiş olmasına 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ç, seçilen yapılandırma değişikliğinin yanlış yorumlanmasıyla burada sona erer.
Composer HAL'yi 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
setActiveConfigveyasetActiveConfigWithConstraintsyöntemini çağırdığında Composer HAL, çağrıyı yoksayar.
Bu adımlar, aşağıdaki tartışmada gösterildiği gibi yarış koşullarını önlemeye yardımcı olur.
Yeni sıralı kimlikler yeni görüntülü reklam yapılandırmalarına atandığında aşağıdaki etkinlik sırasını göz önünde bulundurun:
Desteklenen görüntülü reklam yapılandırma 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 bir değişiklik işlendiğinde, bir sonraki kullanılmayan tam sayıdan başlayarak bir sonraki yapılandırma kimlikleri grubu atanır. Bu durum aşağıdaki gibi gösterilir:
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
onHotplugetkinliği gönderir.Composer HAL,
setActiveConfig(display, config=1)(2. adımdan) değerini alır.Composer HAL, kimlik artık geçerli olmadığından aramayı yoksayar.
Çerçeve, 4. adımdaki
onHotplugetkinliğini alır ve işler.getDisplayConfigsvegetDisplayAttributeiş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 yeni kimliği (5) tanımlar.Çerçeve, güncellenmiş kimliği 5 olan başka bir
setActiveConfigetkinliğ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.
Önceki örnekte gösterildiği gibi, sıralı kimlik atamalarını kullanan işlem, yarış koşulunun önlendiğini ve doğru ekran yapılandırması değişikliğinin güncellendiğini doğrular.