Önceki sürümlerde olduğu gibi Android 15 de uygulamanızı etkileyebilecek davranış değişiklikleri içerir. Aşağıdaki davranış değişiklikleri yalnızca Android 15 veya sonraki sürümleri hedefleyen uygulamalar için geçerlidir. Uygulamanız Android 15 veya sonraki bir sürümü hedefliyorsa uygun olduğu durumlarda uygulamanızı bu davranışları doğru şekilde destekleyecek şekilde değiştirmeniz gerekir.
Uygulamanızdan targetSdkVersion
bağımsız olarak Android 15'te çalışan tüm uygulamaları etkileyen davranış değişikliklerinin listesini de incelemeyi unutmayın.
Temel işlevler
Android 15, Android sisteminin çeşitli temel özelliklerini değiştirir veya genişletir.
Ön plan hizmetlerinde yapılan değişiklikler
Android 15'in ön plan hizmetlerinde aşağıdaki değişiklikleri yapıyoruz.
- Yeni medya işleme ön plan hizmet türü
- Ön plan hizmetlerini başlatan
BOOT_COMPLETED
yayın alıcılarıyla ilgili kısıtlamalar
Veri senkronizasyonu ön plan hizmeti zaman aşımı davranışı
Android 15, Android 15 veya sonraki sürümleri hedefleyen uygulamalar için dataSync
uygulamasına yeni bir zaman aşımı davranışı sunmaktadır. Bu davranış, yeni mediaProcessing
ön plan hizmeti türü için de geçerlidir.
Sistem, bir uygulamanın dataSync
hizmetlerinin 24 saatlik süre içinde toplam 6 saat çalışmasına izin verir. Bu sürenin ardından sistem, çalışan hizmetin Service.onTimeout(int, int)
yöntemini (Android 15'te kullanıma sunulmuştur) çağırır. Şu anda hizmetin Service.stopSelf()
'i çağırması için birkaç saniyesi vardır. Service.onTimeout()
çağrıldığında, hizmet artık ön plan hizmeti olarak kabul edilmez. Hizmet Service.stopSelf()
yöntemini çağırmıyorsa şu hata mesajıyla birlikte bir hata oluşur: "<fgs_type> ön plan hizmeti, zaman aşımı süresi içinde durmadı: <component_name>". Hata mesajı Beta 2'de ANR olarak gösterilir ancak gelecekteki Beta sürümünde bu hata mesajı özel bir istisna oluşturur.
Bu davranış değişikliğiyle ilgili sorun yaşamamak için aşağıdakilerden birini veya daha fazlasını yapabilirsiniz:
- Hizmetinizin yeni
Service.onTimeout(int, int)
yöntemini uygulamasını sağlayın. Uygulamanız geri çağırmayı aldığındastopSelf()
birkaç saniye içinde çağrıldığından emin olun. (Uygulamayı hemen durdurmazsanız sistem bir hata oluşturur.) - Uygulamanızın
dataSync
hizmetlerinin herhangi 24 saatlik bir süre içinde toplam 6 saatten fazla çalışmadığından emin olun (kullanıcı uygulamayla etkileşimde bulunmadığı sürece zamanlayıcı sıfırlanmaz). dataSync
ön plan hizmetlerini yalnızca doğrudan kullanıcı etkileşiminin bir sonucu olarak başlatın. Hizmet başladığında uygulamanız ön planda olduğundan, uygulamanız arka plana geçtikten sonra hizmetinizde tam altı saat kullanım süresi olur.dataSync
ön plan hizmeti yerine alternatif bir API kullanın.
Uygulamanızın dataSync
ön plan hizmetleri son 24 içinde 6 saat çalıştıysa kullanıcı uygulamanızı ön plana getirmediği (bu durumda zamanlayıcıyı sıfırlar) haricinde başka bir dataSync
ön plan hizmeti başlatamazsınız. Başka bir dataSync
ön plan hizmeti başlatmaya çalışırsanız sistem, "dataSync ön plan hizmet türü için süre sınırı zaten tükendi" gibi bir hata mesajıyla ForegroundServiceStartNotAllowedException
hatası verir.
Yeni medya işleme ön plan hizmet türü
Android 15'te yeni bir ön plan hizmet türü kullanıma sunuluyor: mediaProcessing
. Bu hizmet türü, medya dosyalarının kodunu dönüştürme gibi işlemler için uygundur. Örneğin, bir medya uygulaması bir ses dosyasını indirebilir ve çalmadan önce farklı bir biçime dönüştürmesi gerekebilir. Dönüşümün uygulama arka plandayken bile devam ettiğinden emin olmak için bir mediaProcessing
ön plan hizmeti kullanabilirsiniz.
Sistem, bir uygulamanın mediaProcessing
hizmetlerinin 24 saatlik süre içinde toplam 6 saat çalışmasına izin verir. Bu sürenin ardından sistem, çalışan hizmetin Service.onTimeout(int, int)
yöntemini (Android 15'te kullanıma sunulmuştur) çağırır. Şu anda hizmetin Service.stopSelf()
'i çağırması için birkaç saniyesi vardır. Hizmet Service.stopSelf()
yöntemini çağırmıyorsa şu hata mesajıyla birlikte bir hata oluşur: "<fgs_type> ön plan hizmeti, zaman aşımı süresi içinde durmadı: <component_name>". Hata mesajı Beta 2'de bir ANR olarak gösterilir ancak gelecekteki Beta sürümünde bu hata mesajı özel bir istisna oluşturur.
ANR sorununu önlemek için aşağıdakilerden birini yapabilirsiniz:
- Hizmetinizin yeni
Service.onTimeout(int, int)
yöntemini uygulamasını sağlayın. Uygulamanız geri çağırmayı aldığındastopSelf()
birkaç saniye içinde çağrıldığından emin olun. (Uygulamayı hemen durdurmazsanız sistem bir hata oluşturur.) - Uygulamanızın
mediaProcessing
hizmetlerinin herhangi bir 24 saatlik süre içinde toplam 6 saatten fazla çalışmadığından emin olun (kullanıcı uygulamayla etkileşimde bulunmadığı sürece zamanlayıcıyı sıfırlamaz). mediaProcessing
ön plan hizmetlerini yalnızca doğrudan kullanıcı etkileşiminin bir sonucu olarak başlatın. Hizmet başladığında uygulamanız ön planda olduğundan, uygulamanız arka plana geçtikten sonra hizmetinizde tam altı saat kullanım süresi olur.mediaProcessing
ön plan hizmeti yerine WorkManager gibi alternatif bir API kullanın.
Uygulamanızın mediaProcessing
ön plan hizmetleri son 24 içinde 6 saat çalıştıysa kullanıcı uygulamanızı ön plana getirmediği (bu durumda zamanlayıcıyı sıfırladığı) haricinde başka bir mediaProcessing
ön plan hizmeti başlatamazsınız. Başka bir mediaProcessing
ön plan hizmeti başlatmaya çalışırsanız sistem ForegroundServiceStartNotAllowedException
mesajını "Ön plan hizmet türü mediaProcessing için süre sınırı zaten tükendi" gibi bir hata mesajıyla bildirir.
mediaProcessing
hizmet türü hakkında daha fazla bilgi için Android 15 için ön plan hizmeti türlerinde yapılan değişiklikler: Medya işleme bölümüne bakın.
Ön plan hizmetlerini başlatan BOOT_COMPLETED
yayın alıcılarıyla ilgili kısıtlamalar
Ön plan hizmetlerini başlatan BOOT_COMPLETED
yayın alıcılarıyla ilgili yeni kısıtlamalar var. BOOT_COMPLETED
alıcılarının aşağıdaki ön plan hizmeti türlerini başlatmasına izin verilmez:
dataSync
camera
mediaPlayback
phoneCall
mediaProjection
microphone
(bu kısıtlamamicrophone
için Android 14'ten beri yürürlüktedir)
Bir BOOT_COMPLETED
alıcısı bu tür ön plan hizmetlerinden herhangi birini başlatmaya çalışırsa sistem ForegroundServiceStartNotAllowedException
gönderir.
Bir uygulama SYSTEM_ALERT_WINDOW
iznine sahipken ön plan hizmetlerini başlatmayla ilgili kısıtlamalar
Daha önce, SYSTEM_ALERT_WINDOW
iznini kullanan uygulamalar arka planda çalışıyor olsa bile ön plan hizmetini başlatabiliyordu (arka planda başlatma kısıtlamalarından muaf tutmalar bölümünde açıklandığı şekilde).
Bir uygulama Android 15'i hedefliyorsa bu muafiyet artık daha dar olur. Uygulamanın artık hem SYSTEM_ALERT_WINDOW
iznine hem de ayrıca görünür bir yer paylaşımlı pencereye sahip olması gerekir. Yani uygulamanın önce bir TYPE_APPLICATION_OVERLAY
penceresi başlatması ve bir ön plan hizmeti başlatabilmeniz için pencerenin görünür olması gerekir.
Uygulamanız bu yeni gereksinimleri karşılamadan arka plandan bir ön plan hizmeti başlatmaya çalışırsa (ve başka bir muafiyet yoksa) sistem ForegroundServiceStartNotAllowedException
değerini gönderir.
Uygulamanız SYSTEM_ALERT_WINDOW
iznini beyan edip arka plandan ön plan hizmetlerini başlatıyorsa bu değişiklikten etkilenebilir. Uygulamanız bir ForegroundServiceStartNotAllowedException
alırsa arka plandan bir ön plan hizmeti başlatmaya çalışmadan önce uygulamanızın işlem sırasını kontrol edin ve uygulamanızın zaten etkin bir yer paylaşımlı pencereye sahip olduğundan emin olun. View.getWindowVisibility()
yöntemini çağırarak yer paylaşımı penceresinin o anda görünür olup olmadığını kontrol edebilir veya görünürlük değiştiğinde bildirim almak için View.onWindowVisibilityChanged()
özelliğini geçersiz kılabilirsiniz.
Uygulamaların Rahatsız Etmeyin modunun genel durumunu değiştirebileceği zamanla ilgili değişiklikler
Android 15'i hedefleyen uygulamalar artık cihazlarda Rahatsız Etmeyin (DND) özelliğinin genel durumunu veya politikasını değiştiremez (kullanıcı ayarlarını değiştirerek veya Rahatsız Etmeyin modunu kapatarak). Bunun yerine, uygulamalar bir AutomaticZenRule
katkıda bulunmalıdır. Bu da sistem, mevcut en kısıtlayıcı politika kazanç şemasıyla global bir politika haline getirir. Daha önce genel durumu (setInterruptionFilter
, setNotificationPolicy
) etkileyen mevcut API'lere yapılan çağrılar, söz konusu API çağrılarının çağrı döngüsüne bağlı olarak açılıp kapatılan örtülü bir AutomaticZenRule
öğesinin oluşturulması veya güncellenmesiyle sonuçlanır.
Bu değişikliğin yalnızca uygulama setInterruptionFilter(INTERRUPTION_FILTER_ALL)
yöntemini çağırıyorsa ve bu çağrının, sahipleri tarafından önceden etkinleştirilmiş bir AutomaticZenRule
öğesini devre dışı bırakmasını bekliyorsa gözlemlenebilir davranışı etkileyeceğini unutmayın.
OpenJDK 17 değişiklikleri
Android 15, Android'in çekirdek kitaplıklarını en son OpenJDK LTS sürümlerindeki özelliklerle uyumlu olacak şekilde yenileme çalışmalarına devam ediyor.
Aşağıdaki değişikliklerden biri, Android 15'i hedefleyen uygulamalar için uygulama uyumluluğunu etkileyebilir:
Dize biçimlendirme API'lerinde yapılan değişiklikler: Aşağıdaki
String.format()
veFormatter.format()
API'leri kullanılırken bağımsız değişken dizini, işaretler, genişlik ve hassasiyetin doğrulanması artık daha katı:String.format(String, Object[])
String.format(Locale, String, Object[])
Formatter.format(String, Object[])
Formatter.format(Locale, String, Object[])
Örneğin, 0 değerine sahip bir bağımsız değişken dizini kullanıldığında (dize biçiminde
%0
) aşağıdaki istisna oluşur:IllegalFormatArgumentIndexException: Illegal format argument index = 0
Bu durumda sorun, 1 bağımsız değişken dizini (dize biçiminde
%1
) kullanılarak düzeltilebilir.Arrays.asList(...).toArray()
bileşen türünde değişiklikler:Arrays.asList(...).toArray()
kullanılırken elde edilen dizinin bileşen türü artıkObject
oluyor. Temel dizinin öğelerinin türü değil. Bunun için aşağıdaki kod birClassCastException
atar:String[] elements = (String[]) Arrays.asList("one", "two").toArray();
Bu durumda, elde edilen dizide bileşen türü olarak
String
değerini korumak için bunun yerineCollection.toArray(Object[])
değerini kullanabilirsiniz:String[] elements = Arrays.asList("two", "one").toArray(new String[0]);
Dil kodu işlemedeki değişiklikler:
Locale
API kullanılırken İbranice, Yidiş ve Endonezya dili için dil kodları artık eski biçimlere dönüştürülmeyecek (İbranice:iw
, Yidiş:ji
ve Endonezce:in
). Bu yerel ayarlardan biri için dil kodunu belirtirken ISO 639-1 kodlarını kullanın. Bunun yerine Endonezyaca:he
, Yidiş ve İbranice:he
, Yidd.} dil kodları eski hale getirilmeyecek.yi
id
Rastgele tam sayı dizilerinde yapılan değişiklikler: https://bugs.openjdk.org/browse/JDK-8301574 adresinde yapılan değişikliklerin ardından, aşağıdaki
Random.ints()
yöntemleri artıkRandom.nextInt()
yöntemlerinden farklı bir sayı dizisi döndürmektedir:Genel olarak bu değişikliğin, uygulamayı bozan bir davranışla sonuçlanmaması gerekir ancak kodunuz,
Random.ints()
yöntemlerinden oluşturulan adım sırasınınRandom.nextInt()
ile eşleşmesini beklememelidir.
Güvenlik
Android 15, uygulamaları ve kullanıcıları kötü amaçlı uygulamalardan korumaya yardımcı olmak için sistem güvenliğini teşvik eden değişiklikler içerir.
Güvenli arka plan etkinliği lansmanları
Android 15, kötü amaçlı arka plan uygulamalarının diğer uygulamaları ön plana getirmesini engelleyen değişiklikler ekleyerek, kullanıcıların ayrıcalıklarını yükselterek ve kullanıcı etkileşimini kötüye kullanarak kullanıcıları zararlı uygulamalardan korur ve kullanıcılara cihazları üzerinde daha fazla kontrol sağlar. Arka plan etkinliği lansmanları Android 10'dan (API düzeyi 29) itibaren kısıtlanmıştır.
Yığındaki en üstteki UID ile eşleşmeyen uygulamaların etkinlikleri başlatmasını engelle
Kötü amaçlı uygulamalar aynı görev içinde başka bir uygulamanın etkinliğini başlatabilir, ardından kendilerini üst üste bindirerek o uygulama olduğu izlenimi yaratabilir. Bu "görev ele geçirme" saldırısı, her şey aynı görünür görev içinde gerçekleştiğinden arka planda başlatma kısıtlamalarını atlar. Android 15, bu riski azaltmak için yığındaki en üstteki UID ile eşleşmeyen uygulamaların etkinlikleri başlatmasını engelleyen bir işaret ekler. Uygulamanızdaki tüm etkinlikleri etkinleştirmek için uygulamanızın AndroidManifest.xml
dosyasındaki allowCrossUidActivitySwitchFromBelow
özelliğini güncelleyin:
<application android:allowCrossUidActivitySwitchFromBelow="false" >
Aşağıdakilerin tümü geçerliyse yeni güvenlik önlemleri etkindir:
- Lansmanı gerçekleştiren uygulama Android 15'i hedefliyor.
- Görev yığınının en üstündeki uygulama Android 15'i hedefliyor.
- Tüm görünür etkinlikler yeni korumalara dahil edildi
Güvenlik önlemleri etkinleştirilirse uygulamalar kendi görevlerini tamamlarlarsa son görünür olan uygulama yerine ana sayfaya dönebilir.
Diğer değişiklikler
UID eşleştirme kısıtlamasına ek olarak şu değişiklikler de dahil edilir:
PendingIntent
içerik üreticiyi varsayılan olarak arka planda etkinlik başlatmaları engellenecek şekilde değiştirin. Bu, uygulamaların yanlışlıkla kötü amaçlı kişiler tarafından kötüye kullanılabilecek birPendingIntent
oluşturmasını önlemeye yardımcı olur.PendingIntent
tarafından gönderen izin vermediği sürece bir uygulamayı ön plana getirmeyin. Bu değişikliğin amacı, kötü amaçlı uygulamaların arka planda etkinlik başlatma özelliğini kötüye kullanmasını önlemektir. Varsayılan olarak, oluşturucu arka plan etkinliğini başlatma ayrıcalıklarına izin vermediği veya gönderen, arka plan etkinliği başlatma ayrıcalıklarına sahip olmadığı sürece uygulamaların görev yığınını ön plana getirmesine izin verilmez.- Bir görev yığınındaki en önemli etkinliğin görevini nasıl tamamlayabileceğini kontrol edin. En üstteki etkinlik bir görevi tamamlarsa Android en son etkin olan göreve geri döner. Dahası, üst düzey olmayan bir etkinlik görevini tamamlarsa Android ana ekrana geri döner; bu üst olmayan etkinliğin tamamlanmasını engellemez.
- Diğer uygulamalardan rastgele etkinlikleri kendi görevinize başlatmaktan kaçının. Bu değişiklik, diğer uygulamalardan geliyormuş gibi görünen etkinlikler oluşturarak kötü amaçlı uygulamaların kullanıcıları kimlik avına karşı korumasını engeller.
- Görünmez pencerelerin, arka plan etkinliği başlatmaları için değerlendirilmesini engelle. Bu, kötü amaçlı uygulamaların kullanıcılara istenmeyen veya kötü amaçlı içerik göstermek için arka plan etkinlik başlatmalarını kötüye kullanmasını önlemeye yardımcı olur.
Daha güvenli amaçlar
Android 15, amaçların daha güvenli ve güçlü olmasını sağlamak için yeni güvenlik önlemleri sunar. Bu değişikliklerin amacı, olası güvenlik açıklarını ve kötü amaçlı uygulamalar tarafından istismar edilebilecek amaçların kötüye kullanımını önlemektir. Android 15'te amaçların güvenliğiyle ilgili iki önemli iyileştirme yapıldı:
- Hedef intent filtrelerini eşleştir: Belirli bileşenleri hedefleyen amaçlar, hedefin amaç filtresi spesifikasyonlarıyla doğru bir şekilde eşleşmelidir. Başka bir uygulamanın etkinliğini başlatma niyeti gönderirseniz hedef intent bileşeninin alıcı etkinliğin bildirilen intent filtreleriyle uyumlu olması gerekir.
- Amaçların işlemleri olmalıdır: İşlem içermeyen amaçlar artık hiçbir amaç filtresiyle eşleşmeyecektir. Bu, etkinlikleri veya hizmetleri başlatmak için kullanılan amaçların açıkça tanımlanmış bir eyleme sahip olması gerektiği anlamına gelir.
- Beklemedeki amaçlar: Beklemedeki amacın oluşturucusu, beklemedeki niyetin göndereni değil, ilgili niyetin göndereni olarak değerlendirilir
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() .detectUnsafeIntentLaunch() .build() ) }
Java
public void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() .detectUnsafeIntentLaunch() .build()); }
Kullanıcı deneyimi ve sistem arayüzü
Android 15'te daha tutarlı ve sezgisel bir kullanıcı deneyimi sunmayı amaçlayan bazı değişiklikler vardır.
Pencere içe aktarma değişiklikleri
Android 15'te pencere ekleriyle ilgili iki değişiklik vardır: Varsayılan olarak uçtan uca zorunlu kılınır. Ayrıca, sistem çubuklarının varsayılan yapılandırması gibi yapılandırma değişiklikleri de bulunur.
Uçtan uca zorunlu kılma
Android 15'i (API düzeyi 35) hedefleyen uygulamalar, Android 15 çalıştıran cihazlarda varsayılan olarak uçtan uca sunulur.
Bu, uygulamanızın kullanıcı arayüzünü olumsuz etkileyebilecek zarar veren bir değişikliktir. Değişiklikler aşağıdaki kullanıcı arayüzü alanlarını etkiler:
- Hareket tutma yeri gezinme çubuğu
- Varsayılan olarak şeffaftır.
- Alt ofset devre dışı bırakılır. Böylece, ek öğeler uygulanmadığı sürece içerik, sistem gezinme çubuğunun arkasına taşınır.
setNavigationBarColor
veR.attr#navigationBarColor
desteği sonlandırıldı ve hareketle gezinmeyi etkilemez.setNavigationBarContrastEnforced
veR.attr#navigationBarContrastEnforced
özelliklerinin hareketle gezinme üzerinde herhangi bir etkisi yoktur.
- 3 düğmeli gezinme
- Opaklık varsayılan olarak% 80'e ayarlanır ve renk büyük olasılıkla pencere arka planıyla eşleşir.
- Alt ofset devre dışı olduğundan içerik, ek öğeler uygulanmadığı sürece sistem gezinme çubuğunun gerisinde kalır.
setNavigationBarColor
veR.attr#navigationBarColor
varsayılan olarak pencere arka planıyla eşleşecek şekilde ayarlanmıştır. Bu varsayılanın uygulanabilmesi için pencere arka planının çekilebilir bir renk olması gerekir. Bu API kullanımdan kaldırılmıştır ancak 3 düğmeli gezinmeyi etkilemeye devam etmektedir.setNavigationBarContrastEnforced
veR.attr#navigationBarContrastEnforced
varsayılan olarak true (doğru) değerini alır. Bu da 3 düğmeli gezinmeye% 80 opak bir arka plan ekler.
- Durum çubuğu
- Varsayılan olarak şeffaftır.
- Üst ofset devre dışı bırakılır. Böylece, ek öğeler uygulanmadığı sürece içerik durum çubuğunun gerisinde kalır.
setStatusBarColor
veR.attr#statusBarColor
desteği sonlandırılmış olup Android 15'te herhangi bir etkisi yoktur.setStatusBarContrastEnforced
veR.attr#statusBarContrastEnforced
desteği sonlandırılsa da Android 15'te etkileri devam ediyor.
- Ekran kesimi
- Kayan olmayan pencerelerin
layoutInDisplayCutoutMode
kadarıLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
olmalıdır.SHORT_EDGES
,NEVER
veDEFAULT
,ALWAYS
olarak yorumlanır. Böylece, kullanıcılar ekran kesimi nedeniyle siyah bir çubuk görmez ve uçtan uca görünür.
- Kayan olmayan pencerelerin
Aşağıdaki örnekte, Android 15 (API düzeyi 35) hedeflenmeden önceki ve sonrasındaki, eklerin uygulanmasından önceki ve sonraki bir uygulama gösterilmektedir.
Uygulamanızın uçtan uca olup olmadığını kontrol etmeniz gerekenler
Uygulamanız zaten uçtan uca ve içe eklemeler uyguluyorsa aşağıdaki senaryolar dışında çoğunlukla etkilenmezsiniz. Ancak etkilenmediğinizi düşünseniz bile uygulamanızı test etmenizi öneririz.
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
yerineSHORT_EDGES
,NEVER
veyaDEFAULT
kullanan birActivity
gibi kayan olmayan bir pencereniz var. Uygulamanız başlatılırken kilitleniyorsa bunun nedeni başlangıç ekranınız olabilir. Temel başlangıç ekranı bağımlılığını 1.2.0-alpha01 veya sonraki bir sürüme yükseltebilir ya dawindow.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always
olarak ayarlayabilirsiniz.- Kapalı kullanıcı arayüzüyle daha az trafik elde edilen ekranlar olabilir. Daha az ziyaret edilen bu ekranların gizlenmiş kullanıcı arayüzü içermediğini doğrulayın. Düşük trafikli ekranlar şunları içerir:
- İlk katılım veya oturum açma ekranları
- Ayarlar sayfaları
Uygulamanız uçtan uca değilse kontrol edilecekler
Uygulamanız tüm ayrıntılarıyla anlatılmıyorsa muhtemelen etkileniyorsunuzdur. Uçtan uca uygulamalarla ilgili senaryolara ek olarak aşağıdakileri de göz önünde bulundurmalısınız:
- Uygulamanız, oluşturma sırasında
TopAppBar
,BottomAppBar
veNavigationBar
gibi Material 3 Bileşenleri (androidx.compose.material3
) kullanıyorsa ek öğeleri otomatik olarak işlediği için bu bileşenler büyük olasılıkla etkilenmez. - Uygulamanız Compose'da Material 2 Bileşenleri (
androidx.compose.material
) kullanıyorsa bu bileşenler ekleri otomatik olarak işlemez. Ancak eklere erişebilir ve bunları manuel olarak uygulayabilirsiniz. androidx.compose.material 1.6.0 ve sonraki sürümlerde,BottomAppBar
,TopAppBar
,BottomNavigation
veNavigationRail
için ekleri manuel olarak uygulamak üzerewindowInsets
parametresini kullanın. Benzer şekilde,Scaffold
içincontentWindowInsets
parametresini kullanın. - Uygulamanızda görünümler ve Malzeme Bileşenleri (
com.google.android.material
) kullanılıyorsaBottomNavigationView
,BottomAppBar
,NavigationRailView
veyaNavigationView
gibi görünüme dayalı Materyal Bileşenlerin çoğu ek işlemleri gerçekleştirir ve ek çalışma gerektirmez. AncakAppBarLayout
kullanıyorsanızandroid:fitsSystemWindows="true"
eklemeniz gerekir. - Özel composable'lar için iç kümeleri dolgu olarak manuel olarak uygulayın. İçeriğiniz
Scaffold
içindeyseScaffold
dolgu değerlerini kullanarak ek öğeleri kullanabilirsiniz. Aksi takdirde, dolguyuWindowInsets
özelliklerinden birini kullanarak uygulayın. - Uygulamanız görünümler ve
BottomSheet
,SideSheet
veya özel kapsayıcılar kullanıyorsa dolguyuViewCompat.setOnApplyWindowInsetsListener
kullanarak uygulayın.RecyclerView
için bu işleyiciyi kullanarak dolgu uygulayın ve ayrıcaclipToPadding="false"
ekleyin.
Uygulamanızın özel arka plan koruması sunması gerekip gerekmediğini kontrol etmeniz gerekenler
Uygulamanızın 3 düğmeli gezinme veya durum çubuğuna özel arka plan koruması sunması gerekiyorsa uygulama, 3 düğmeli gezinme çubuğu yüksekliğini veya WindowInsets.Type#statusBars
değerini almak için WindowInsets.Type#tappableElement()
kullanarak sistem çubuğunun arkasına bir composable veya görünüm yerleştirmelidir.
Uçtan uca ek kaynaklar
Eklerin uygulanmasıyla ilgili dikkat edilmesi gereken diğer hususlar için Uçtan Kenar Görünümleri ve Uçtan Uca Oluşturma kılavuzlarına bakın.
Desteği sonlandırılmış API'ler
Aşağıdaki API'ler kullanımdan kaldırılmıştır:
R.attr#enforceStatusBarContrast
R.attr#navigationBarColor
R.attr#navigationBarDividerColor
R.attr#statusBarColor
Window#getNavigationBarColor
Window#getNavigationBarDividerColor
Window#getStatusBarColor
Window#isStatusBarContrastEnforced
Window#setDecorFitsSystemWindows
Window#setNavigationBarColor
Window#setNavigationBarDividerColor
Window#setStatusBarColor
Window#setStatusBarContrastEnforced
Kararlı yapılandırma
Uygulamanız Android 15 veya sonraki bir sürümü hedefliyorsa Configuration
artık sistem çubuklarını hariç tutmayacaktır. Düzen hesaplaması için Configuration
sınıfında ekran boyutunu kullanırsanız ihtiyacınıza göre uygun ViewGroup
, WindowInsets
veya WindowMetricsCalculator
gibi daha iyi alternatiflerle değiştirmeniz gerekir.
Configuration
, API 1'den beri kullanılmaktadır. Genellikle Activity.onConfigurationChanged
üzerinden elde edilir. Pencere yoğunluğu, yön ve boyut
gibi bilgiler sağlar. Configuration
ürününden döndürülen pencere boyutlarıyla ilgili önemli bir özellik, daha önce sistem çubuklarının hariç tutulmasıdır.
Yapılandırma boyutu genellikle kaynak seçimi için kullanılır (ör. /res/layout-h500dp
) ve bu hâlâ geçerli bir kullanım alanıdır. Ancak, düzen hesaplamasında bu özelliğin kullanılması her zaman önerilmemiştir. Böyle bir durumda
bu çerçeveden hemen ayrılmanız gerekir. Configuration
kullanımını, kullanım alanınıza bağlı olarak daha uygun bir ifadeyle değiştirmeniz gerekir.
Düzeni hesaplamak için bunu kullanırsanız CoordinatorLayout
veya ConstraintLayout
gibi uygun bir ViewGroup
kullanın. Sistem gezinme çubuğunun yüksekliğini belirlemek için bunu kullanıyorsanız WindowInsets
değerini kullanın. Uygulama pencerenizin mevcut boyutunu öğrenmek istiyorsanız computeCurrentWindowMetrics
işlevini kullanın.
Aşağıdaki listede, bu değişiklikten etkilenen alanlar açıklanmaktadır:
Configuration.screenWidthDp
vescreenHeightDp
boyutları artık sistem çubuklarını hariç tutmamaktadır.Configuration.smallestScreenWidthDp
,screenWidthDp
vescreenHeightDp
üzerinde yapılan değişikliklerden dolaylı olarak etkileniyor.Configuration.orientation
, kareye yakın cihazlardascreenWidthDp
vescreenHeightDp
metriklerinde yapılan değişikliklerden dolaylı olarak etkileniyor.Display.getSize(Point)
,Configuration
ile ilgili değişikliklerden dolaylı olarak etkileniyor. Bu işlev, API düzeyi 30'dan itibaren kullanımdan kaldırılmıştır.Display.getMetrics()
, API düzeyi 33'ten beri bu şekilde çalışıyor.
zarifTextHeight özelliği varsayılan olarak true değerine ayarlanır
Android 15'i hedefleyen uygulamalarda elegantTextHeight
TextView
özelliği varsayılan olarak true
haline gelir. Varsayılan olarak kullanılan kompakt yazı tipi, büyük dikey metriklere sahip bazı komut dosyalarıyla değiştirilir. Bu yazı tipi çok daha okunabilir bir yazı tipiyle değiştirilir. Kompakt yazı tipi, düzenlerin bozulmasını önlemek için kullanıma sunulmuştur. Android 13 (API düzeyi 33), fallbackLineSpacing
özelliğini kullanarak metin düzeninin dikey yüksekliği genişletmesine izin vererek bu bozuklukların çoğunun önüne geçer.
Android 15'te, kompakt yazı tipi sistemde kalmaya devam eder. Böylece uygulamanız, öncekiyle aynı davranışı elde etmek için elegantTextHeight
değerini false
olarak ayarlayabilir, ancak gelecekteki sürümlerde desteklenme olasılığı düşüktür. Bu nedenle, uygulamanız Arapça, Laoca, Myanmar, Tamilce, Guceratça, Kannada, Malayalam, Oriya, Telugu ve Tayca komutlarını destekliyorsa elegantTextHeight
değerini true
olarak ayarlayarak uygulamanızı test edin.
Karmaşık harf şekilleri için TextView genişliği değişiyor
Android'in önceki sürümlerinde, karmaşık şekilli belirli el yazısı yazı tipleri
veya diller, önceki ya da sonraki karakterin alanındaki harfleri çizebilir.
Bazı durumlarda, bu tür harfler başlangıç veya bitiş konumundan kırpılıyordu.
Android 15'ten itibaren TextView
, bu tür harflere yeterince alan çizmek için genişlik ayırır ve uygulamaların kırpmayı önlemek için sola doğru ekstra dolgular istemesine olanak tanır.
Bu değişiklik, bir TextView
öğesinin genişliğe karar verme şeklini etkilediğinden, uygulama Android 15 veya sonraki bir sürümü hedefliyorsa TextView
varsayılan olarak daha fazla genişlik ayırır. TextView
üzerinde setUseBoundsForWidth
API'yi çağırarak bu davranışı etkinleştirebilir veya devre dışı bırakabilirsiniz.
Sol dolgu eklemek mevcut düzenlerde uyumsuzluğa neden olabileceğinden dolgu, Android 15 veya sonraki sürümleri hedefleyen uygulamalarda bile varsayılan olarak eklenmez.
Ancak, kırpmayı önlemek için setShiftDrawingOffsetForStartOverhang
yöntemini çağırarak fazladan dolgu ekleyebilirsiniz.
Aşağıdaki örnekler, bu değişikliklerin bazı yazı tipleri ve diller için metin düzenini nasıl iyileştirebileceğini göstermektedir.
EditText için yerel ayara duyarlı varsayılan satır yüksekliği
Android'in önceki sürümlerinde metin düzeni, metnin yüksekliğini mevcut yerel ayarla eşleşen yazı tipinin satır yüksekliğini karşılayacak şekilde genişletiyordu. Örneğin, içerik Japoncaysa, Japonca yazı tipinin satır yüksekliği Latin yazı tipinden biraz daha büyük olduğu için metnin yüksekliği biraz daha büyük olur. Ancak, satır yüksekliklerindeki bu farklılıklara rağmen, aşağıdaki resimde gösterildiği gibi EditText
öğesi, kullanılan yerel ayardan bağımsız olarak eşit şekilde boyutlandırıldı:
Android 15'i hedefleyen uygulamalarda, aşağıdaki resimde gösterildiği gibi, belirtilen Yerel Ayarın referans yazı tipiyle eşleşmesi için EditText
için minimum satır yüksekliği ayrılmıştır:
Gerekirse uygulamanız useLocalePreferredLineHeightForMinimum
özelliğini false
için belirterek önceki davranışı geri yükleyebilir. Ayrıca uygulamanız, Kotlin ve Java'da setMinimumFontMetrics
API'yi kullanarak özel minimum sektör metrikleri ayarlayabilir.
Kamera ve medya
Android 15, Android 15 veya sonraki sürümleri hedefleyen uygulamaların kamera ve medya davranışında aşağıdaki değişiklikleri yapar.
Ses odağı isteğinde bulunmayla ilgili kısıtlamalar
Android 15'i hedefleyen uygulamaların, sese odaklanma için en iyi uygulama olması veya sesle ilgili bir ön plan hizmeti çalıştırması gerekir. Bir uygulama bu şartlardan birini karşılamadığında odaklanma isteğinde bulunmaya çalışırsa çağrı AUDIOFOCUS_REQUEST_FAILED
değerini döndürür.
Türü mediaPlayback
, camera
, microphone
veya phoneCall
olan ön plan hizmetlerinin sesle ilişkili olduğu kabul edilir.
Ses odağını yönetme başlıklı makalede ses odağı hakkında daha fazla bilgi edinebilirsiniz.
SDK dışı kısıtlamalar güncellendi
Android 15, Android geliştiricileriyle yapılan ortak çalışmalara ve en son dahili testlere dayanarak kısıtlanmış SDK dışı arayüzlerin güncellenmiş listelerini içerir. Mümkün olduğunda, SDK olmayan arayüzleri kısıtlamadan önce herkese açık alternatiflerin kullanılabilir olmasını sağlarız.
Uygulamanız Android 15'i hedeflemiyorsa bu değişikliklerden bazıları sizi hemen etkilemeyebilir. Bununla birlikte, uygulamanızın hedef API düzeyine bağlı olarak uygulamanızın SDK olmayan bazı arayüzlere erişmesi mümkün olsa da, SDK olmayan herhangi bir yöntemi veya alanı kullanmak her zaman uygulamanızı bozabilir.
Uygulamanızın SDK olmayan arayüzler kullanıp kullanmadığından emin değilseniz öğrenmek için uygulamanızı test edebilirsiniz. Uygulamanız SDK dışı arayüzlere dayanıyorsa SDK alternatiflerine geçiş planlamaya başlamanız gerekir. Yine de, bazı uygulamaların SDK dışı arayüz kullanmak için geçerli kullanım alanları olduğunu biliyoruz. Uygulamanızdaki bir özellik için SDK dışı arayüz kullanmaya alternatif bulamıyorsanız yeni bir genel API isteğinde bulunmanız gerekir.
Android'in bu sürümündeki değişiklikler hakkında daha fazla bilgi edinmek için Android 15'te SDK dışı arayüz kısıtlamalarında yapılan güncellemeler bölümüne bakın. Genel olarak SDK olmayan arayüzler hakkında daha fazla bilgi edinmek için SDK olmayan arayüzlerle ilgili kısıtlamalar bölümüne bakın.