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:
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.
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ılacakdevice_state_configuration.xml
dosyasındaki cihaz durumlarını yapılandırın. Referans içinDeviceStateProviderImpl.java
bakın.DeviceStateProvider
veyaDeviceStatePolicy
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ındakiframeworks/base/core/res/res/values/config.xml
dosyasında).Dize için beklenen biçim şöyledir:
<type>-[<left>,<top>,<right>,<bottom>]
type
fold
veyahinge
olabilir.left
,top
,right
vebottom
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ı ilecom.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ılacakdevice_state_configuration.xml
dosyasındaki cihaz durumlarını yapılandırın. Daha fazla bilgi içinDeviceStateProviderImpl.java
bakın.DeviceStateProvider
veyaDeviceStatePolicy
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
forDeviceStateManager
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.
- İlgili durumları
Android 14'te çift (eşzamanlı) ekran modunu destekleyen cihazlar için:
-
com.android.internal.R.bool.config_supportsConcurrentInternalDisplays
değerinitrue
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:
- Geliştirici seçeneklerine ve USB hata ayıklamanın etkin olduğu bir cihazı takın.
- Bilgisayarın aygıtta hata ayıklamasına izin verin.
- Androidx deposunun kök dizininde bir kabuk açın.
- Dizini
framework/support
olarak değiştirin. - Şu 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çeneklerine ve USB hata ayıklamanın etkin olduğu bir cihazı takın.
- Bilgisayarın aygıtta hata ayıklamasına izin verin.
- Pencere modülünün pencere kitaplığındaki 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ö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.