Android 15, önceki sürümlerde olduğu gibi 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 sürümleri hedefliyorsa uygulamanızı, geçerli olduğu yerlerde bu davranışları düzgün şekilde destekleyecek şekilde değiştirmeniz gerekir.
Uygulamanızın targetSdkVersion
'sinden bağımsız olarak Android 15'te çalışan tüm uygulamaları etkileyen davranış değişiklikleri listesini de incelediğinizden emin olun.
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
We are making the following changes to foreground services with Android 15.
- Data sync foreground service timeout behavior
- New media processing foreground service type
- Restrictions on
BOOT_COMPLETED
broadcast receivers launching foreground services - Restrictions on starting foreground services while an app holds the
SYSTEM_ALERT_WINDOW
permission
Data sync foreground service timeout behavior
Android 15, Android 15'i (API düzeyi 35) veya sonraki sürümleri hedefleyen uygulamalar için dataSync
'te yeni bir zaman aşımı davranışı sunar. Bu davranış, yeni mediaProcessing
ön plan hizmet türü için de geçerlidir.
Sistem, bir uygulamanın dataSync
hizmetlerinin 24 saat içinde toplam 6 saat çalışmasına izin verir. Ardından sistem, çalışan hizmetin Service.onTimeout(int, int)
yöntemini (Android 15'te kullanıma sunulmuştur) çağırır. Bu sırada hizmetin Service.stopSelf()
'u araması için birkaç saniye süre tanınır. Service.onTimeout()
çağrıldığında hizmet artık ön plan hizmeti olarak kabul edilmez. Hizmet Service.stopSelf()
'ü çağırmazsa sistem dahili bir istisna oluşturur. İstisna, Logcat'e aşağıdaki mesajla kaydedilir:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type dataSync did not stop within its timeout: [component name]"
Bu davranış değişikliğiyle ilgili sorunları önlemek 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 aramayı aldığında birkaç saniye içindestopSelf()
'ü aradığınızdan emin olun. (Uygulamayı hemen durdurmazsanız sistem bir hata oluşturur.) - Uygulamanızın
dataSync
hizmetlerinin, 24 saatlik herhangi bir dönemde toplam 6 saatten fazla çalışmadığından emin olun (kullanıcı uygulamayla etkileşime geçerek zamanlayıcıyı sıfırlamazsa). dataSync
ön plan hizmetlerini yalnızca doğrudan kullanıcı etkileşimi sonucunda başlatın. Hizmetiniz başladığında uygulamanız ön planda olduğundan, uygulama arka plana geçtikten sonra hizmetiniz altı saat boyunca çalışır.dataSync
ön plan hizmeti yerine alternatif bir API kullanın.
Uygulamanızın dataSync
ön plan hizmeti son 24 içinde 6 saat çalıştıysa kullanıcı uygulamanızı ön plana getirmediği sürece başka bir dataSync
ön plan hizmeti başlatamazsınız (bu durumda zamanlayıcı sıfırlanır). Başka bir dataSync
ön plan hizmetini başlatmaya çalışırsanız sistem, "dataSync ön plan hizmet türü için zaman sınırı zaten aşıldı" gibi bir hata mesajıyla ForegroundServiceStartNotAllowedException
oluşturur.
Test
Uygulamanızın davranışını test etmek için uygulamanız Android 15'i hedeflemese bile veri senkronizasyonu zaman aşımlarını etkinleştirebilirsiniz (uygulama Android 15 cihazda çalışıyorsa). Zaman aşımlarını etkinleştirmek için aşağıdaki adb
komutunu çalıştırın:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Ayrıca, sınıra ulaşıldığında uygulamanızın nasıl davrandığını test etmeyi kolaylaştırmak için zaman aşımı süresini ayarlayabilirsiniz. Yeni bir zaman aşımı süresi ayarlamak için aşağıdaki adb
komutunu çalıştırın:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
New media processing foreground service type
Android 15, mediaProcessing
adlı yeni bir ön plan hizmet türü kullanıma sunar. 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ı indirebilir ve dosyayı oynatmadan önce farklı bir biçime dönüştürmesi gerekebilir. Uygulama arka plandayken bile dönüşümün devam etmesini sağlamak için bir mediaProcessing
ön plan hizmeti kullanabilirsiniz.
Sistem, bir uygulamanın mediaProcessing
hizmetlerinin 24 saat içinde toplam 6 saat çalışmasına izin verir. Ardından, çalışan hizmetin Service.onTimeout(int, int)
yöntemini (Android 15'te kullanıma sunulmuştur) çağırır. Şu anda hizmetin Service.stopSelf()
hizmetini çağırmak için birkaç saniyesi var. Hizmet Service.stopSelf()
'ü çağırmazsa sistem dahili bir istisna oluşturur. İstisna aşağıdaki mesajla Logcat'e kaydedilir:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type mediaProcessing did not stop within its timeout: [component name]"
İstisnayı önlemek için aşağıdakilerden birini yapabilirsiniz:
- Hizmetinizin yeni
Service.onTimeout(int, int)
yöntemini uygulamasını sağlayın. Uygulamanız geri aramayı aldığında birkaç saniye içindestopSelf()
'ü aradığınızdan 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şim kurmadığı ve zamanlayıcıyı sıfırladığı sürece). mediaProcessing
ön plan hizmetlerini yalnızca doğrudan kullanıcı etkileşimi sonucunda başlatın. Hizmetiniz başladığında uygulamanız ön planda olduğundan, uygulama arka plana geçtikten sonra hizmetiniz altı saat boyunca çalışır.mediaProcessing
ön plan hizmeti yerine WorkManager gibi bir alternatif API kullanın.
Uygulamanızın mediaProcessing
ön plan hizmetleri son 24 saat içinde 6 saat boyunca çalıştıysa kullanıcı uygulamanızı ön plana getirmediği (bu durumda zamanlayıcı sıfırlanır) sürece başka bir mediaProcessing
ön plan hizmeti başlatamazsınız. Başka bir mediaProcessing
ön plan hizmetini başlatmaya çalışırsanız sistem, "mediaProcessing türündeki ön plan hizmeti için zaman sınırı zaten aşıldı" gibi bir hata mesajıyla ForegroundServiceStartNotAllowedException
oluşturur.
mediaProcessing
hizmet türü hakkında daha fazla bilgi için Android 15 için ön plan hizmet türlerinde yapılan değişiklikler: Medya işleme başlıklı makaleyi inceleyin.
Test
Uygulamanızın davranışını test etmek için uygulamanız Android 15'i hedeflemese bile medya işleme zaman aşımlarını etkinleştirebilirsiniz (uygulama Android 15 cihazda çalışıyorsa). Zaman aşımlarını etkinleştirmek için aşağıdaki adb
komutunu çalıştırın:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Ayrıca, sınıra ulaşıldığında uygulamanızın nasıl davrandığını test etmeyi kolaylaştırmak için zaman aşımı süresini ayarlayabilirsiniz. Yeni bir zaman aşımı süresi ayarlamak için aşağıdaki adb
komutunu çalıştırın:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds
Restrictions on BOOT_COMPLETED
broadcast receivers launching foreground services
Yayınlanacak BOOT_COMPLETED
yayın alıcıyla ilgili yeni kısıtlamalar var
ön plan hizmetlerini kullanabilirsiniz. BOOT_COMPLETED
alıcıların
Aşağıdaki ön plan hizmeti türleri kullanılabilir:
dataSync
camera
mediaPlayback
phoneCall
mediaProjection
microphone
(bu kısıtlama,microphone
için geçerlidir. Android 14)
Bir BOOT_COMPLETED
alıcısı bu tür ön planlardan herhangi birini başlatmaya çalışırsa
özelliklerini sunarsa sistem ForegroundServiceStartNotAllowedException
komutunu atar.
Test
Uygulamanızın davranışını test etmek için, aşağıdaki durumlarda bile bu yeni kısıtlamaları etkinleştirebilirsiniz:
Uygulama Android 15'i hedeflemiyor (uygulama Android 15 yüklü olduğu sürece)
cihazda) olduğunu varsayalım. Aşağıdaki adb
komutunu çalıştırın:
adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name
Cihazı yeniden başlatmadan BOOT_COMPLETED
yayını göndermek için:
aşağıdaki adb
komutunu çalıştırın:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED your-package-name
Restrictions on starting foreground services while an app holds the SYSTEM_ALERT_WINDOW
permission
Önceden, SYSTEM_ALERT_WINDOW
iznine sahip bir uygulama, o anda arka planda olsa bile ön plan hizmeti başlatabiliyordu (arka planda başlatma kısıtlamalarından muafiyetler bölümünde açıklandığı gibi).
Bir uygulama Android 15'i hedefliyorsa bu muafiyet artık daha dar olacaktır. Uygulamanın artık SYSTEM_ALERT_WINDOW
iznine sahip olması ve ayrıca görünür bir yer paylaşımı penceresine sahip olması gerekiyor. Yani, ön plan hizmetini başlatmadan önce uygulamanın önce bir TYPE_APPLICATION_OVERLAY
penceresi başlatması ve bu pencerenin görünür olması gerekir.
Uygulamanız bu yeni koşulları karşılamadan arka plandan ön plan hizmeti başlatmaya çalışırsa (ve başka bir muafiyeti yoksa) sistem ForegroundServiceStartNotAllowedException
hatası verir.
Uygulamanız SYSTEM_ALERT_WINDOW
iznini beyan ediyorsa ve ön plan hizmetlerini arka plandan başlatıyorsa bu değişiklikten etkilenebilir. Uygulamanız ForegroundServiceStartNotAllowedException
alıyorsa uygulamanızın işlem sırasını kontrol edin ve arka plandan ön plan hizmeti başlatmaya çalışmadan önce uygulamanızda etkin bir yer paylaşımı penceresi bulunduğundan emin olun. View.getWindowVisibility()
çağrısını yaparak yer paylaşımı pencerenizin şu anda görünür olup olmadığını kontrol edebilir veya görünürlük her değiştiğinde bildirim almak için View.onWindowVisibilityChanged()
değerini geçersiz kılabilirsiniz.
Test
Uygulamanızın davranışını test etmek için, Android 15'i hedeflemese bile bu yeni kısıtlamaları etkinleştirebilirsiniz (uygulamanız Android 15 cihazında çalışıyorsa). Arka plandan ön plan hizmetlerini başlatmayla ilgili bu yeni kısıtlamaları etkinleştirmek için aşağıdaki adb
komutunu çalıştırın:
adb shell am compat enable FGS_SAW_RESTRICTIONS your-package-name
Uygulamaların Rahatsız Etmeyin modunun genel durumunu değiştirebileceği zamanlarla ilgili değişiklikler
Android 15 (API düzeyi 35) ve sonraki sürümleri hedefleyen uygulamalar artık bir cihazdaki Rahatsız Etmeyin (DND) özelliğinin genel durumunu veya politikasını değiştiremez (kullanıcı ayarlarını değiştirerek ya da DND modunu kapatarak). Bunun yerine, uygulamaların bir AutomaticZenRule
sağlaması gerekir. Sistem, bu AutomaticZenRule
'ı mevcut en kısıtlayıcı politikanın kazandığı şema ile birleştirerek global bir politika oluşturur. Daha önce genel durumu etkileyen mevcut API'lere yapılan çağrılar (setInterruptionFilter
, setNotificationPolicy
), bu API çağrılarının çağrı döngüsüne bağlı olarak etkinleştirilip devre dışı bırakılan bir örtülü AutomaticZenRule
oluşturulmasına veya güncellenmesine neden olur.
Bu değişikliğin yalnızca uygulamanın setInterruptionFilter(INTERRUPTION_FILTER_ALL)
'i aradığı ve bu aramanın, daha önce sahipleri tarafından etkinleştirilmiş bir AutomaticZenRule
'ı devre dışı bırakmasını beklediği durumlarda gözlemlenebilir davranışı etkilediğini unutmayın.
OpenJDK API değişiklikleri
Android 15, Android'in temel kitaplıklarını en son OpenJDK LTS sürümlerindeki özelliklerle uyumlu hale getirme çalışmalarına devam ediyor.
Bu değişikliklerden bazıları, Android 15'i (API düzeyi 35) hedefleyen uygulamaların 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 duyarlılık doğrulaması artık daha katı bir şekilde yapılıyor:String.format(String, Object[])
String.format(Locale, String, Object[])
Formatter.format(String, Object[])
Formatter.format(Locale, String, Object[])
Örneğin, 0 bağımsız değişken dizini kullanıldığında (biçim dizesinde
%0
) aşağıdaki istisna oluşturulur:IllegalFormatArgumentIndexException: Illegal format argument index = 0
Bu durumda, biçim dizesinde 1 bağımsız değişken dizini (
%1
biçiminde) kullanılarak sorun düzeltilebilir.Arrays.asList(...).toArray()
bileşen türünde yapılan değişiklikler:Arrays.asList(...).toArray()
kullanılırken sonuçta elde edilen dizinin bileşen türü artıkObject
(temel dizinin öğelerinin türü değil) olur. Bu nedenle, aşağıdaki kodClassCastException
hatası verir:String[] elements = (String[]) Arrays.asList("one", "two").toArray();
Bu durumda, sonuçtaki 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şleme ile ilgili değişiklikler:
Locale
API'si kullanılırken İbranice, Yidiş ve Endonezce dil kodları artık eski biçimlerine (İbranice:iw
, Yidiş:ji
ve Endonezce:in
) dönüştürülmüyor. Bu yerel ayarlardan birinin dil kodunu belirtirken bunun yerine ISO 639-1'deki kodları (İbranice:he
, Yidiş:yi
ve Endonezce:id
) kullanın.Rastgele int 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ürüyor:Genel olarak bu değişiklik, uygulamanın bozulmasına neden olmamalıdır ancak kodunuz,
Random.ints()
yöntemlerinden oluşturulan dizininRandom.nextInt()
ile eşleşmesini beklememelidir.
Yeni SequencedCollection
API'si, uygulamanızın derleme yapılandırmasında compileSdk
değerini Android 15'i (API düzeyi 35) kullanacak şekilde güncelledikten sonra uygulamanızın uyumluluğunu etkileyebilir:
MutableList.removeFirst()
veMutableList.removeLast()
uzantı işlevleriylekotlin-stdlib
'da çakışmaJava'daki
List
türü, Kotlin'dekiMutableList
türüyle eşlenir.List.removeFirst()
veList.removeLast()
API'leri Android 15'te (API düzeyi 35) kullanıma sunulduğundan Kotlin derleyici, işlev çağrılarını (ör.list.removeFirst()
)kotlin-stdlib
'deki uzantı işlevlerine değil, yeniList
API'lerine statik olarak çözümler.Bir uygulama,
compileSdk
değeri35
,minSdk
değeri ise34
veya daha düşük olacak şekilde yeniden derlenip Android 14 ve önceki sürümlerde çalıştırılırsa çalışma zamanı hatası verilir:java.lang.NoSuchMethodError: No virtual method removeFirst()Ljava/lang/Object; in class Ljava/util/ArrayList;
Android Gradle eklentisindeki mevcut
NewApi
lint seçeneği, bu yeni API kullanımlarını yakalayabilir../gradlew lint
MainActivity.kt:41: Error: Call requires API level 35 (current min is 34): java.util.List#removeFirst [NewApi] list.removeFirst()Çalışma zamanı istisnasını ve lint hatalarını düzeltmek için
removeFirst()
veremoveLast()
işlev çağrıları Kotlin'de sırasıylaremoveAt(0)
veremoveAt(list.lastIndex)
ile değiştirilebilir. Android Studio Ladybug | 2024.1.3 veya sonraki sürümleri kullanıyorsanız bu hatalar için hızlı düzeltme seçeneği de sunulur.Lint seçeneği devre dışı bırakıldıysa
@SuppressLint("NewApi")
velintOptions { disable 'NewApi' }
karakterlerini kaldırabilirsiniz.Java'da diğer yöntemlerle çakışma
Mevcut türlere yeni yöntemler eklendi. Örneğin,
List
veDeque
. Bu yeni yöntemler, diğer arayüzlerde ve sınıflarda aynı ada ve bağımsız değişken türlerine sahip yöntemlerle uyumlu olmayabilir. Uyumsuzluk nedeniyle yöntem imzası çakışması durumundajavac
derleyicisi derleme zamanı hatası verir. Örneğin:1. örnek hata:
javac MyList.java
MyList.java:135: error: removeLast() in MyList cannot implement removeLast() in List public void removeLast() { ^ return type void is not compatible with Object where E is a type-variable: E extends Object declared in interface List2. örnek hata:
javac MyList.java
MyList.java:7: error: types Deque<Object> and List<Object> are incompatible; public class MyList implements List<Object>, Deque<Object> { both define reversed(), but with unrelated return types 1 error3. örnek hata:
javac MyList.java
MyList.java:43: error: types List<E#1> and MyInterface<E#2> are incompatible; public static class MyList implements List<Object>, MyInterface<Object> { class MyList inherits unrelated defaults for getFirst() from types List and MyInterface where E#1,E#2 are type-variables: E#1 extends Object declared in interface List E#2 extends Object declared in interface MyInterface 1 errorBu derleme hatalarını düzeltmek için bu arayüzleri uygulayan sınıf, yöntemi uyumlu bir dönüş türüyle geçersiz kılmalıdır. Örneğin:
@Override public Object getFirst() { return List.super.getFirst(); }
Güvenlik
Android 15, uygulamaları ve kullanıcıları kötü amaçlı uygulamalardan korumak için sistem güvenliğini artıran değişiklikler içerir.
Kısıtlanmış TLS sürümleri
Android 15 restricts the usage of TLS versions 1.0 and 1.1. These versions had previously been deprecated in Android, but are now disallowed for apps targeting Android 15.
Güvenli arka plan etkinliği başlatma
Android 15 protects users from malicious apps and gives them more control over their devices by adding changes that prevent malicious background apps from bringing other apps to the foreground, elevating their privileges, and abusing user interaction. Background activity launches have been restricted since Android 10 (API level 29).
Other changes
In addition to the restriction for UID matching, these other changes are also included:
- Change
PendingIntent
creators to block background activity launches by default. This helps prevent apps from accidentally creating aPendingIntent
that could be abused by malicious actors. - Don't bring an app to the foreground unless the
PendingIntent
sender allows it. This change aims to prevent malicious apps from abusing the ability to start activities in the background. By default, apps are not allowed to bring the task stack to the foreground unless the creator allows background activity launch privileges or the sender has background activity launch privileges. - Control how the top activity of a task stack can finish its task. If the top activity finishes a task, Android will go back to whichever task was last active. Moreover, if a non-top activity finishes its task, Android will go back to the home screen; it won't block the finish of this non-top activity.
- Prevent launching arbitrary activities from other apps into your own task. This change prevents malicious apps from phishing users by creating activities that appear to be from other apps.
- Block non-visible windows from being considered for background activity launches. This helps prevent malicious apps from abusing background activity launches to display unwanted or malicious content to users.
Daha güvenli amaçlar
Android 15, intent'leri daha güvenli ve daha güçlü hale getirmek için yeni isteğe bağlı güvenlik önlemleri sunar. Bu değişiklikler, olası güvenlik açıklarını önlemeyi amaçlar ve kötü amaçlı uygulamalar tarafından istismar edilebilecek amaçların kötüye kullanımı. Android 15'te intent'lerin güvenliğiyle ilgili iki önemli iyileştirme yapılmıştır:
- Hedef intent filtreleriyle eşleşme: Belirli bileşenleri hedefleyen intent'ler, hedefin intent filtresi spesifikasyonlarıyla tam olarak eşleşmelidir. Başka bir uygulamanın etkinliğini başlatmak için intent gönderirseniz hedef intent bileşeninin, alıcı etkinliğin beyan edilen intent filtreleriyle uyumlu olması gerekir.
- Niyetlerin işlemleri olmalıdır: İşlem içermeyen amaçlar artık eşleşmeyecek inceleyebilirsiniz. Bu, amaçların etkinlik başlatmak veya hizmetlerin açıkça tanımlanmış bir işlevi olmalıdır.
Uygulamanızın bu değişikliklere nasıl tepki verdiğini kontrol etmek için
Uygulamanızda StrictMode
. Ayrıntılı
Intent
kullanım ihlali hakkında günlükler almak için aşağıdaki yöntemi ekleyin:
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 kullanıcı arayüzü
Android 15, daha tutarlı ve sezgisel bir kullanıcı deneyimi oluşturmayı amaçlayan bazı değişiklikler içerir.
Pencere yerleştirme değişiklikleri
Android 15'te pencere içe eklemeleriyle ilgili iki değişiklik vardır: Kenardan kenara ekranlar varsayılan olarak zorunlu kılınmıştır. Ayrıca sistem çubuklarının varsayılan yapılandırması gibi yapılandırma değişiklikleri de vardır.
Edge-to-edge enforcement
Android 15'i (API düzeyi 35) hedefleyen uygulamalar, Android 15 çalıştıran cihazlarda varsayılan olarak uçtan uca görünür.

Bu, uygulamanızın kullanıcı arayüzünü olumsuz etkileyebilecek bir değişikliktir. Değişiklikler aşağıdaki kullanıcı arayüzü alanlarını etkiler:
- Hareketle gezinme çubuğu
- Varsayılan olarak şeffaftır.
- Alt dengeleme devre dışı bırakıldığından, ekler uygulanmadığı sürece içerik sistem gezinme çubuğunun arkasında çizilir.
setNavigationBarColor
veR.attr#navigationBarColor
kullanımdan kaldırıldı ve hareketle gezinmeyi etkilemiyor.setNavigationBarContrastEnforced
veR.attr#navigationBarContrastEnforced
, hareketle navigasyon üzerinde etkili olmamaya devam eder.
- 3 düğmeli gezinme
- Varsayılan olarak% 80 opaklık ayarlanır ve renk, pencere arka planıyla eşleşebilir.
- İç boşluklar uygulanmadığı sürece içerik, sistem gezinme çubuğunun arkasında çizileceğinden alt dengeleme devre dışı bırakılır.
setNavigationBarColor
veR.attr#navigationBarColor
, varsayılan olarak pencere arka planıyla eşleşecek şekilde ayarlanır. Bu varsayılanın uygulanabilmesi için pencere arka planının renkli bir drawable 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 doğrudur. Bu, 3 düğmeli gezinme moduna% 80 opaklıkta bir arka plan ekler.
- Durum çubuğu
- Varsayılan olarak şeffaftır.
- Üst dengeleme devre dışı olduğundan, yerleşimler uygulanmadığı sürece içerik durum çubuğunun arkasında çizilir.
setStatusBarColor
veR.attr#statusBarColor
kullanımdan kaldırıldı ve Android 15'te herhangi bir etkisi yok.setStatusBarContrastEnforced
veR.attr#statusBarContrastEnforced
kullanımdan kaldırıldı ancak Android 15'te hâlâ etkili.
- Ekran kesimi
- Sabit olmayan pencerelerin
layoutInDisplayCutoutMode
değeriLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
olmalıdır.SHORT_EDGES
,NEVER
veDEFAULT
,ALWAYS
olarak yorumlanır. Böylece kullanıcılar, ekran kesiminden kaynaklanan siyah çubuğu görmez ve ekran uçtan uca görünür.
- Sabit olmayan pencerelerin
Aşağıdaki örnekte, bir uygulamanın Android 15'i (API düzeyi 35) hedeflemeden önce ve sonraki hali ile ekler uygulanmadan önce ve sonraki hali gösterilmektedir. Bu örnek kapsamlı değildir ve Android Auto'da farklı görünebilir.



Uygulamanız zaten uçtan uca ise kontrol etmeniz gerekenler
Uygulamanız zaten uçtan uca ise ve yerleştirme uyguluyorsa aşağıdaki senaryolar dışında bu değişiklikten büyük ölçüde etkilenmezsiniz. Ancak etkilenmediğinizi düşünüyorsanız bile uygulamanızı test etmenizi öneririz.
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
yerineSHORT_EDGES
,NEVER
veyaDEFAULT
kullananActivity
gibi kaymayan bir pencereniz var. Uygulamanız başlatılırken kilitleniyorsa bunun nedeni açılış ekranınız olabilir. core splashscreen 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.- Kullanıcı arayüzünün kapalı olduğu ve daha az trafik alan ekranlar olabilir. Daha az ziyaret edilen bu ekranlarda kullanıcı arayüzünün kapalı olmadığını doğrulayın. Daha az trafik alan ekranlar şunlardır:
- İlk katılım veya oturum açma ekranları
- Ayarlar sayfaları
Uygulamanız henüz uçtan uca değilse kontrol etmeniz gerekenler
Uygulamanız henüz uçtan uca değilse bu durumdan etkilenmeniz olasıdır. Uçtan uca olan uygulamalarla ilgili senaryolara ek olarak aşağıdakileri de göz önünde bulundurmanız gerekir:
- Uygulamanızda
TopAppBar
,BottomAppBar
veNavigationBar
gibi Compose'da Material 3 bileşenleri (androidx.compose.material3
) kullanılıyorsa bu bileşenler, yerleştirmeleri otomatik olarak işlediğinden etkilenmez. - Uygulamanızda Compose'da Material 2 bileşenleri (
androidx.compose.material
) kullanılıyorsa bu bileşenler iç kısımları otomatik olarak işlemez. Ancak, ek yerlerine erişebilir ve bunları manuel olarak uygulayabilirsiniz. androidx.compose.material 1.6.0 ve sonraki sürümlerde,windowInsets
parametresini kullanarakBottomAppBar
,TopAppBar
,BottomNavigation
veNavigationRail
için dolguları manuel olarak uygulayın. Aynı şekilde,Scaffold
içincontentWindowInsets
parametresini kullanın. - Uygulamanızda görünümler ve Material Components kullanılıyorsa
(
com.google.android.material
),BottomNavigationView
,BottomAppBar
,NavigationRailView
veyaNavigationView
gibi görünümlere dayalı Material Components'ın çoğu, iç kısımları işler ve ek çalışma gerektirmez. AncakAppBarLayout
kullanıyorsanızandroid:fitsSystemWindows="true"
eklemeniz gerekir. - Özel composable'lar için dolgu olarak manuel olarak yerleştirme uygulayın. İçeriğiniz
Scaffold
içindeyseScaffold
dolgu değerlerini kullanarak iç kısımları kullanabilirsiniz. Aksi takdirde,WindowInsets
kullanarak dolgu uygulayın. - Uygulamanızda görünümler ve
BottomSheet
,SideSheet
veya özel kapsayıcılar kullanılıyorsaViewCompat.setOnApplyWindowInsetsListener
kullanarak dolgu uygulayın.RecyclerView
için bu dinleyiciyi kullanarak dolgu uygulayın veclipToPadding="false"
öğesini de ekleyin.
Uygulamanızın özel arka plan koruması sunması gerekiyorsa kontrol etmeniz gerekenler
Uygulamanız 3 düğmeli gezinme veya durum çubuğu için özel arka plan koruması sunmalıdır. Uygulamanız, 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.
Ek uçtan uca kaynaklar
İç kısımları uygulama ile ilgili ek bilgiler için Edge to Edge Views (Uçtan Uca Görünümler) ve Edge to Edge Compose (Uçtan Uca Oluşturma) kılavuzlarına bakın.
Kullanımdan kaldırılan API'ler
Aşağıdaki API'lerin desteği sonlandırıldı ancak devre dışı bırakılmadı:
R.attr#enforceStatusBarContrast
R.attr#navigationBarColor
(3 düğmeli gezinme için, %80 alfa ile)Window#isStatusBarContrastEnforced
Window#setNavigationBarColor
(3 düğmeli gezinme için, %80 alfa ile)Window#setStatusBarContrastEnforced
Aşağıdaki API'lerin desteği sonlandırıldı ve bu API'ler devre dışı bırakıldı:
R.attr#navigationBarColor
(hareketle gezinme için)R.attr#navigationBarDividerColor
R.attr#statusBarColor
Window#setDecorFitsSystemWindows
Window#getNavigationBarColor
Window#getNavigationBarDividerColor
Window#getStatusBarColor
Window#setNavigationBarColor
(hareketle gezinme için)Window#setNavigationBarDividerColor
Window#setStatusBarColor
Stable configuration
If your app targets Android 15 (API level 35) or higher, Configuration
no
longer excludes the system bars. If you use the screen size in the
Configuration
class for layout calculation, you should replace it with better
alternatives like an appropriate ViewGroup
, WindowInsets
, or
WindowMetricsCalculator
depending on your need.
Configuration
has been available since API 1. It is typically obtained from
Activity.onConfigurationChanged
. It provides information like window density,
orientation, and sizes. One important characteristic about the window sizes
returned from Configuration
is that it previously excluded the system bars.
The configuration size is typically used for resource selection, such as
/res/layout-h500dp
, and this is still a valid use case. However, using it for
layout calculation has always been discouraged. If you do so, you should move
away from it now. You should replace the use of Configuration
with something
more suitable depending on your use case.
If you use it to calculate the layout, use an appropriate ViewGroup
, such as
CoordinatorLayout
or ConstraintLayout
. If you use it to determine the height
of the system navbar, use WindowInsets
. If you want to know the current size
of your app window, use computeCurrentWindowMetrics
.
The following list describes the fields affected by this change:
Configuration.screenWidthDp
andscreenHeightDp
sizes no longer exclude the system bars.Configuration.smallestScreenWidthDp
is indirectly affected by changes toscreenWidthDp
andscreenHeightDp
.Configuration.orientation
is indirectly affected by changes toscreenWidthDp
andscreenHeightDp
on close-to-square devices.Display.getSize(Point)
is indirectly affected by the changes inConfiguration
. This was deprecated beginning in API level 30.Display.getMetrics()
has already worked like this since API level 33.
elegantTextHeight özelliği varsayılan olarak true değerini alır
For apps targeting Android 15 (API level 35), the
elegantTextHeight
TextView
attribute
becomes true
by default, replacing the compact font used by default with some
scripts that have large vertical metrics with one that is much more readable.
The compact font was introduced to prevent breaking layouts; Android 13 (API
level 33) prevents many of these breakages by allowing the text layout to
stretch the vertical height utilizing the fallbackLineSpacing
attribute.
In Android 15, the compact font still remains in the system, so your app can set
elegantTextHeight
to false
to get the same behavior as before, but it is
unlikely to be supported in upcoming releases. So, if your app supports the
following scripts: Arabic, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam,
Odia, Telugu or Thai, test your app by setting elegantTextHeight
to true
.

elegantTextHeight
behavior for apps targeting Android 14 (API level 34) and lower.
elegantTextHeight
behavior for apps targeting Android 15.TextView genişliği, karmaşık harf şekilleri için değişiyor
Android'in önceki sürümlerinde, karmaşık şekillendirmeye sahip bazı el yazısı yazı tipleri veya diller, harfleri önceki veya sonraki karakterin alanında çizebilir.
Bazı durumlarda bu tür harfler başlangıç veya bitiş konumunda kesilmiştir.
Android 15'ten itibaren TextView
, bu tür harflerin çizilmesi için yeterli alan ayıran bir genişlik atar ve uygulamaların kırpmayı önlemek için sola ek dolgu istemesine olanak tanır.
Bu değişiklik, TextView
öğesinin genişliği belirleme şeklini etkilediği için uygulama Android 15 (API düzeyi 35) veya sonraki sürümleri hedefliyorsa TextView
varsayılan olarak daha fazla genişlik ayırır. Bu davranışı TextView
üzerinde setUseBoundsForWidth
API'yi çağırarak etkinleştirebilir veya devre dışı bırakabilirsiniz.
Sol dolgu eklemek mevcut düzenlerde hizalama sorunlarına neden olabileceğinden, Android 15 veya sonraki sürümleri hedefleyen uygulamalarda bile dolgu varsayılan olarak eklenmez.
Ancak setShiftDrawingOffsetForStartOverhang
işlevini çağırarak kırpmayı önlemek için ek dolgu ekleyebilirsiniz.
Aşağıdaki örneklerde, bu değişikliklerin bazı yazı tipleri ve diller için metin düzenini nasıl iyileştirebileceği gösterilmektedir.

<TextView android:fontFamily="cursive" android:text="java" />

<TextView android:fontFamily="cursive" android:text="java" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />

<TextView android:text="คอมพิวเตอร์" />

<TextView android:text="คอมพิวเตอร์" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />
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ğine uyacak şekilde uzatıyordu. Örneğin, içerik Japonca ise Japonca yazı tipinin satır yüksekliği Latin alfabesindeki yazı tipinin satır yüksekliğinden biraz daha yüksek olduğundan metnin yüksekliği de biraz daha yüksek olur. Ancak satır yüksekliklerindeki bu farklılıklara rağmen EditText
öğesi, aşağıdaki resimde gösterildiği gibi kullanılan yerel ayardan bağımsız olarak tek tip bir boyuta sahipti:

EditText
öğelerini temsil eden üç kutu. Bu diller birbirinden farklı satır yüksekliklerine sahip olsa da EditText
'ün yüksekliği aynıdır.Android 15'i (API düzeyi 35) hedefleyen uygulamalarda, EditText
için minimum satır yüksekliği artık aşağıdaki resimde gösterildiği gibi belirtilen yerel dilin referans yazı tipiyle eşleşecek şekilde ayrılmıştır:

EditText
öğelerini temsil eden üç kutu. EditText
öğesinin yüksekliği artık bu dillerin yazı tiplerinin varsayılan satır yüksekliğini barındıracak şekilde boşluk içeriyor.Gerekirse uygulamanız, useLocalePreferredLineHeightForMinimum
özelliğini false
olarak belirterek önceki davranışı geri yükleyebilir ve Kotlin ile Java'da setMinimumFontMetrics
API'sini kullanarak özel minimum dikey metrikler ayarlayabilir.
Kamera ve medya içerikleri
Android 15, Android 15 veya sonraki sürümleri hedefleyen uygulamalarda kamera ve medya davranışıyla ilgili aşağıdaki değişiklikleri yapar.
Ses odağı isteğinde bulunmayla ilgili kısıtlamalar
Apps that target Android 15 (API level 35) must be the top app or running a
foreground service in order to request audio focus. If an app
attempts to request focus when it does not meet one of these requirements, the
call returns AUDIOFOCUS_REQUEST_FAILED
.
You can learn more about audio focus at Manage audio focus.
SDK olmayan arayüzlerle ilgili güncellenen kısıtlamalar
Android 15, Android geliştiricilerle işbirliği ve en son dahili testlere dayalı olarak 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şikliklerin bazıları sizi hemen etkilemeyebilir. Ancak uygulamanızın hedef API düzeyine bağlı olarak bazı SDK dışı arayüzlere erişmesi mümkün olsa da herhangi bir SDK dışı yöntem veya alan kullanmak her zaman uygulamanızın bozulma riskini artırır.
Uygulamanızın SDK dışı arayüzler kullanıp kullanmadığından emin değilseniz öğrenmek için uygulamanızı test edebilirsiniz. Uygulamanız SDK dışı arayüzleri kullanıyorsa SDK alternatiflerine geçişi planlamaya başlamanız gerekir. Bununla birlikte, bazı uygulamaların SDK dışı arayüzleri kullanmak için geçerli kullanım alanları olduğunu anlıyoruz. Uygulamanızdaki bir özellik için SDK olmayan bir arayüz kullanmaya alternatif bir çözüm 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'teki SDK dışı arayüz kısıtlamalarında yapılan güncellemeler başlıklı makaleyi inceleyin. Genel olarak SDK olmayan arayüzler hakkında daha fazla bilgi edinmek için SDK olmayan arayüzlerde kısıtlamalar başlıklı makaleyi inceleyin.