Pencere Yöneticisi Uzantıları

Jetpack WindowManager kitaplığı, uygulama geliştiricilerin yeni aygıt form faktörlerini ve çoklu pencere ortamlarını desteklemesine olanak tanır.

WindowManager Uzantıları (Uzantılar), çeşitli Jetpack WindowManager özelliklerini etkinleştiren isteğe bağlı bir Android platform modülüdür. Modül, AOSP'de frameworks/base/libs/WindowManager/Jetpack uygulanır ve WindowManager özelliklerini destekleyen cihazlara gönderilir.

Uzantı modülü dağıtımı

Uzantılar bir .jar kitaplığında derlenir ve aygıtın makefile dosyasında Uzantılar etkinleştirilmişse aygıtın system_ext bölümüne yerleştirilir.

Bir cihazda Uzantıları etkinleştirmek için ürün cihazının makefile dosyasına aşağıdakini ekleyin:

$(call inherit-product, $(SRC_TARGET_DIR)/product/window_extensions.mk)

Bu, cihazdaki androidx.window.extensions ve androidx.window.sidecar paketlerini etkinleştirir ve persist.wm.extensions.enabled özelliğini ayarlar. Bu paketlerin makefile'a dahil edilmesi aynı zamanda etc/permissions/ dosyasına da bildirimler yerleştirir ve bunları uygulama süreçlerinde kullanılabilir hale getirir. Normalde modüller, aşağıdaki şekilde gösterildiği gibi çalışmasını istemci tarafı çerçeve koduna benzer hale getiren Jetpack WindowManager kitaplığı tarafından kullanıldığında çalışma zamanında uygulama sürecinin bir parçası olarak yüklenir ve yürütülür:

Şekil 1. Platform koduna benzer şekilde uygulama sürecine yüklenen WindowManager Uzantıları.

androidx.window.extensions modülü, aktif olarak geliştirilmekte olan mevcut Uzantılar modülüdür. androidx.window.sidecar modülü, Jetpack WindowManager'ın en eski sürümleriyle uyumluluk sağlamak amacıyla dahil edilen eski bir modüldür, ancak sepet artık aktif olarak korunmamaktadır.

Aşağıdaki şekil androidx.window.extensions veya androidx.window.sidecar kullanımını belirleme mantığını göstermektedir.

Şekil 2. androidx.window.extensions veya androidx.window.sidecar erişim için karar ağacı.

Uzantı modülleri

Uzantılar, katlanabilir büyük ekranlı cihazlar ve harici ekranlarda pencerelemeyi destekleyen cihazlar için pencereleme özellikleri sağlar. Özellik alanları şunları içerir:

Uzantıların OEM uygulamaları, eğer özellik Uyumluluk Tanımlama Belgesi (CDD) 7.1.1.1'de özel olarak talep edilmedikçe, cihaz donanımı ilgili özellikleri desteklemiyorsa, WindowExtensions arayüzündeki yöntemlerin varsayılan veya saplama uygulamalarını içeren boş bileşenler veya bileşenler sağlayabilir. .

Uzantılar ve Jetpack API'leri

WindowManager Extensions modülü, genel platform API'lerine ek olarak kendi API yüzeyini sağlar. Uzantılar modülü, geliştiricilerin kullanımına açık olmayan bir androidx.window.extensions Jetpack kitaplığında genel olarak geliştirilmiştir, böylece Jetpack WindowManager ( androidx.window ) derleme zamanında ona bağlantı kurabilir. Uzantılar API'si yüzeyi genellikle daha düşük düzeyli API'ler sağlar.

Uzantıların sağladığı API'lerin yalnızca Jetpack WindowManager kitaplığı tarafından kullanılması amaçlanmıştır. Uzantı API'lerinin doğrudan uygulama geliştiricileri tarafından çağrılması amaçlanmamıştır. Doğru işlevselliği sağlamak için Extensions kütüphanesinin Gradle derleme dosyasındaki bir uygulamaya bağımlılık olarak eklenmemesi gerekir. Uzantılar kitaplığını doğrudan bir uygulamaya önceden derlemekten kaçının; bunun yerine, önceden derlenmiş ve çalışma zamanı tarafından sağlanan Uzantılar sınıflarının bir karışımının yüklenmesini önlemek için çalışma zamanı yüklemesine güvenin.

Jetpack WindowManager ( androidx.window ) bir uygulama bağımlılığı olarak eklenmek üzere tasarlanmıştır ve WindowManager Uzantıları özelliklerine yönelik olanlar da dahil olmak üzere geliştiricilere yönelik herkese açık API'ler sağlar. WindowManager kitaplığı, Uzantıları otomatik olarak uygulama sürecine yükler ve alt düzey Uzantı API'lerini daha yüksek düzey soyutlamalara ve daha odaklanmış arabirimlere sarar. WindowManager Jetpack API'leri, modern Android uygulama geliştirme standartlarını takip eder ve diğer AndroidX kitaplıklarını kullanan kod tabanlarıyla iyi bir şekilde bütünleşerek uygun birlikte çalışabilirlik sağlamayı amaçlamaktadır.

Uzantı sürümleri ve güncellemeleri

Uzantılar modülü, Android platformunun yıllık veya üç aylık güncellemeleriyle birlikte güncellenebilir. Üç ayda bir yapılan güncellemeler, Uzantılar API seviyesinin Android platformu API güncellemeleri arasında artırılmasına olanak tanıyarak daha hızlı yineleme sağlar ve OEM'lere, donanım lansmanlarına yakın yeni özelliklere resmi API erişimi ekleme fırsatı sunar.

Aşağıdaki tabloda çeşitli Android sürümleri için androidx.window.extensions API sürümleri listelenmektedir.

Android platformu sürümü WindowManager Uzantıları API düzeyi androidx.window.extensions API sürümü
Android14 3 1.2.0
Android 13 QPR3 2 1.1.0
Android 13 1 1.0.0
Android12L 1 1.0.0

Uzantılar API düzeyi (orta sütun), mevcut kararlı API yüzeyine (sağ sütun) her ekleme yapıldığında artırılır.

Geriye ve ileriye uyumluluk

Jetpack WindowManager, sık API düzeyi güncellemeleri, hızlı API gelişimi ve geriye dönük uyumlulukla uğraşmanın karmaşıklığını yönetir. Kitaplık kodu uygulama sürecinde çalıştırıldığında, kitaplık bildirilen Extensions API düzeyini kontrol eder ve belirtilen düzeye göre özelliklere erişim sağlar.

Bir uygulamanın çalışma zamanında çökmesini önlemek için WindowManager ayrıca belirtilen Uzantılar API düzeyine göre mevcut Uzantılar API'lerinin çalışma zamanı Java yansıma kontrolünü de gerçekleştirir. Bir uyumsuzluk olması durumunda WindowManager, Uzantıların kullanımını (kısmen veya tamamen) devre dışı bırakabilir ve ilgili özelliklerin uygulamada mevcut olmadığını bildirebilir.

WindowManager Uzantıları, Uzantılar özelliklerinin uygulanmasında WindowManager çekirdeğine, DeviceStateManager ve diğer sistem hizmetlerine çağrı yapmak için özel platform API'lerini kullanan bir system_ext modülü olarak uygulanır.

Uzantıların yayın öncesi sürümleriyle uyumluluk, sürümlerin tamamlandığı ilgili üç aylık veya yıllık Android platformu sürümünden önce sürdürülemeyebilir. Uzantı API'lerinin tam geçmişi, sürüm dalı window:extensions:extensions API metin dosyalarında bulunabilir.

Uzantıların daha yeni sürümleri, ileriye yönelik uyumluluğu sürdürmek için uygulamalarda derlenen WindowManager'ın eski sürümleriyle çalışmaya devam etmelidir. Bunu sağlamak için, Extensions API'nin tüm yeni sürümleri yalnızca yeni API'ler ekler ve eskilerini kaldırmaz. Sonuç olarak, eski WindowManager sürümlerine sahip uygulamalar, uygulamaların derlendiği eski Uzantı API'lerini kullanmaya devam edebilir.

CTS doğrulaması, cihazdaki Uzantı API'lerinin beyan edilen herhangi bir sürümü için, o sürüme ve önceki sürümlere ait tüm API'lerin mevcut ve işlevsel olmasını sağlar.

Verim

Uzantılar modülü, Android 14'ten (API düzeyi 34) başlayarak varsayılan olarak bootclasspath olmayan sistem sınıfı yükleyicilerde önbelleğe alınır; bu nedenle, uygulama başlatılırken modülün belleğe yüklenmesi nedeniyle performansta herhangi bir etki yaşanmaz. İstemci ile sunucu arasında ek IPC çağrıları gerçekleştirildiğinde, bireysel modül özelliklerinin kullanılması, uygulamaların performans özellikleri üzerinde hafif bir etkiye sahip olabilir.

Modüller

Etkinlik yerleştirme

Etkinlik yerleştirme bileşeni, uygulamaların ana uygulamanın sınırları dahilinde etkinlik penceresi sunumunu düzenlemesine olanak tanıyan bir dizi özellik sağlar. Bu, eski uygulamalar için geniş ekran optimizasyonunu kolaylaştıran, çok bölmeli bir düzende iki etkinliğin eş zamanlı olarak yan yana gösterilmesini içerir.

Etkinlik yerleştirme bileşeni, sw600 dp eşit veya daha büyük boyutta yerleşik ekrana sahip tüm cihazlarda mevcut olmalıdır. Çalışma zamanında harici ekranlar bağlandığında uygulama daha büyük boyutta gösterilebileceğinden, harici ekran bağlantılarını destekleyen cihazlarda etkinlik yerleştirmenin de etkinleştirilmesi gerekir.

Cihaz konfigürasyonu

Uzantılar modülü dağıtımı bölümünde açıklandığı gibi Uzantılar modülünü etkinleştirmek dışında özel bir cihaz yapılandırması gerekmez. Çoklu pencere modunu destekleyen tüm cihazlarda Uzantıları etkinleştirmek mantıklıdır. Gelecekteki Android sürümlerinin, yaygın olarak kullanılan el tipi ve büyük ekranlı cihaz yapılandırmalarında Uzantıları zorunlu hale getirmesi muhtemeldir.

Pencere düzeni bilgileri

Pencere yerleşim bilgisi bileşeni, menteşe bir uygulama penceresini geçtiğinde katlanabilir bir cihaz üzerindeki menteşenin konumunu ve durumunu tanımlar. Pencere düzeni bilgileri, uygulamaların katlanabilir cihazlarda masaüstü modunda optimize edilmiş düzenlere yanıt vermesine ve bunları göstermesine olanak tanır. Kullanım ayrıntıları için Uygulamanızın katlanmasını fark etme konusuna bakın.

Ayrı veya sürekli ekran paneli alanlarını birbirine bağlayan bir menteşe içeren katlanabilir Android aygıtlarının, menteşe hakkındaki bilgileri WindowLayoutComponent aracılığıyla uygulamaların kullanımına sunması gerekir.

Menteşe konumu ve sınırları, API'ye iletilen Context tarafından tanımlanan uygulama penceresine göre raporlanmalıdır. Uygulama penceresi sınırları menteşe sınırlarıyla kesişmiyorsa menteşe DisplayFeature raporlanmaması gerekir. Ayrıca, bir uygulama penceresinin çoklu pencere modunda veya uyumluluk posta kutusu modunda kullanıcı tarafından serbestçe hareket ettirilebildiği durumlar gibi, konumlarının güvenilir bir şekilde raporlanmayabileceği durumlarda ekran özelliklerinin raporlanmaması da kabul edilebilir.

Katlama özellikleri için, menteşe konumu kararlı durumlar arasında değiştiğinde durum güncellemelerinin raporlanması gerekir. Varsayılan olarak düz görüntü durumunda API'nin FoldingFeature.State.FLAT rapor etmesi gerekir. Cihaz donanımı kararlı bir durumda yarı katlanmış modda bırakılabiliyorsa API'nin FoldingFeature.State.HALF_OPENED raporunu vermesi gerekir. API'de kapalı durum yoktur, çünkü böyle bir durumda uygulama penceresi ya görünmez ya da menteşe sınırlarını aşmaz.

Cihaz konfigürasyonu

Katlama özelliğinin uygulanmasını desteklemek için OEM'lerin aşağıdakileri yapması gerekir:

  • DeviceStateManagerService tarafından kullanılacak device_state_configuration.xml dosyasındaki cihaz durumlarını yapılandırın. Referans için DeviceStateProviderImpl.java bakın.

    DeviceStateProvider veya DeviceStatePolicy varsayılan uygulamaları cihaz için uygun değilse özel bir uygulama kullanılabilir.

  • Uzantılar modülünü Uzantılar modülü dağıtımı bölümünde açıklandığı şekilde etkinleştirin.

  • com.android.internal.R.string.config_display_features dize kaynağında görüntüleme özelliklerinin konumunu belirtin (genellikle cihaz katmanındaki frameworks/base/core/res/res/values/config.xml dosyasında).

    Dize için beklenen biçim şöyledir:

    <type>-[<left>,<top>,<right>,<bottom>]

    type fold veya hinge olabilir. left , top , right ve bottom değerleri, doğal görüntü yönlendirmesindeki ekran koordinat alanındaki tamsayı piksel koordinatlarıdır. Yapılandırma dizesi, noktalı virgülle ayrılmış birden çok görüntüleme özelliği içerebilir.

    Örneğin:

    <!-- Jetpack WindowManager display features -->
    <string name="config_display_features" translatable="false">fold-[1000,0,1000,2000]</string>
    
  • DeviceStateManager kullanılan dahili cihaz durumu tanımlayıcıları ile com.android.internal.R.array.config_device_state_postures içindeki geliştiricilere gönderilen genel durum sabitleri arasındaki eşlemeyi tanımlayın.

    Her giriş için beklenen format şöyledir:

    <device_specific_state_identifier>:<Jetpack WindowManager state identifier>

    Desteklenen durum tanımlayıcıları şunlardır:

    • COMMON_STATE_NO_FOLDING_FEATURES = 1 : Durumun raporlanacak katlama özelliği yok. Örneğin, ana ekranın iç tarafta olduğu tipik içe katlama cihazının kapalı durumu olabilir.
    • COMMON_STATE_HALF_OPENED = 2 : Katlama özelliği yarı açıktır.
    • COMMON_STATE_FLAT = 3 : Katlama özelliği düzdür. Örneğin, ana ekranın iç tarafta olduğu tipik içe katlama cihazının açık durumu olabilir.
    • COMMON_STATE_USE_BASE_STATE = 1000 : Android 14'te, CommonFoldingFeature.java tanımlandığı gibi, menteşe durumunun temel durum kullanılarak türetildiği öykünülmüş durumlar için kullanılabilen bir değer.

    Daha fazla bilgi için DeviceStateManager.DeviceStateCallback#onBaseStateChanged(int) bakın.

    Örneğin:

    <!-- Map of System DeviceState supplied by DeviceStateManager to WindowManager posture.-->
    <string-array name="config_device_state_postures" translatable="false">
        <item>0:1</item>    <!-- CLOSED       : COMMON_STATE_NO_FOLDING_FEATURES -->
        <item>1:2</item>    <!-- HALF_OPENED  : COMMON_STATE_HALF_OPENED -->
        <item>2:3</item>    <!-- OPENED       : COMMON_STATE_FLAT -->
        <item>3:1</item>    <!-- REAR_DISPLAY : COMMON_STATE_NO_FOLDING_FEATURES -->
        <item>4:1000</item> <!-- CONCURRENT   : COMMON_STATE_USE_BASE_STATE -->
    </string-array>
    

Pencere alanı

Pencere alanı bileşeni, uygulamaların bazı katlanabilir ve çoklu ekran aygıtlarındaki ek ekranlara ve görüntüleme alanlarına erişmesini sağlayan bir dizi özellik sağlar.

Arka ekran modu, bir uygulamanın, selfie'ler ve videolar için ana cihaz kamerasının kullanılmasına izin vermek üzere katlanabilir bir cihazın kapak ekranında kamera önizleme kullanıcı arayüzünü göstermesini sağlar. Arka cihaz kameralarıyla hizalanan Android uyumlu (Android CDD tarafından boyut, yoğunluk ve mevcut navigasyon olanakları gibi nitelikler açısından tanımlandığı şekilde) kapak ekranına sahip cihazlar, arka ekran moduna erişim sağlamalıdır.

Android 14'te çift ekran modu, katlanabilir bir cihazın iç ekranında çalışan uygulamaların kapak ekranında diğer kullanıcılara yönelik ek içerik göstermesine olanak tanır; örneğin kapak ekranı, fotoğrafı çekilen veya kaydedilen kişiye kamera ön izlemesini gösterebilir.

Cihaz konfigürasyonu

Katlama özelliğinin uygulanmasını desteklemek için OEM'lerin aşağıdakileri yapması gerekir:

  • DeviceStateManagerService tarafından kullanılacak device_state_configuration.xml dosyasındaki cihaz durumlarını yapılandırın. Daha fazla bilgi için DeviceStateProviderImpl.java bakın.

    DeviceStateProvider veya DeviceStatePolicy varsayılan uygulaması cihaz için uygun değilse özel bir uygulama kullanılabilir.

  • Açık veya düz modu destekleyen katlanabilir cihazlar için ilgili durum tanımlayıcılarını com.android.internal.R.array.config_openDeviceStates içinde belirtin.

  • Katlanmış durumları destekleyen içe katlama cihazları için ilgili durum tanımlayıcılarını com.android.internal.R.array.config_foldedDeviceStates içinde listeleyin.

  • Yarı katlanmış durumu destekleyen içe katlanan cihazlar için (menteşe bir dizüstü bilgisayar gibi yarı açıktır), ilgili durumları com.android.internal.R.array.config_halfFoldedDeviceStates içinde listeleyin.

  • Arka ekran modunu destekleyen cihazlar için:

    • İlgili durumları com.android.internal.R.array.config_rearDisplayDeviceStates for DeviceStateManager listeleyin.
    • com.android.internal.R.string.config_rearDisplayPhysicalAddress öğesinde arka ekranın fiziksel görüntü adresini belirtin.
    • com.android.internal.R.integer.config_deviceStateRearDisplay Uzantılar tarafından kullanılacak durum tanımlayıcısını belirtin.
    • Uygulamaların kullanımına sunmak için com.android.internal.R.array.config_deviceStatesAvailableForAppRequests dosyasına durum tanımlayıcısını ekleyin.
  • Android 14'te çift (eşzamanlı) ekran modunu destekleyen cihazlar için:

    • com.android.internal.R.bool.config_supportsConcurrentInternalDisplays değerini true olarak ayarlayın.
    • com.android.internal.R.config_deviceStateConcurrentRearDisplay öğesinde arka ekranın fiziksel ekran adresini belirtin.
    • Tanımlayıcının uygulamalar için kullanılabilir hale getirilmesi gerekiyorsa Uzantılar tarafından kullanılacak durum tanımlayıcısını com.android.internal.R.integer.config_deviceStateConcurrentRearDisplay belirtin.
    • Uygulamaların kullanımına sunmak için com.android.internal.R.array.config_deviceStatesAvailableForAppRequests dosyasına durum tanımlayıcısını ekleyin.

Doğrulama

OEM'ler, ortak senaryolarda beklenen davranışı sağlamak için uygulamalarını doğrulamalıdır. Jetpack WindowManager'ı kullanan CTS testleri ve testleri, uygulamaları test etmek için OEM'lerin kullanımına açıktır.

CTS testleri

CTS testlerini çalıştırmak için bkz. CTS testlerini çalıştırma . Jetpack WindowManager ile ilgili CTS testleri cts/tests/framework/base/windowmanager/jetpack/ altındadır. Test modülünün adı CtsWindowManagerJetpackTestCases .

WindowManager testleri

Jetpack WindowManager testlerini indirmek için Android Jetpack Talimatlarını izleyin. Testler window:window modülü: window/window/src/androidTest/ altındaki pencere kitaplığında bulunur.

window:window modülüne yönelik aygıt testlerini komut satırından çalıştırmak için aşağıdakileri yapın:

  1. Geliştirici seçeneklerine ve USB hata ayıklamanın etkin olduğu bir cihazı takın.
  2. Bilgisayarın aygıtta hata ayıklamasına izin verin.
  3. Androidx deposunun kök dizininde bir kabuk açın.
  4. Dizini framework/support olarak değiştirin.
  5. Şu komutu çalıştırın: ./gradlew window:window:connectedAndroidTest .
  6. Sonuçları analiz edin.

Testleri Android Studio'dan çalıştırmak için aşağıdakileri yapın:

  1. Android Studio'yu açın.
  2. Geliştirici seçeneklerine ve USB hata ayıklamanın etkin olduğu bir cihazı takın.
  3. Bilgisayarın aygıtta hata ayıklamasına izin verin.
  4. Pencere modülünün pencere kitaplığındaki bir teste gidin.
  5. Bir test sınıfı açın ve düzenleyicinin sağ tarafındaki yeşil okları kullanarak çalıştırın.

Alternatif olarak, bir test yöntemini, test sınıfını veya bir modüldeki tüm testleri çalıştırmak için Android Studio'da bir yapılandırma oluşturabilirsiniz.

Sonuçlar, kabuğun çıktısına bakılarak manuel olarak analiz edilebilir. Cihaz belirli varsayımları karşılamıyorsa bazı testler atlanır. Sonuçlar standart bir konuma kaydedilir ve analistler, sonuçların analizini otomatikleştirmek için bir komut dosyası yazabilir.