Jetpack WindowManager kitaplığı, uygulama geliştiricilerin yeni cihaz form faktörlerini ve çok pencereli ortamları desteklemesini sağlar.
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 içinde uygulanır ve WindowManager özelliklerini destekleyen cihazlarda gönderilir.
Uzantı modülü dağıtımı
Uzantılar, cihaz makefile'ında etkinleştirilmişse .jar kitaplığında derlenir ve cihazdaki system_ext bölümüne yerleştirilir.
Bir cihazda uzantıları etkinleştirmek için ürün cihazı makefile'ına aşağıdakileri ekleyin:
$(call inherit-product, $(SRC_TARGET_DIR)/product/window_extensions.mk)
Bu işlem, cihazda androidx.window.extensions ve androidx.window.sidecar paketlerini etkinleştirir ve persist.wm.extensions.enabled özelliğini ayarlar.
Bu paketleri makefile'a dahil etmek, bildirimleri etc/permissions/ içine de yerleştirerek uygulama süreçlerinde kullanılabilir hale getirir. Normalde modüller, Jetpack WindowManager kitaplığı tarafından kullanıldığında çalışma zamanında uygulama sürecine yüklenir ve bu sürecin bir parçası olarak yürütülür. Bu da modüllerin çalışmasını aşağıdaki şekilde gösterildiği gibi istemci tarafı çerçeve koduna benzer hale getirir:
androidx.window.extensions modülü, şu anda etkin geliştirme aşamasında olan mevcut Uzantılar modülüdür. androidx.window.sidecar modülü, Jetpack WindowManager'ın en eski sürümleriyle uyumluluk için eklenmiş eski bir modüldür ancak artık aktif olarak desteklenmemektedir.
Aşağıdaki şekilde, androidx.window.extensions veya androidx.window.sidecar kullanımını belirleme mantığı gösterilmektedir.
androidx.window.extensions veya androidx.window.sidecar'e erişimle ilgili karar ağacı.
Uzantı modülleri
Uzantılar, katlanabilir büyük ekranlı cihazlar ve harici ekranlarda pencerelemeyi destekleyen cihazlar için pencereleme özellikleri sunar. Özellik alanları şunlardır:
Cihaz donanımı ilgili özellikleri desteklemiyorsa, özellik Uyumluluk Tanımı Belgesi'nde (CDD) 7.1.1.1 özellikle istenmediği sürece, OEM'ler Uzantılar'ı uygularken WindowExtensions arayüzündeki yöntemlerin varsayılan veya taslak uygulamalarını içeren ya da boş bileşenler sağlayabilir.
Uzantılar ve Jetpack API'leri
WindowManager Extensions modülü, herkese açık platform API'lerine ek olarak kendi API yüzeyini sağlar. Uzantılar modülü, Jetpack WindowManager'ın (androidx.window) derleme zamanında buna karşı bağlantı oluşturabilmesi için geliştiricilere yönelik olmayan bir androidx.window.extensions Jetpack kitaplığında herkese açık olarak geliştirilir. Uzantılar API yüzeyi genellikle daha düşük düzeyli API'ler sağlar.
Uzantıların sağladığı API'ler yalnızca Jetpack WindowManager kitaplığı tarafından kullanılmak üzere tasarlanmıştır. Uzantılar API'lerinin doğrudan uygulama geliştiriciler tarafından çağrılması amaçlanmamıştır. Doğru işlevsellik için, uzantılar kitaplığı Gradle derleme dosyasına uygulama bağımlılığı olarak eklenmemelidir. Uzantılar kitaplığını doğrudan bir uygulamaya önceden derlemekten kaçının. Bunun yerine, önceden derlenmiş ve çalışma zamanında sağlanan Uzantılar sınıflarının karışımının yüklenmesini önlemek için çalışma zamanı yüklemesini kullanın.
Jetpack WindowManager (androidx.window), uygulama bağımlılığı olarak eklenmek üzere tasarlanmıştır ve WindowManager Uzantıları özellikleri de dahil olmak üzere geliştiricilere yönelik herkese açık API'ler sağlar. WindowManager kitaplığı, uzantıları uygulama sürecine otomatik olarak yükler ve daha düşük düzeydeki Uzantılar API'lerini daha yüksek düzeydeki soyutlamalar ve daha odaklanmış arayüzlerle sarmalar. WindowManager Jetpack API'leri, modern Android uygulama geliştirme standartlarına uygundur ve diğer AndroidX kitaplıklarını kullanan kod tabanlarıyla iyi entegre olarak kolay birlikte çalışabilirlik sağlamayı amaçlar.
Uzantı sürümleri ve güncellemeleri
Uzantılar modülü, Android platformuyla birlikte yıllık veya üç aylık güncellemelerle güncellenebilir. Üç aylık güncellemeler, Android platform API güncellemeleri arasında Extensions API düzeyinin yükseltilmesini sağlar. Bu sayede daha hızlı yineleme yapılabilir ve OEM'lere, donanım lansmanlarına yakın bir zamanda yeni özelliklere resmi API erişimi ekleme fırsatı sunulur.
Aşağıdaki tabloda, çeşitli Android sürümleri için androidx.window.extensions API sürümleri listelenmiştir.
| Android platform sürümü | WindowManager Extensions API düzeyi | androidx.window.extensions API sürümü |
|---|---|---|
| Android 15 | 6 | 1.5.0 (çok yakında) |
| Android 14 QPR3 | 5 | 1.4.0 (yakında) |
| Android 14 QPR1 | 4 | 1.3.0 |
| Android 14 | 3 | 1.2.0 |
| Android 13 QPR3 | 2 | 1.1.0 |
| Android 13 | 1 | 1.0.0 |
| Android 12L | 1 | 1.0.0 |
Mevcut kararlı API yüzeyine (sağ sütun) her ekleme yapıldığında Uzantılar API düzeyi (orta sütun) artırılır.
Geriye ve ileriye dönük uyumluluk
Jetpack WindowManager, sık API seviyesi güncellemeleri, hızlı API gelişimi ve geriye dönük uyumlulukla ilgili karmaşıklığı ele alır. Kitaplık kodu uygulama sürecinde yürütüldüğünde kitaplık, bildirilen Extensions API düzeyini kontrol eder ve bildirilen düzeye göre özelliklere erişim sağlar.
WindowManager, bir uygulamanın çalışma zamanında kilitlenmesini önlemek için, bildirilen Extensions API düzeyine göre mevcut Extensions API'lerinin çalışma zamanında Java yansıtma kontrolünü de gerçekleştirir. Uyuşmazlık varsa WindowManager, uzantıların kullanımını (kısmen veya tamamen) devre dışı bırakabilir ve ilgili özellikleri uygulamada kullanılamaz olarak bildirebilir.
WindowManager Uzantıları, Uzantılar özelliklerinin uygulanmasında WindowManager çekirdeğini, DeviceStateManager ve diğer sistem hizmetlerini çağırmak için özel platform API'lerini kullanan bir system_ext modülü olarak uygulanır.
Uyumluluk, sürümlerin son hâlini aldığı ilgili üç aylık veya yıllık Android platform sürümünden önceki, uzantıların yayın öncesi sürümlerinde korunmayabilir. Extensions API'lerinin tam geçmişini window:extensions:extensions API metin dosyaları sürüm dalında bulabilirsiniz.
Uzantıların daha yeni sürümleri, ileriye dönük uyumluluğu korumak için uygulamalara derlenen WindowManager'ın eski sürümleriyle çalışmaya devam etmelidir. Bunu sağlamak için Extensions API'nin yeni sürümlerinde yalnızca yeni API'ler eklenir ve eski API'ler kaldırılmaz. Sonuç olarak, eski WindowManager sürümlerine sahip uygulamalar, derlendikleri eski Uzantılar API'lerini kullanmaya devam edebilir.
CTS doğrulaması, cihazdaki Extensions API'lerinin beyan edilen herhangi bir sürümü için bu ve önceki sürümlere ait tüm API'lerin mevcut ve işlevsel olmasını sağlar.
Performans
Uzantılar modülü, Android 14'ten (API düzeyi 34) itibaren varsayılan olarak önyükleme sınıf yolu olmayan sistem sınıfı yükleyicilerinde önbelleğe alınır. Bu nedenle, modülün uygulama başlatılırken belleğe yüklenmesi performans üzerinde herhangi bir etki yaratmaz. Ayrı modül özelliklerinin kullanılması, istemci ile sunucu arasında ek IPC çağrıları yapıldığında uygulamaların performans özellikleri üzerinde hafif bir etkiye sahip olabilir.
Modüller
Etkinlik yerleştirme
activity embedding bileşeni, uygulamaların kullanıcı arayüzlerini büyük ekranlı cihazlar ve harici ekranlar için optimize etmesini sağlar. Etkinlik yerleştirme, çok panelli bir düzende iki etkinliğin yan yana sunulmasını sağlayarak eski uygulamalar için uyarlanabilir uygulama geliştirmeyi kolaylaştırır.
Etkinlik yerleştirme bileşeni, yerleşik ekranı sw600dp veya daha büyük olan tüm cihazlarda kullanılabilir olmalıdır. Harici ekran bağlantılarını destekleyen cihazlarda etkinlik yerleştirme de etkinleştirilmelidir. Aksi takdirde, harici ekranlar çalışma zamanında bağlandığında uygulama daha büyük bir boyutta gösterilebilir.
Cihaz yapılandırması
Uzantılar modülü dağıtımı bölümünde açıklandığı gibi Uzantılar modülünü etkinleştirmenin 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ümlerinde, yaygın kullanılan elde taşınabilir cihaz ve büyük ekranlı cihaz yapılandırmalarında Uzantılar'ın zorunlu olması muhtemeldir.
Pencere düzeni bilgileri
Pencere düzeni bilgileri bileşeni, katlanabilir bir cihazda menteşe bir uygulama penceresini geçtiğinde menteşenin konumunu ve durumunu tanımlar. Pencere düzeni bilgileri, uygulamaların katlanabilir cihazlarda masaüstü modunda optimize edilmiş düzenlere yanıt vermesini ve bunları göstermesini sağlar. Kullanımla ilgili ayrıntılar için Uygulamanızı katlanabilir cihazlara uygun hale getirme başlıklı makaleye bakın.
Ayrı veya sürekli ekran paneli alanlarını bağlayan bir menteşe içeren katlanabilir Android cihazlar, menteşe hakkındaki bilgileri WindowLayoutComponent aracılığıyla uygulamalara sunmalıdır.
Menteşe konumu ve sınırları, API'ye iletilen bir Context ile tanımlanan uygulama penceresine göre bildirilmelidir. Uygulama penceresi sınırları, menteşe sınırlarıyla kesişmiyorsa menteşe DisplayFeature raporlanmamalıdır. Ayrıca, konumları güvenilir bir şekilde bildirilmeyebileceği durumlarda (ör. uygulama penceresi, çoklu pencere modunda veya uyumluluk için mektup kutusu modunda kullanıcı tarafından serbestçe taşınabildiğinde) görüntüleme özelliklerinin bildirilmemesi de kabul edilebilir.
Katlanabilir
özellikler için menteşe konumu sabit durumlar arasında değiştiğinde durum güncellemeleri bildirilmelidir. API, varsayılan olarak düz bir görüntüleme durumunda FoldingFeature.State.FLAT değerini bildirmelidir.
Cihaz donanımı, yarı katlanmış modda sabit bir durumda bırakılabiliyorsa API, FoldingFeature.State.HALF_OPENED değerini bildirmelidir.
Uygulama penceresi bu durumda görünür olmayacağı veya menteşe sınırlarını aşmayacağı için API'de kapalı durum yoktur.
Cihaz yapılandırması
Katlama özelliği uygulamasını desteklemek için OEM'lerin aşağıdakileri yapması gerekir:
device_state_configuration.xmlbölümünde cihaz durumlarınıDeviceStateManagerServicetarafından kullanılacak şekilde yapılandırın. Referans içinDeviceStateProviderImpl.javasayfasına bakın.DeviceStateProviderveyaDeviceStatePolicyvarsayılan uygulamaları cihaz için uygun değilse özel bir uygulama kullanılabilir.Uzantılar modülü dağıtımı bölümünde açıklandığı şekilde Uzantılar modülünü etkinleştirin.
Görüntüleme özelliklerinin konumunu
com.android.internal.R.string.config_display_featuresdize kaynağında (genellikle cihaz yer paylaşımındaframeworks/base/core/res/res/values/config.xmliçinde) belirtin.Dize için beklenen biçim:
<type>-[<left>,<top>,<right>,<bottom>]type,foldveyahingeolabilir.left,top,rightvebottomdeğerleri, doğal ekran yönündeki ekran koordinat alanında bulunan tam sayı piksel koordinatlarıdır. Yapılandırma dizesi, noktalı virgülle ayrılmış birden fazla 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>DeviceStateManageriçinde kullanılan dahili cihaz durumu tanımlayıcıları ilecom.android.internal.R.array.config_device_state_posturesiçinde geliştiricilere gönderilen herkese açık durum sabitleri arasındaki eşlemeyi tanımlayın.Her giriş için beklenen biçim şudur:
<device_specific_state_identifier>:<Jetpack WindowManager state identifier>Desteklenen eyalet tanımlayıcıları şunlardır:
COMMON_STATE_NO_FOLDING_FEATURES = 1: Eyalette raporlanacak katlama özellikleri yok. Örneğin, ana ekranı iç tarafta olan, katlanabilen tipik bir cihazın kapalı durumu olabilir.COMMON_STATE_HALF_OPENED = 2: Katlama özelliği yarıya kadar açılmış.COMMON_STATE_FLAT = 3: Katlama özelliği düzdür. Örneğin, ana ekranı iç tarafta olan, katlanabilen tipik bir cihazın açık durumu olabilir.COMMON_STATE_USE_BASE_STATE = 1000: Android 14'te, menteşe durumununCommonFoldingFeature.javaiçinde tanımlandığı şekilde temel durum kullanılarak türetildiği, emüle edilmiş durumlar için kullanılabilen bir değer.
Daha fazla bilgi için
DeviceStateManager.DeviceStateCallback#onBaseStateChanged(int)sayfasına 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, uygulamalara bazı katlanabilir ve çok ekranlı cihazlarda ek ekranlara ve ekran alanlarına erişim sağlayan bir dizi özellik sunar.
Arka ekran modu, bir uygulamanın katlanabilir cihazın kapak ekranında kamera önizleme kullanıcı arayüzünü göstermesini sağlar. Böylece, ana cihazın kamerasıyla selfie ve video çekilebilir. Android ile uyumlu (boyut, yoğunluk ve mevcut gezinme olanakları gibi özellikler açısından Android CDD'de tanımlandığı şekilde) ve arka cihaz kameralarıyla uyumlu bir kapak ekranı olan cihazlar, arka ekran moduna erişim sağlamalıdır.
Android 14'te çift ekran modu, katlanabilir cihazların iç ekranında çalışan uygulamaların diğer kullanıcılara bakan kapak ekranında ek içerik göstermesini sağlar. Örneğin, kapak ekranında fotoğrafı çekilen veya kaydı alınan kişiye kamera önizlemesi gösterilebilir.
Cihaz yapılandırması
Katlama özelliği uygulamasını desteklemek için OEM'lerin aşağıdakileri yapması gerekir:
device_state_configuration.xmlbölümünde cihaz durumlarınıDeviceStateManagerServicetarafından kullanılacak şekilde yapılandırın. Daha fazla bilgi içinDeviceStateProviderImpl.javasayfasını inceleyin.DeviceStateProviderveyaDeviceStatePolicyiçin varsayılan uygulama cihaza uygun değilse özel bir uygulama kullanılabilir.Açık veya düz modu destekleyen katlanabilir cihazlar için
com.android.internal.R.array.config_openDeviceStatesiçinde ilgili durum tanımlayıcılarını belirtin.Katlanmış durumları destekleyen içe katlanan cihazlar için ilgili durum tanımlayıcılarını
com.android.internal.R.array.config_foldedDeviceStatesbölümünde listeleyin.Yarı katlanmış durumu destekleyen (menteşe, dizüstü bilgisayar gibi yarı açık) içe katlanan cihazlar için ilgili durumları
com.android.internal.R.array.config_halfFoldedDeviceStateslistesinde belirtin.Arka ekran modunu destekleyen cihazlar için:
DeviceStateManageriçincom.android.internal.R.array.config_rearDisplayDeviceStatesiçinde ilgili eyaletleri listeleyin.- Arka ekranın fiziksel ekran adresini
com.android.internal.R.string.config_rearDisplayPhysicalAddressiçinde belirtin. - Uzantılar tarafından kullanılacak
com.android.internal.R.integer.config_deviceStateRearDisplayeyalet tanımlayıcısını belirtin. - Uygulamalarda kullanılabilmesi için durum tanımlayıcısını
com.android.internal.R.array.config_deviceStatesAvailableForAppRequestsekleyin.
Android 14'te, çift (eşzamanlı) ekran modunu destekleyen cihazlarda:
com.android.internal.R.bool.config_supportsConcurrentInternalDisplaysdeğerinitrueolarak ayarlayın.- Arka ekranın fiziksel ekran adresini
com.android.internal.R.config_deviceStateConcurrentRearDisplayiçinde belirtin. - Tanımlayıcının uygulamalarda kullanılmak üzere sunulması amaçlanıyorsa
com.android.internal.R.integer.config_deviceStateConcurrentRearDisplayuzantılar tarafından kullanılacak eyalet tanımlayıcısını belirtin. - Uygulamalarda kullanılabilmesi için durum tanımlayıcısını
com.android.internal.R.array.config_deviceStatesAvailableForAppRequestsekleyin.
Doğrulama
OEM'ler, yaygın senaryolarda beklenen davranışın gerçekleşmesini sağlamak için uygulamalarını doğrulamalıdır. CTS testleri ve Jetpack WindowManager kullanılarak yapılan testler, uygulamaları test etmek için OEM'lere sunulur.
CTS testleri
CTS testlerini çalıştırmak için CTS testlerini çalıştırma başlıklı makaleyi inceleyin. Jetpack WindowManager ile ilgili CTS testleri cts/tests/framework/base/windowmanager/jetpack/ altında yer alır.
Test modülünün adı CtsWindowManagerJetpackTestCases.
WindowManager testleri
Jetpack WindowManager testlerini indirmek için Android Jetpack
talimatlarını uygulayın.
Testler, window:window modülündeki pencere kitaplığında bulunur:
window/window/src/androidTest/.
window:window modülü için cihaz testlerini komut satırından çalıştırmak üzere aşağıdakileri yapın:
- Geliştirici seçenekleri ve USB üzerinden hata ayıklama etkin olan bir cihazı takın.
- Bilgisayarın cihazda hata ayıklamasına izin verin.
- androidx deposunun kök dizininde bir kabuk açın.
- Dizini
framework/supportolarak değiştirin. - Aşağıdaki komutu çalıştırın:
./gradlew window:window:connectedAndroidTest. - Sonuçları analiz edin.
Testleri Android Studio'dan çalıştırmak için aşağıdakileri yapın:
- Android Studio'yu açın.
- Geliştirici seçenekleri ve USB üzerinden hata ayıklama etkin olan bir cihazı takın.
- Bilgisayarın cihazda hata ayıklamasına izin verin.
- Pencere modülünün pencere kitaplığında bir teste gidin.
- 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öntemi, test sınıfı 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 çıkışı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.