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 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
Android 15 ile ön plan hizmetlerinde aşağıdaki değişiklikleri yapıyoruz.
- Veri senkronizasyonu ön plan hizmeti zaman aşımı davranışı
- Yeni medya işleme ön plan hizmet türü
- Ön plan hizmetleri başlatan
BOOT_COMPLETEDyayın alıcılarıyla ilgili kısıtlamalar - Bir uygulama
SYSTEM_ALERT_WINDOWiznine sahipken ön plan hizmetlerini başlatmayla ilgili kısıtlamalar
Veri senkronizasyonu ön plan hizmeti zaman aşımı davranışı
对于以 Android 15(API 级别 35)或更高版本为目标平台的应用,Android 15 为 dataSync 引入了新的超时行为。此行为也适用于新的 mediaProcessing 前台服务类型。
系统允许应用的 dataSync 服务在 24 小时内总共运行 6 小时,之后系统会调用正在运行的服务的 Service.onTimeout(int, int) 方法(在 Android 15 中引入)。此时,该服务有几秒钟时间来调用 Service.stopSelf()。调用 Service.onTimeout() 后,该服务将不再被视为前台服务。如果服务未调用 Service.stopSelf(),系统会抛出内部异常。系统会在 Logcat 中记录此异常,并显示以下消息:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type dataSync did not stop within its timeout: [component name]"
为避免因行为变更而导致问题,您可以执行以下一项或多项操作:
- 让您的服务实现新的
Service.onTimeout(int, int)方法。当您的应用收到回调时,请务必在几秒钟内调用stopSelf()。(如果您不立即停止应用,系统会生成故障。) - 确保应用的
dataSync服务在任何 24 小时内总运行时间不超过 6 小时(除非用户与应用互动,重置计时器)。 - 仅通过直接的用户互动来启动
dataSync前台服务;由于您的应用在服务启动时位于前台,因此服务会在应用进入后台后的 6 小时内完整运行。 - 请改用替代 API,而不是使用
dataSync前台服务。
如果您的应用的 dataSync 前台服务在过去 24 小时内运行了 6 小时,则您无法启动其他 dataSync 前台服务,除非用户已将您的应用切换到前台(这会重置计时器)。如果您尝试启动其他 dataSync 前台服务,系统会抛出 ForegroundServiceStartNotAllowedException,并显示类似“前台服务类型 dataSync 的时间限制已用尽”的错误消息。
测试
如需测试应用的行为,您可以启用数据同步超时功能,即使应用未以 Android 15 为目标平台也是如此(前提是应用在 Android 15 设备上运行)。如需启用超时,请运行以下 adb 命令:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
您还可以调整超时期限,更轻松地测试应用在达到此限制时的行为。如需设置新的超时期限,请运行以下 adb 命令:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
Yeni medya işleme ön plan hizmeti türü
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
Ön plan hizmeti başlatan BOOT_COMPLETED yayın alıcılarıyla ilgili kısıtlamalar
在启动 BOOT_COMPLETED 广播接收器方面存在新限制
前台服务。BOOT_COMPLETED 接收器不能启动
以下类型的前台服务:
dataSynccameramediaPlaybackphoneCallmediaProjectionmicrophone(自 Android 14 起,microphone就受到此限制)
如果 BOOT_COMPLETED 接收器尝试启动任何上述类型的前台
服务,系统会抛出 ForegroundServiceStartNotAllowedException。
测试
如需测试应用的行为,您可以启用这些新限制,即使您的应用并未以 Android 15 为目标平台(只要应用在 Android 15 设备上运行)也是如此。运行以下 adb 命令:
adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name
如需在不重启设备的情况下发送 BOOT_COMPLETED 广播,请运行以下 adb 命令:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED your-package-name
Bir uygulama SYSTEM_ALERT_WINDOW iznine sahipken ön plan hizmetlerini başlatmayla ilgili kısıtlamalar
以前,如果应用拥有 SYSTEM_ALERT_WINDOW 权限,即使应用当前在后台运行,也可以启动前台服务(如免于后台启动限制中所述)。
如果应用以 Android 15 为目标平台,则此豁免范围现在更窄。现在,应用需要具有 SYSTEM_ALERT_WINDOW 权限,并且还需要有一个可见的叠加窗口。也就是说,应用需要先启动 TYPE_APPLICATION_OVERLAY 窗口,并且该窗口需要处于可见状态,然后您才能启动前台服务。
如果您的应用尝试从后台启动前台服务,但不符合这些新要求(并且没有其他豁免情况),系统会抛出 ForegroundServiceStartNotAllowedException。
如果您的应用声明了 SYSTEM_ALERT_WINDOW 权限并从后台启动前台服务,则可能会受到此变更的影响。如果您的应用获得了 ForegroundServiceStartNotAllowedException,请检查应用的操作顺序,并确保应用在尝试从后台启动前台服务之前已具有有效的叠加层窗口。您可以通过调用 View.getWindowVisibility() 检查叠加层窗口当前是否可见,也可以替换 View.onWindowVisibilityChanged(),以便在可见性发生变化时收到通知。
测试
如需测试应用的行为,您可以启用这些新限制,即使您的应用并未以 Android 15 为目标平台(只要应用在 Android 15 设备上运行)也是如此。如需针对从后台启动前台服务启用这些新限制,请运行以下 adb 命令:
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 级别 35)及更高版本为目标平台的应用无法再更改设备上的勿扰 (DND) 功能的全局状态或政策(无论是通过修改用户设置还是关闭勿扰模式)。相反,应用必须提供 AutomaticZenRule,系统会将其与现有的“最严格的政策优先”方案合并为一个全局政策。对之前会影响全局状态的现有 API 的调用(setInterruptionFilter、setNotificationPolicy)会导致创建或更新隐式 AutomaticZenRule,该 AutomaticZenRule 会根据这些 API 调用的调用周期开启和关闭。
请注意,只有当应用调用 setInterruptionFilter(INTERRUPTION_FILTER_ALL) 并希望该调用停用之前由其所有者激活的 AutomaticZenRule 时,此更改才会影响可观察到的行为。
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 = 0Bu durumda, biçim dizesinde 1 bağımsız değişken dizini (
%1biç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) olarak belirlenir. Bu nedenle, aşağıdaki kodClassCastExceptionhatası veriyor:String[] elements = (String[]) Arrays.asList("one", "two").toArray();Bu durumda, sonuçtaki dizide bileşen türü olarak
Stringdeğ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:
LocaleAPI'si kullanılırken İbranice, Yidiş ve Endonezce dil kodları artık eski biçimlerine (İbranice:iw, Yidiş:jive Endonezce:in) dönüştürülmüyor. Bu yerel ayarlardan birinin dil kodunu belirtirken ISO 639-1'deki kodları (İbranice:he, Yidiş:yive 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 sürümünü Android 15 (API düzeyi 35) kullanacak şekilde güncelledikten sonra uygulamanızın uyumluluğunu etkileyebilir:
MutableList.removeFirst()vekotlin-stdlib'dekiMutableList.removeLast()uzantı işlevleriyle çakışmaJava'daki
Listtürü, Kotlin'dekiMutableListtü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, yeniListAPI'lerine statik olarak çözümler.Bir uygulama,
compileSdkdeğeri35,minSdkdeğeri ise34veya daha düşük olacak şekilde yeniden derlenir ve ardından Android 14 ya da daha eski bir sürümde ç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
NewApilint seçeneği bu yeni API kullanımlarını yakalayabilir../gradlew lintMainActivity.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,
ListveDeque. 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ı durumundajavacderleyicisi, derleme zamanı hatası verir. Örneğin:1. örnek hata:
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 List2. örnek hata:
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 error3. örnek hata:
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 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 限制了对 TLS 版本 1.0 和 1.1 的使用。这些版本之前已在 Android 中被弃用,但现在不允许面向 Android 15 的应用使用。
Güvenli arka plan etkinliği başlatma
Android 15 做出了一些变更,可防止恶意后台应用将其他应用置于前台、提升自身权限并滥用用户互动,从而保护用户免受恶意应用的侵害,并让用户更好地控制自己的设备。自 Android 10(API 级别 29)起,后台 activity 启动受到限制。
其他更改
- 将
PendingIntent创建者更改为默认阻止后台活动启动。这有助于防止应用意外创建可能被恶意行为者滥用的PendingIntent。 - 除非
PendingIntent发送方允许,否则请勿将应用转至前台。此变更旨在防止恶意应用滥用在后台启动 activity 的功能。默认情况下,除非创建者允许后台 activity 启动权限或发送者具有后台 activity 启动权限,否则不允许应用将任务堆栈带到前台。 - 控制任务堆栈的顶层 activity 如何完成其任务。如果顶部 activity 完成了一项任务,Android 将返回到上次处于活跃状态的任务。此外,如果非顶部 activity 完成其任务,Android 会返回到主屏幕;它不会阻止此非顶部 activity 完成。
- 防止从其他应用启动任意 activity 进入您自己的任务。此变更可防止恶意应用通过创建看似来自其他应用的 activity 来对用户进行钓鱼式攻击。
- 阻止将非可见窗口纳入后台 activity 启动的考虑范围。这有助于防止恶意应用滥用后台活动启动来向用户显示不必要或恶意的内容。
Daha güvenli amaçlar
Android 15 针对 intent 引入了 StrictMode。
如需查看有关 Intent 使用违规行为的详细日志,请使用以下方法:
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
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.
Uçtan uca yaptırım
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, ekler uygulanmadığı sürece içerik sistem gezinme çubuğunun arkasında çizilir.
setNavigationBarColorveR.attr#navigationBarColorişlevlerinin desteği sonlandırıldı ve bu işlevler hareketle gezinmeyi etkilemiyor.setNavigationBarContrastEnforcedveR.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.
setNavigationBarColorveR.attr#navigationBarColor, varsayılan olarak pencere arka planıyla eşleşecek şekilde ayarlanır. Bu varsayılanın uygulanması 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.setNavigationBarContrastEnforcedveR.attr#navigationBarContrastEnforcedvarsayılan olarak doğrudur. Bu, 3 düğmeli gezinmede% 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ıldı ancak Android 15'te hâlâ etkili.
- 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, 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 etmeniz gerekenler
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, 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 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,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, iç kısımları 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,WindowInsetskullanarak 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
İç kenarlıkları uygulama konusunda ek bilgiler için Kenardan Kenara Görünümler ve Kenardan Kenara 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#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
Kararlı yapılandırma
如果您的应用以 Android 15(API 级别 35)或更高版本为目标平台,Configuration 不再排除系统栏。如果您在 Configuration 类中使用屏幕尺寸进行布局计算,则应根据需要将其替换为更好的替代方案,例如适当的 ViewGroup、WindowInsets 或 WindowMetricsCalculator。
Configuration 自 API 1 起便已开始提供。通常从 Activity.onConfigurationChanged 获取。它提供窗口密度、方向和大小等信息。从 Configuration 返回的窗口大小的一个重要特征是,它之前不包括系统栏。
配置大小通常用于资源选择(例如 /res/layout-h500dp),这仍然是一个有效的使用情形。不过,我们一直不建议使用它进行布局计算。如果您正在这样做,请立即远离该设备。您应根据自己的使用场景,将 Configuration 的使用替换为更合适的用法。
如果您使用它来计算布局,请使用适当的 ViewGroup,例如 CoordinatorLayout 或 ConstraintLayout。如果您使用它来确定系统导航栏的高度,请使用 WindowInsets。如果您想知道应用窗口的当前大小,请使用 computeCurrentWindowMetrics。
以下列表介绍了受此变更影响的字段:
Configuration.screenWidthDp和screenHeightDp尺寸不再排除系统栏。Configuration.smallestScreenWidthDp会受到screenWidthDp和screenHeightDp更改的间接影响。Configuration.orientation会受到近乎正方形的设备上screenWidthDp和screenHeightDp更改的间接影响。Display.getSize(Point)受到Configuration中的更改间接影响。此方法已从 API 级别 30 开始弃用。- 自 API 级别 33 以来,
Display.getMetrics()一直以这种方式运行。
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 中,文本布局会拉伸文本的高度,以满足与当前语言区域匹配的字体的行高。例如,如果内容是日语,由于日语字体的行高略高于拉丁字体,因此文本的高度会略高。不过,尽管行高存在这些差异,但无论使用的是哪种语言区域,EditText 元素的大小都是统一的,如下图所示:
EditText 元素。EditText 的高度相同,即使这些语言的行高各不相同。对于以 Android 15(API 级别 35)为目标平台的应用,现在为 EditText 预留了最小行高,以匹配指定语言区域的参考字体,如下图所示:
EditText 元素。EditText 的高度现在包含足够的空间来容纳这些语言字体的默认行高。如有需要,您的应用可以将 useLocalePreferredLineHeightForMinimum 属性指定为 false,以恢复之前的行为;您的应用还可以在 Kotlin 和 Java 中使用 setMinimumFontMetrics API 设置自定义最小垂直指标。
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
Android 15'i (API düzeyi 35) hedefleyen uygulamaların ses odağını istemesi için en üstteki uygulama olması veya ön planda bir hizmetin çalışıyor olması gerekir. Bir uygulama bu koşullardan birini karşılamıyorken odaklanma isteğinde bulunursa çağrı AUDIOFOCUS_REQUEST_FAILED döndürülür.
Ses odak noktası hakkında daha fazla bilgiyi Ses odak noktasını yönetme başlıklı makalede bulabilirsiniz.
SDK olmayan arayüzlerle ilgili güncellenen kısıtlamalar
Android 15, Android geliştiricileriyle 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 uygulamanızın bozulma riskini her zaman yüksek oranda 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şlamalısınız. 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 版本中的变更,请参阅 Android 15 中有关限制非 SDK 接口的更新。如需全面了解有关非 SDK 接口的详细信息,请参阅对非 SDK 接口的限制。