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 durumlarda bu davranışları düzgün şekilde destekleyecek şekilde değiştirmeniz gerekir.
Uygulamanızın targetSdkVersion değerinden bağımsız olarak Android 15'te çalışan tüm uygulamaları etkileyen davranış değişiklikleri listesini de inceleyin.
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_COMPLETEDbroadcast receivers launching foreground services - Restrictions on starting foreground services while an app holds the
SYSTEM_ALERT_WINDOWpermission
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
dataSynchizmetlerinin, 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
mediaProcessinghizmetlerinin 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
There are new restrictions on BOOT_COMPLETED broadcast receivers launching
foreground services. BOOT_COMPLETED receivers are not allowed to launch the
following types of foreground services:
dataSynccameramediaPlaybackphoneCallmediaProjectionmicrophone(this restriction has been in place formicrophonesince Android 14)
If a BOOT_COMPLETED receiver tries to launch any of those types of foreground
services, the system throws ForegroundServiceStartNotAllowedException.
Testing
To test your app's behavior, you can enable these new restrictions even if your
app is not targeting Android 15 (as long as the app is running on an Android 15
device). Run the following adb command:
adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name
To send a BOOT_COMPLETED broadcast without restarting the device,
run the following adb command:
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
Previously, if an app held the SYSTEM_ALERT_WINDOW permission, it could launch
a foreground service even if the app was currently in the background (as
discussed in exemptions from background start restrictions).
If an app targets Android 15, this exemption is now narrower. The app now needs
to have the SYSTEM_ALERT_WINDOW permission and also have a visible overlay
window. That is, the app needs to first launch a
TYPE_APPLICATION_OVERLAY window and the window
needs to be visible before you start a foreground service.
If your app attempts to start a foreground service from the background without
meeting these new requirements (and it does not have some other exemption), the
system throws ForegroundServiceStartNotAllowedException.
If your app declares the SYSTEM_ALERT_WINDOW permission
and launches foreground services from the background, it may be affected by this
change. If your app gets a ForegroundServiceStartNotAllowedException, check
your app's order of operations and make sure your app already has an active
overlay window before it attempts to start a foreground service from the
background. You can check if your overlay window is currently visible
by calling View.getWindowVisibility(), or you
can override View.onWindowVisibilityChanged()
to get notified whenever the visibility changes.
Testing
To test your app's behavior, you can enable these new restrictions even if your
app is not targeting Android 15 (as long as the app is running on an Android 15
device). To enable these new restrictions on starting foreground services
from the background, run the following adb command:
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
Apps that target Android 15 (API level 35) and higher can no longer change the
global state or policy of Do Not Disturb (DND) on a device (either by modifying
user settings, or turning off DND mode). Instead, apps must contribute an
AutomaticZenRule, which the system combines into a global policy with the
existing most-restrictive-policy-wins scheme. Calls to existing APIs that
previously affected global state (setInterruptionFilter,
setNotificationPolicy) result in the creation or update of an implicit
AutomaticZenRule, which is toggled on and off depending on the call-cycle of
those API calls.
Note that this change only affects observable behavior if the app is calling
setInterruptionFilter(INTERRUPTION_FILTER_ALL) and expects that call to
deactivate an AutomaticZenRule that was previously activated by their owners.
OpenJDK API değişiklikleri
Android 15 continues the work of refreshing Android's core libraries to align with the features in the latest OpenJDK LTS releases.
Some of these changes can affect app compatibility for apps targeting Android 15 (API level 35):
Changes to string formatting APIs: Validation of argument index, flags, width, and precision are now more strict when using the following
String.format()andFormatter.format()APIs:String.format(String, Object[])String.format(Locale, String, Object[])Formatter.format(String, Object[])Formatter.format(Locale, String, Object[])
For example, the following exception is thrown when an argument index of 0 is used (
%0in the format string):IllegalFormatArgumentIndexException: Illegal format argument index = 0In this case, the issue can be fixed by using an argument index of 1 (
%1in the format string).Changes to component type of
Arrays.asList(...).toArray(): When usingArrays.asList(...).toArray(), the component type of the resulting array is now anObject—not the type of the underlying array's elements. So the following code throws aClassCastException:String[] elements = (String[]) Arrays.asList("one", "two").toArray();For this case, to preserve
Stringas the component type in the resulting array, you could useCollection.toArray(Object[])instead:String[] elements = Arrays.asList("two", "one").toArray(new String[0]);Changes to language code handling: When using the
LocaleAPI, language codes for Hebrew, Yiddish, and Indonesian are no longer converted to their obsolete forms (Hebrew:iw, Yiddish:ji, and Indonesian:in). When specifying the language code for one of these locales, use the codes from ISO 639-1 instead (Hebrew:he, Yiddish:yi, and Indonesian:id).Changes to random int sequences: Following the changes made in https://bugs.openjdk.org/browse/JDK-8301574, the following
Random.ints()methods now return a different sequence of numbers than theRandom.nextInt()methods do:Generally, this change shouldn't result in app-breaking behavior, but your code shouldn't expect the sequence generated from
Random.ints()methods to matchRandom.nextInt().
The new SequencedCollection API can affect your app's compatibility
after you update compileSdk in your app's build configuration to use
Android 15 (API level 35):
Collision with
MutableList.removeFirst()andMutableList.removeLast()extension functions inkotlin-stdlibThe
Listtype in Java is mapped to theMutableListtype in Kotlin. Because theList.removeFirst()andList.removeLast()APIs have been introduced in Android 15 (API level 35), the Kotlin compiler resolves function calls, for examplelist.removeFirst(), statically to the newListAPIs instead of to the extension functions inkotlin-stdlib.If an app is re-compiled with
compileSdkset to35andminSdkset to34or lower, and then the app is run on Android 14 and lower, a runtime error is thrown:java.lang.NoSuchMethodError: No virtual method removeFirst()Ljava/lang/Object; in class Ljava/util/ArrayList;The existing
NewApilint option in Android Gradle Plugin can catch these new API usages../gradlew lintMainActivity.kt:41: Error: Call requires API level 35 (current min is 34): java.util.List#removeFirst [NewApi] list.removeFirst()To fix the runtime exception and lint errors, the
removeFirst()andremoveLast()function calls can be replaced withremoveAt(0)andremoveAt(list.lastIndex)respectively in Kotlin. If you're using Android Studio Ladybug | 2024.1.3 or higher, it also provides a quick fix option for these errors.Consider removing
@SuppressLint("NewApi")andlintOptions { disable 'NewApi' }if the lint option has been disabled.Collision with other methods in Java
New methods have been added into the existing types, for example,
ListandDeque. These new methods might not be compatible with the methods with the same name and argument types in other interfaces and classes. In the case of a method signature collision with incompatibility, thejavaccompiler outputs a build-time error. For example:Example error 1:
javac MyList.javaMyList.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 ListExample error 2:
javac MyList.javaMyList.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 errorExample error 3:
javac MyList.javaMyList.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 errorTo fix these build errors, the class implementing these interfaces should override the method with a compatible return type. For example:
@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, TLS 1.0 ve 1.1 sürümlerinin kullanımını kısıtlar. Bu sürümlerin desteği Android'de daha önce sonlandırılmıştı ancak artık Android 15'i hedefleyen uygulamalarda kullanılmasına izin verilmiyor.
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
- Change
PendingIntentcreators to block background activity launches by default. This helps prevent apps from accidentally creating aPendingIntentthat could be abused by malicious actors. - Don't bring an app to the foreground unless the
PendingIntentsender 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, amaçlar için StrictMode özelliğini sunar.
Intent kullanım ihlalleriyle ilgili ayrıntılı günlükleri görmek için aşağıdaki yöntemi kullanın:
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, daha tutarlı ve sezgisel bir kullanıcı deneyimi oluşturmayı amaçlayan bazı değişiklikler içerir.
Pencere yerleştirme değişiklikleri
There are two changes related to window insets in Android 15: edge-to-edge is enforced by default, and there are also configuration changes, such as the default configuration of system bars.
Edge-to-edge enforcement
Uygulama Android 15'i (API düzeyi 35) hedefliyorsa 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. Bu 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, yerleştirmeler uygulanmadığı sürece içerik, sistem gezinme çubuğunun arkasında çizilir.
setNavigationBarColorveR.attr#navigationBarColordesteği sonlandırıldı ve hareketle gezinmeyi etkilemiyor.setNavigationBarContrastEnforcedveR.attr#navigationBarContrastEnforced, hareketle gezinme ü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ıldı.
setNavigationBarColorveR.attr#navigationBarColor, varsayılan olarak pencere arka planıyla eşleşecek şekilde ayarlanır. Bu varsayılan değerin uygulanması için pencere arka planının renkli bir çizilebilir öğe olması gerekir. Bu API kullanımdan kaldırılmıştır ancak 3 düğmeli gezinmeyi etkilemeye devam etmektedir.setNavigationBarContrastEnforcedveR.attr#navigationBarContrastEnforcedvarsayılan olarak doğrudur. Bu seçenek, 3 düğmeli gezinmeye% 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.
setStatusBarColorveR.attr#statusBarColorkullanımdan kaldırıldı ve Android 15'i etkilemiyor.setStatusBarContrastEnforcedveR.attr#statusBarContrastEnforcedkullanımdan kaldırılmıştır ancak Android 15'te hâlâ etkilidir.
- Ekran kesimi
- Sabit olmayan pencerelerin
layoutInDisplayCutoutModedeğeriLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYSolmalıdır.SHORT_EDGES,NEVERveDEFAULT,ALWAYSolarak 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, Android 15'i (API düzeyi 35) hedeflemeden önce ve sonra, ayrıca ekler uygulanmadan önce ve sonraki bir uygulama gösterilmektedir. Bu örnek kapsamlı değildir ve Android Auto'da farklı görünebilir.
Uygulamanız zaten uçtan uca ise kontrol edilecekler
Uygulamanız zaten uçtan uca ise ve iç kısımlar 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_ALWAYSyerineSHORT_EDGES,NEVERveyaDEFAULTkullananActivitygibi 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.alwaysolarak 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. Uygulamaların zaten uçtan uca olduğu senaryolara ek olarak aşağıdakileri de göz önünde bulundurmanız gerekir:
- Uygulamanızda
TopAppBar,BottomAppBarveNavigationBargibi 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, yerleştirmeleri otomatik olarak işlemez. Ancak ek yerlerine erişip bunları manuel olarak uygulayabilirsiniz. androidx.compose.material 1.6.0 ve sonraki sürümlerde,windowInsetsparametresini kullanarakBottomAppBar,TopAppBar,BottomNavigationveNavigationRailiçin dolguları manuel olarak uygulayın. Aynı şekilde,ScaffoldiçincontentWindowInsetsparametresini kullanın. - Uygulamanızda görünümler ve Material Components kullanılıyorsa
(
com.google.android.material),BottomNavigationView,BottomAppBar,NavigationRailViewveyaNavigationViewgibi görünümlere dayalı Material Components'ın çoğu, yerleştirmeleri işler ve ek çalışma gerektirmez. AncakAppBarLayoutkullanıyorsanızandroid:fitsSystemWindows="true"eklemeniz gerekir. - Özel composable'lar için dolgu olarak manuel şekilde yerleştirme uygulayın. İçeriğiniz
ScaffoldiçindeyseScaffolddolgu değerlerini kullanarak iç kısımları kullanabilirsiniz. Aksi takdirde,WindowInsetssimgelerinden birini kullanarak dolgu uygulayın. - Uygulamanızda görünümler ve
BottomSheet,SideSheetveya özel kapsayıcılar kullanılıyorsaViewCompat.setOnApplyWindowInsetsListenerkullanarak dolgu uygulayın.RecyclerViewiç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
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ılmış API'ler
Aşağıdaki API'lerin desteği sonlandırıldı ancak devre dışı bırakılmadı:
R.attr#enforceStatusBarContrastR.attr#navigationBarColor(3 düğmeli gezinme için, %80 alfa ile)Window#isStatusBarContrastEnforcedWindow#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#navigationBarDividerColorR.attr#statusBarColorWindow#setDecorFitsSystemWindowsWindow#getNavigationBarColorWindow#getNavigationBarDividerColorWindow#getStatusBarColorWindow#setNavigationBarColor(hareketle gezinme için)Window#setNavigationBarDividerColorWindow#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.screenWidthDpandscreenHeightDpsizes no longer exclude the system bars.Configuration.smallestScreenWidthDpis indirectly affected by changes toscreenWidthDpandscreenHeightDp.Configuration.orientationis indirectly affected by changes toscreenWidthDpandscreenHeightDpon 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
Android 15'i (API düzeyi 35) hedefleyen uygulamalarda elegantTextHeight TextView özelliği varsayılan olarak true olur. Bu durumda, varsayılan olarak kullanılan kompakt yazı tipi, büyük dikey metriklere sahip bazı komut dosyalarıyla değiştirilir ve çok daha okunaklı bir yazı tipi kullanılır.
Kompakt yazı tipi, düzenlerin bozulmasını önlemek için kullanıma sunulmuştur. Android 13 (API düzeyi 33), metin düzeninin fallbackLineSpacing özelliğini kullanarak dikey yüksekliği uzatmasına izin vererek bu bozulmaların çoğunu önler.
Android 15'te kompakt yazı tipi sistemde hâlâ mevcuttur. Bu nedenle, uygulamanız öncekiyle aynı davranışı elde etmek için elegantTextHeight değerini false olarak ayarlayabilir ancak bu özelliğin gelecekteki sürümlerde desteklenmeyeceği muhtemeldir. Bu nedenle, uygulamanız Arapça, Laosça, Myanmarca, Tamilce, Guceratça, Kannada, Malayalamca, Odiya, Teluguca veya Tayca yazı tiplerini destekliyorsa elegantTextHeight değerini true olarak ayarlayarak uygulamanızı test edin.
elegantTextHeight Android 14 (API düzeyi 34) ve önceki sürümleri hedefleyen uygulamalar için davranış
elegantTextHeight davranışı.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ğiyle 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 kısıtlamalar güncellendi
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üzlere bağlıysa 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 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.