Önceki sürümlerde olduğu gibi Android 15 de uygulamanızı etkileyebilecek davranış değişiklikleri içerir. Aşağıdaki davranış değişiklikleri yalnızca Android 15 veya sonraki sürümleri hedefleyen uygulamalar için geçerlidir. Uygulamanız Android 15 veya sonraki bir sürümü hedefliyorsa uygun olduğu durumlarda uygulamanızı bu davranışları doğru şekilde destekleyecek şekilde değiştirmeniz gerekir.
Uygulamanızdan targetSdkVersion
bağımsız olarak Android 15'te çalışan tüm uygulamaları etkileyen davranış değişikliklerinin listesini de incelemeyi unutmayın.
Temel işlevler
Android 15, Android sisteminin çeşitli temel özelliklerini değiştirir veya genişletir.
Ön plan hizmetlerinde yapılan değişiklikler
Android 15'in ön plan hizmetlerinde aşağıdaki değişiklikleri yapıyoruz.
- Yeni medya işleme ön plan hizmet türü
- Ön plan hizmetlerini başlatan
BOOT_COMPLETED
yayın alıcılarıyla ilgili kısıtlamalar
Veri senkronizasyonu ön plan hizmeti zaman aşımı davranışı
Android 15, uygulama hedefleme için dataSync
ile ilgili yeni bir zaman aşımı davranışı sunuyor
Android 15 veya sonraki sürümler Bu davranış yeni mediaProcessing
için de geçerlidir
ön plan hizmet türünü belirtmelisiniz.
Sistem, uygulamanın dataSync
hizmetlerinin toplam 6 saat boyunca çalışmasına izin verir
Bu süreden sonra sistem, çalışan hizmetin
Service.onTimeout(int, int)
yöntemi (Android'de kullanıma sunuldu)
15). Şu anda hizmeti aramak için birkaç saniye süresi var
Service.stopSelf()
. Service.onTimeout()
çağrıldığında,
hizmeti artık ön plan hizmeti olarak kabul edilmemektedir. Hizmet
çağırılırsa sistem Service.stopSelf()
dahili bir istisna yapar. İlgili içeriği oluşturmak için kullanılan
istisna aşağıdaki mesajla Logcat'e kaydedildi:
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 sorun yaşamamak için aşağıdakilerden birini veya daha fazlasını yapabilirsiniz: takip etmek için:
- Hizmetinizin yeni
Service.onTimeout(int, int)
yöntemini uygulamasını sağlayın. Uygulamanız geri arama aldığında,stopSelf()
içinde birkaç saniye. (Uygulamayı hemen durdurmazsanız, sistem bir hatası.) - Uygulamanızın
dataSync
hizmetlerinin toplamda en fazla çalışır durumda olduğundan emin olun: Herhangi bir 24 saatlik süre içinde 6 saat (kullanıcı uygulamayla etkileşimde bulunmadığı sürece) zamanlayıcıyı sıfırlamanız gerekir). dataSync
ön plan hizmetini yalnızca doğrudan kullanıcı nedeniyle başlat etkileşim; Hizmet başlatıldığında uygulamanız ön planda olduğu için hizmetiniz, uygulama arka plana geçtikten sonra altı saatin tamamını kullanıyor.- Bir
dataSync
ön plan hizmeti kullanmak yerine alternatif API.
Uygulamanızın dataSync
ön plan hizmeti son olarak 6 saat çalıştıysa
24. Kullanıcı olmadığı sürece başka bir dataSync
ön plan hizmeti başlatamazsınız
uygulamanızı ön plana getirmiştir (bu da zamanlayıcıyı sıfırlar). Örneğin
başka bir dataSync
ön plan hizmeti başlatırsa sistem
ForegroundServiceStartNotAllowedException
"Ön plan hizmeti için süre sınırı aşıldı" gibi bir hata mesajı gösterilir
dataSync" yazın.
Test
Uygulamanızın davranışını test etmek için, uygulamanız olsa bile veri senkronizasyonu zaman aşımlarını etkinleştirebilirsiniz
Android 15'i hedeflemiyor (uygulama Android 15 yüklü olduğu sürece)
cihazda) olduğunu varsayalım. 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, zaman aşımı süresini ayarlayarak
uygulama sınıra ulaşıldığında davranır. Yeni bir zaman aşımı süresi ayarlamak için
şu adb
komutu:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
Yeni medya işleme ön plan hizmet türü
Android 15, mediaProcessing
adlı yeni ön plan hizmeti türünü kullanıma sunuyor. Bu hizmet türü, medya dosyalarının kodunu dönüştürme gibi işlemler için uygundur. Örneğin, bir medya uygulaması bir ses dosyasını indirebilir ve çalmadan önce farklı bir biçime dönüştürmesi gerekebilir. Uygulama arka plandayken bile dönüşümün devam ettiğinden emin olmak için mediaProcessing
ön plan hizmetini kullanabilirsiniz.
Sistem, bir uygulamanın mediaProcessing
hizmetlerinin 24 saatlik süre içinde toplam 6 saat boyunca çalışmasına izin verir. Bu sürenin ardından sistem, çalışan hizmetin Service.onTimeout(int, int)
yöntemini (Android 15'te kullanıma sunulmuştur) çağırır. Şu anda hizmetin Service.stopSelf()
hizmetini çağırmak için birkaç saniyesi var. Hizmet Service.stopSelf()
yöntemini çağırmazsa sistem bir dahili istisna uygular. İ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]"
İstisnayla karşılaşmamak için aşağıdakilerden birini yapabilirsiniz:
- Hizmetinizin yeni
Service.onTimeout(int, int)
yöntemini uygulamasını sağlayın. Uygulamanız geri çağırmayı aldığında birkaç saniye içindestopSelf()
yöntemini çağırdığı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. Hizmet başlatıldığında uygulamanız ön planda olduğu için hizmetiniz, uygulama arka plana geçtikten sonra altı saatin tamamını kullanabilir.mediaProcessing
ön plan hizmeti kullanmak yerine WorkManager gibi alternatif bir API kullanın.
Uygulamanızın mediaProcessing
ö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 mediaProcessing
ön plan hizmeti başlatamazsınız (bu durumda zamanlayıcı sıfırlanır). Başka bir mediaProcessing
ön plan hizmeti başlatmaya çalışırsanız sistem, ForegroundServiceStartNotAllowedException
komutunu "Ön plan hizmet türü mediaProcessing için süre sınırı aşıldı" gibi bir hata mesajıyla bildirir.
mediaProcessing
hizmet türü hakkında daha fazla bilgi için Android 15 için ön plan hizmeti türlerinde yapılan değişiklikler: Medya işleme bölümüne bakın.
Test etme
Uygulamanızın davranışını test etmek için, Android 15'i hedeflemese bile (uygulamanız Android 15 cihazda çalıştığı sürece) medya işleme zaman aşımlarını etkinleştirebilirsiniz. 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
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 de 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 hizmetlerini başlatan BOOT_COMPLETED
yayın alıcılarıyla ilgili kısıtlamalar
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
Bir uygulama SYSTEM_ALERT_WINDOW
iznine sahipken ön plan hizmetlerini başlatmayla ilgili kısıtlamalar
Daha önce, SYSTEM_ALERT_WINDOW
iznini kullanan uygulamalar arka planda çalışıyor olsa bile ön plan hizmetini başlatabiliyordu (arka planda başlatma kısıtlamalarından muaf tutmalar bölümünde açıklandığı şekilde).
Bir uygulama Android 15'i hedefliyorsa bu muafiyet artık daha dar olur. Uygulamanın artık hem SYSTEM_ALERT_WINDOW
iznine hem de ayrıca görünür bir yer paylaşımlı pencereye sahip olması gerekir. Yani uygulamanın önce bir TYPE_APPLICATION_OVERLAY
penceresi başlatması ve bir ön plan hizmeti başlatabilmeniz için pencerenin görünür olması gerekir.
Uygulamanız bu yeni gereksinimleri karşılamadan arka plandan bir ön plan hizmeti başlatmaya çalışırsa (ve başka bir muafiyet yoksa) sistem ForegroundServiceStartNotAllowedException
değerini gönderir.
Uygulamanız SYSTEM_ALERT_WINDOW
iznini beyan edip arka plandan ön plan hizmetlerini başlatıyorsa bu değişiklikten etkilenebilir. Uygulamanız bir ForegroundServiceStartNotAllowedException
alırsa arka plandan bir ön plan hizmeti başlatmaya çalışmadan önce uygulamanızın işlem sırasını kontrol edin ve uygulamanızın zaten etkin bir yer paylaşımlı pencereye sahip olduğundan emin olun. View.getWindowVisibility()
yöntemini çağırarak yer paylaşımı penceresinin o anda görünür olup olmadığını kontrol edebilir veya görünürlük değiştiğinde bildirim almak için View.onWindowVisibilityChanged()
özelliğini geçersiz kılabilirsiniz.
Uygulamaların Rahatsız Etmeyin modunun genel durumunu değiştirebileceği zamanla ilgili değişiklikler
Android 15'i hedefleyen uygulamalar artık cihazlarda Rahatsız Etmeyin (DND) özelliğinin genel durumunu veya politikasını değiştiremez (kullanıcı ayarlarını değiştirerek veya Rahatsız Etmeyin modunu kapatarak). Bunun yerine, uygulamalar bir AutomaticZenRule
katkıda bulunmalıdır. Bu da sistem, mevcut en kısıtlayıcı politika kazanç şemasıyla global bir politika haline getirir. Daha önce genel durumu (setInterruptionFilter
, setNotificationPolicy
) etkileyen mevcut API'lere yapılan çağrılar, söz konusu API çağrılarının çağrı döngüsüne bağlı olarak açılıp kapatılan örtülü bir AutomaticZenRule
öğesinin oluşturulması veya güncellenmesiyle sonuçlanır.
Bu değişikliğin yalnızca uygulama setInterruptionFilter(INTERRUPTION_FILTER_ALL)
yöntemini çağırıyorsa ve bu çağrının, sahipleri tarafından önceden etkinleştirilmiş bir AutomaticZenRule
öğesini devre dışı bırakmasını bekliyorsa gözlemlenebilir davranışı etkileyeceğini unutmayın.
OpenJDK API değişiklikleri
Android 15, Android'in temel kitaplıklarını uyumlu hale getirmek için yenileme çalışmalarına devam ediyor. .
Bu değişikliklerden bazıları, uygulama hedefleme için uygulama uyumluluğunu etkileyebilir Android 15 (API düzeyi 35):
Dize biçimlendirme API'lerinde yapılan değişiklikler: Bağımsız değişken dizininin, işaretlerin, ve hassasiyet kurallarını belirlemek için artık daha katı
String.format()
veFormatter.format()
API'leri:String.format(String, Object[])
String.format(Locale, String, Object[])
Formatter.format(String, Object[])
Formatter.format(Locale, String, Object[])
Örneğin, bağımsız değişken dizini 0 olduğunda aşağıdaki istisna atılır kullanılır (biçim dizesinde
%0
):IllegalFormatArgumentIndexException: Illegal format argument index = 0
Bu durumda sorun, 1 bağımsız değişken dizini (
%1
) kullanılarak düzeltilebilir. girin).Arrays.asList(...).toArray()
bileşen türünde yapılan değişiklikler:Arrays.asList(...).toArray()
, elde edilen dizinin bileşen türü artıkObject
olur; temel dizideki öğelerin türü değildir. Dolayısıyla Aşağıdaki kod birClassCastException
hatası verir:String[] elements = (String[]) Arrays.asList("one", "two").toArray();
Bu durumda, sonuçta
String
bileşen türünü korumak için dizisi yerineCollection.toArray(Object[])
kullanabilirsiniz:String[] elements = Arrays.asList("two", "one").toArray(new String[0]);
Dil kodu işlemede yapılan değişiklikler:
Locale
API'yi kullanırken İbranice, Yidiş ve Endonezyaca için dil kodları artık dönüştürülmemektedir (İbranice:iw
, Yidiş:ji
ve Endonezce:in
). Bu yerel ayarlardan biri için dil kodunu belirtirken kodları kullanın Bunun yerine ISO 639-1'den alınır (İbranice:he
, Yidiş:yi
ve Endonezce:id
).Rastgele tam sayı dizilerinde yapılan değişiklikler: https://bugs.openjdk.org/browse/JDK-8301574 adresindeki
Random.ints()
yöntemleri artık şundan farklı bir sayı dizisi döndürüyor:Random.nextInt()
yöntemleri şunları yapar:Genel olarak bu değişiklik, uygulamaları bozan davranışlara yol açmaz ancak kod,
Random.ints()
yöntemlerinden oluşturulan sıralamanınRandom.nextInt()
ile eşleşiyor.
Yeni SequencedCollection
API, uygulamanızın uyumluluğunu etkileyebilir
uygulamanızın derleme yapılandırmasında compileSdk
güncellemesinden sonra
Android 15 (API düzeyi 35):
MutableList.removeFirst()
vekotlin-stdlib
içindekiMutableList.removeLast()
uzantı işlevleriJava'daki
List
türü, Kotlin'deMutableList
türüyle eşlenir. ÇünküList.removeFirst()
veList.removeLast()
API'leri Kotlin derleyicisi olan Android 15 (API düzeyi 35) sürümünde kullanıma sunulmuştur. işlev çağrılarını (örneğin,list.removeFirst()
) statik olarak yerine yeniList
API'lerini kullanabilirsiniz.kotlin-stdlib
.Bir uygulama
compileSdk
ile yeniden derlenirse35
olarak veminSdk
olarak ayarlanırsa34
veya daha eski bir sürüme sahipseniz ve uygulama, Android 14 ve önceki sürümlerde çalıştırıldığından 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 bunları yakalayabilir yeni API kullanımları../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ısıremoveAt(0)
ve Kotlin'de sırasıylaremoveAt(list.lastIndex)
. Şunu kullanıyorsanız: Android Studio Uğur Böceği | 2024.1.3 veya daha yeni sürümler varsa hızlı bir çözüm sunar. seçeneğini kullanabilirsiniz.Hata analizi seçeneği devre dışı bırakıldıysa
@SuppressLint("NewApi")
velintOptions { disable 'NewApi' }
öğelerini kaldırmayı düşünebilirsiniz.Java'daki diğer yöntemlerle çakışma
Mevcut türlere yeni yöntemler eklendi. Örneğin:
List
veDeque
. Bu yeni yöntemler uyumlu olmayabilir diğer arayüzlerde aynı ada ve bağımsız değişken türlerine sahip yöntemlerle ve sınıflar. Yöntem imzasının çakışması durumunda uyumsuz olursajavac
derleyicisi, derleme zamanı hatası verir. Örneğin, örnek:Örnek hata 1:
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 ListÖrnek hata 2:
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 errorÖrnek hata 3:
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 yapı hatalarını düzeltmek için bu arayüzleri uygulayan sınıf, yöntemi uyumlu bir iade türüyle geçersiz kılın. Örnek:
@Override public Object getFirst() { return List.super.getLast(); }
Güvenlik
Android 15, uygulamaları ve kullanıcıları kötü amaçlı uygulamalardan korumaya yardımcı olmak için sistem güvenliğini teşvik eden değişiklikler içerir.
Güvenli arka plan etkinliği lansmanları
Android 15, kötü amaçlı arka plan uygulamalarının diğer uygulamaları ön plana getirmesini engelleyen değişiklikler ekleyerek, kullanıcıların ayrıcalıklarını yükselterek ve kullanıcı etkileşimini kötüye kullanarak kullanıcıları zararlı uygulamalardan korur ve kullanıcılara cihazları üzerinde daha fazla kontrol sağlar. Arka plan etkinliği lansmanları Android 10'dan (API düzeyi 29) itibaren kısıtlanmıştır.
Yığındaki en üstteki UID ile eşleşmeyen uygulamaların etkinlikleri başlatmasını engelle
Kötü amaçlı uygulamalar aynı görev içinde başka bir uygulamanın etkinliğini başlatabilir, ardından kendilerini üst üste bindirerek o uygulama olduğu izlenimi yaratabilir. Bu "görev ele geçirme" saldırısı, her şey aynı görünür görev içinde gerçekleştiğinden arka planda başlatma kısıtlamalarını atlar. Android 15, bu riski azaltmak için yığındaki en üstteki UID ile eşleşmeyen uygulamaların etkinlikleri başlatmasını engelleyen bir işaret ekler. Uygulamanızdaki tüm etkinlikleri etkinleştirmek için uygulamanızın AndroidManifest.xml
dosyasındaki allowCrossUidActivitySwitchFromBelow
özelliğini güncelleyin:
<application android:allowCrossUidActivitySwitchFromBelow="false" >
Aşağıdakilerin tümü geçerliyse yeni güvenlik önlemleri etkindir:
- Lansmanı gerçekleştiren uygulama Android 15'i hedefliyor.
- Görev yığınının en üstündeki uygulama Android 15'i hedefliyor.
- Tüm görünür etkinlikler yeni korumalara dahil edildi
Güvenlik önlemleri etkinleştirilirse uygulamalar kendi görevlerini tamamlarlarsa son görünür olan uygulama yerine ana sayfaya dönebilir.
Diğer değişiklikler
UID eşleştirme kısıtlamasına ek olarak şu değişiklikler de dahil edilir:
PendingIntent
içerik üreticiyi varsayılan olarak arka planda etkinlik başlatmaları engellenecek şekilde değiştirin. Bu, uygulamaların yanlışlıkla kötü amaçlı kişiler tarafından kötüye kullanılabilecek birPendingIntent
oluşturmasını önlemeye yardımcı olur.PendingIntent
tarafından gönderen izin vermediği sürece bir uygulamayı ön plana getirmeyin. Bu değişikliğin amacı, kötü amaçlı uygulamaların arka planda etkinlik başlatma özelliğini kötüye kullanmasını önlemektir. Varsayılan olarak, oluşturucu arka plan etkinliğini başlatma ayrıcalıklarına izin vermediği veya gönderen, arka plan etkinliği başlatma ayrıcalıklarına sahip olmadığı sürece uygulamaların görev yığınını ön plana getirmesine izin verilmez.- Bir görev yığınındaki en önemli etkinliğin görevini nasıl tamamlayabileceğini kontrol edin. En üstteki etkinlik bir görevi tamamlarsa Android en son etkin olan göreve geri döner. Dahası, üst düzey olmayan bir etkinlik görevini tamamlarsa Android ana ekrana geri döner; bu üst olmayan etkinliğin tamamlanmasını engellemez.
- Diğer uygulamalardan rastgele etkinlikleri kendi görevinize başlatmaktan kaçının. Bu değişiklik, diğer uygulamalardan geliyormuş gibi görünen etkinlikler oluşturarak kötü amaçlı uygulamaların kullanıcıları kimlik avına karşı korumasını engeller.
- Görünmez pencerelerin, arka plan etkinliği başlatmaları için değerlendirilmesini engelle. Bu, kötü amaçlı uygulamaların kullanıcılara istenmeyen veya kötü amaçlı içerik göstermek için arka plan etkinlik başlatmalarını kötüye kullanmasını önlemeye yardımcı olur.
Daha güvenli amaçlar
Android 15, amaçların daha güvenli ve güçlü olmasını sağlamak için yeni güvenlik önlemleri sunar. Bu değişikliklerin amacı, olası güvenlik açıklarını ve kötü amaçlı uygulamalar tarafından istismar edilebilecek amaçların kötüye kullanımını önlemektir. Android 15'te amaçların güvenliğiyle ilgili iki önemli iyileştirme yapıldı:
- Hedef intent filtrelerini eşleştir: Belirli bileşenleri hedefleyen amaçlar, hedefin amaç filtresi spesifikasyonlarıyla doğru bir şekilde eşleşmelidir. Başka bir uygulamanın etkinliğini başlatma niyeti gönderirseniz hedef intent bileşeninin alıcı etkinliğin bildirilen intent filtreleriyle uyumlu olması gerekir.
- Amaçların işlemleri olmalıdır: İşlem içermeyen amaçlar artık hiçbir amaç filtresiyle eşleşmeyecektir. Bu, etkinlikleri veya hizmetleri başlatmak için kullanılan amaçların açıkça tanımlanmış bir eyleme sahip olması gerektiği anlamına gelir.
- Beklemedeki amaçlar: Beklemedeki amacın oluşturucusu, beklemedeki niyetin göndereni değil, ilgili niyetin göndereni olarak değerlendirilir
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() .detectUnsafeIntentLaunch() .build() ) }
Java
public void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() .detectUnsafeIntentLaunch() .build()); }
Kullanıcı deneyimi ve sistem arayüzü
Android 15'te daha tutarlı ve sezgisel bir kullanıcı deneyimi sunmayı amaçlayan bazı değişiklikler vardır.
Pencere içe aktarma değişiklikleri
Android 15'te pencere ekleriyle ilgili iki değişiklik vardır: Varsayılan olarak uçtan uca zorunlu kılınır. Ayrıca, sistem çubuklarının varsayılan yapılandırması gibi yapılandırma değişiklikleri de bulunur.
Uçtan uca zorunlu kılma
Android 15 çalıştıran cihazlarda uygulamalar varsayılan olarak uçtan uca hedeflenen Android 15'i (API düzeyi 35) hedefleyebilir.
Bu, uygulamanızın kullanıcı arayüzünü olumsuz etkileyebilecek zarar veren bir değişikliktir. İlgili içeriği oluşturmak için kullanılan değişiklikler aşağıdaki kullanıcı arayüzü alanlarını etkiler:
- Hareket tutma yeri gezinme çubuğu
- Varsayılan olarak şeffaftır.
- İçerik, sistemde gezinmenin arkasına gelebilmesi için alt ofset devre dışı bırakıldı çubuğunu kullanın.
setNavigationBarColor
veR.attr#navigationBarColor
desteği sonlandırılmıştır ve hareketle gezinmeyi etkilemeyecektir.setNavigationBarContrastEnforced
veR.attr#navigationBarContrastEnforced
ürününün, şu öğeler üzerinde herhangi bir etkisi yoktur: hareketle gezinme.
- 3 düğmeli gezinme
- Opaklık varsayılan olarak% 80'e ayarlandı, renk muhtemelen pencereyle eşleşiyor arka plan.
- İçerik sistem gezinme çubuğunun arkasına kayması için alt ofset devre dışı bırakıldı devam eder.
setNavigationBarColor
veR.attr#navigationBarColor
pencere arka planıyla eşleşecek şekilde ayarlanır. Pencerenin arka planı bu varsayılanın uygulanması için çizilebilir bir renk olmalıdır. Bu API desteği sonlandırılmış ancak 3 düğmeli gezinmeyi etkilemeye devam ediyor.setNavigationBarContrastEnforced
veR.attr#navigationBarContrastEnforced
varsayılan olarak doğrudur. Bu değer, 3 düğmeli gezinmede% 80 opak arka plan.
- Durum çubuğu
- Varsayılan olarak şeffaftır.
- Üst ofset devre dışı bırakılır ve böylece içerik, eklerin uygulandığından emin olun.
setStatusBarColor
veR.attr#statusBarColor
ve Android 15 üzerinde herhangi bir etkisi yoktur.setStatusBarContrastEnforced
veR.attr#statusBarContrastEnforced
desteği sonlandırıldı ancak hâlâ bir etkili olacak.
- Ekran kesimi
- Kayan olmayan pencerelerin
layoutInDisplayCutoutMode
kadarı,LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
.SHORT_EDGES
,NEVER
veDEFAULT
, kullanıcıların Siyah renk görmemesi içinALWAYS
olarak yorumlanır kenardan kenara göründüğünden emin olun.
- Kayan olmayan pencerelerin
Aşağıdaki örnekte, hedeflemeden önceki ve sonraki bir uygulama gösterilmektedir Android 15 (API düzeyi 35) ve eklerin uygulanmasından önceki ve sonraki sürümler.
ziyaret edin. ziyaret edin.Uygulamanızın uçtan uca olup olmadığını kontrol etmeniz gerekenler
Uygulamanız zaten uçtan uca ve içe eklemeler uyguluyorsa herhangi bir etkisi yoktur. Ancak projenizin genel sağlığıyla ilgili uygulamanızı test etmenizi öneririz.
- Kayan olmayan bir pencereniz vardır. Örneğin,
Activity
Bunun yerine,SHORT_EDGES
,NEVER
veyaDEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
. Uygulamanız başlatılırken kilitlenirse başlangıç ekranınız olabilir. İster yeni sürüme ister başlangıç ekranı 1.2.0-alpha01 bağımlılığı veyawindow.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always
olarak ayarlayın. - Kapalı kullanıcı arayüzüyle daha az trafik elde edilen ekranlar olabilir. Bunları doğrulayın
Daha az ziyaret edilen ekranların kullanıcı arayüzü kapalı değildir. Düşük trafikli ekranlar şunları içerir:
- İlk katılım veya oturum açma ekranları
- Ayarlar sayfaları
Uygulamanız uçtan uca değilse kontrol edilecekler
Uygulamanız tüm ayrıntılarıyla anlatılmıyorsa muhtemelen etkileniyorsunuzdur. İçinde uçtan uca uygulama senaryolarına ek olarak, şunları göz önünde bulundurun:
- Uygulamanız Malzeme 3 Bileşenleri (
androidx.compose.material3
) (ör.TopAppBar
),BottomAppBar
veNavigationBar
gibi bileşenlerin kullanılma olasılığı düşük insetleri otomatik olarak işlediğinden etkilenir. - Uygulamanız Malzeme 2 Bileşenleri (
androidx.compose.material
) Compose'da bu bileşenler inset'leri otomatik olarak işlemez. Ancak eklere erişebilirsiniz. manuel olarak uygulayabilirsiniz. androidx.compose.material 1.6.0 sürümünde ve daha sonra, girişleri manuel olarak uygulamak içinwindowInsets
parametresini kullanın.BottomAppBar
,TopAppBar
,BottomNavigation
veNavigationRail
. Benzer şekilde, şunun içincontentWindowInsets
parametresini kullanın:Scaffold
. - Uygulamanızda görünümler ve Malzeme Bileşenleri kullanılıyorsa
(
com.google.android.material
), en fazla görüntüleme tabanlı MateryalBottomNavigationView
,BottomAppBar
, gibi bileşenlerNavigationRailView
veyaNavigationView
, ekleri işleyebilir ve hiçbir işlem gerektirmemesini sağlar gerek yok. Ancak,android:fitsSystemWindows="true"
eklemeniz gerekiyorAppBarLayout
kullanıyorsanız. - Özel composable'lar için iç kümeleri dolgu olarak manuel olarak uygulayın. Eğer
içerik
Scaffold
içindeyse ek öğeleri,Scaffold
dolgu değerleri ekleyin. Aksi takdirde,WindowInsets
. - Uygulamanızda görünümler ve
BottomSheet
,SideSheet
veya özel mülk kullanılıyorsa kapsayıcılar, dolgu uygulamak içinViewCompat.setOnApplyWindowInsetsListener
. Örneğin,RecyclerView
, bu işleyiciyi kullanarak dolgu uygulayın ve ayrıcaclipToPadding="false"
.
Uygulamanızın özel arka plan koruması sunması gerekip gerekmediğini kontrol etmeniz gerekenler
Uygulamanızın 3 düğmeli gezinme için özel arka plan koruması sunması gerekiyorsa veya
uygulamanız, sistem çubuğunun arkasına bir composable veya görünüm yerleştirmelidir.
3 düğmeyi almak için WindowInsets.Type#tappableElement()
seçeneğini kullanın
gezinme çubuğu yüksekliğinde veya WindowInsets.Type#statusBars
.
Uçtan uca ek kaynaklar
Uçtan Kenara Görünümler ve Uçtan Uca Oluşturma konularına bakın. kılavuzlarını inceleyebilirsiniz.
Desteği sonlandırılmış API'ler
Aşağıdaki API'ler kullanımdan kaldırılmıştır:
R.attr#enforceStatusBarContrast
R.attr#navigationBarColor
R.attr#navigationBarDividerColor
R.attr#statusBarColor
Window#getNavigationBarColor
Window#getNavigationBarDividerColor
Window#getStatusBarColor
Window#isStatusBarContrastEnforced
Window#setDecorFitsSystemWindows
Window#setNavigationBarColor
Window#setNavigationBarDividerColor
Window#setStatusBarColor
Window#setStatusBarContrastEnforced
Kararlı yapılandırma
Uygulamanız Android 15 (API düzeyi 35) veya sonraki bir sürümü hedefliyorsa Configuration
hayır
, sistem çubuklarını hariç tutar.
Düzen hesaplaması için Configuration
sınıfı, bunu daha iyi bir sınıfla değiştirmelisiniz
uygun ViewGroup
, WindowInsets
veya
İhtiyacınıza göre WindowMetricsCalculator
.
Configuration
, API 1'den beri kullanılmaktadır. Genellikle
Activity.onConfigurationChanged
Pencere yoğunluğu,
ve boyutları kontrol edin. Pencere boyutlarıyla ilgili önemli bir özellik,
Configuration
parametresi, daha önce sistem çubuklarının hariç tutulduğu anlamına gelir.
Yapılandırma boyutu genellikle şunun gibi kaynak seçimi için kullanılır:
/res/layout-h500dp
'dır ve bu hâlâ geçerli bir kullanım alanıdır. Ancak bunu,
düzen hesaplamasının kullanılması hiçbir zaman önerilmemiştir. Bu durumda
şimdi ondan uzaklaşacağım. Configuration
kullanımını başka bir değerle değiştirmeniz gerekir
kullanım alanınıza daha uygun
olabilir.
Düzeni hesaplamak için bunu kullanırsanız uygun bir ViewGroup
kullanın. Örneğin:
CoordinatorLayout
veya ConstraintLayout
. Yüksekliği belirlemek için
için WindowInsets
değerini kullanın. Mevcut boyutu öğrenmek istiyorsanız
computeCurrentWindowMetrics
kullanın.
Aşağıdaki listede bu değişiklikten etkilenen alanlar açıklanmaktadır:
Configuration.screenWidthDp
vescreenHeightDp
boyutları artık kullanılamıyor sistem çubuklarını hariç tutun.Configuration.smallestScreenWidthDp
değişikliklerden dolaylı olarak etkilenirscreenWidthDp
vescreenHeightDp
adlı kişilere.Configuration.orientation
,screenWidthDp
vescreenHeightDp
, kareye yakın cihazlarda.Display.getSize(Point)
,Configuration
. Bu özelliğin desteği, API düzeyi 30'dan itibaren sonlandırılmıştır.Display.getMetrics()
, API düzeyi 33'ten beri zaten bu şekilde çalışıyor.
zarifTextHeight özelliği varsayılan olarak true değerine ayarlanır
Android 15'i hedefleyen uygulamalarda elegantTextHeight
TextView
özelliği varsayılan olarak true
haline gelir. Varsayılan olarak kullanılan kompakt yazı tipi, büyük dikey metriklere sahip bazı komut dosyalarıyla değiştirilir. Bu yazı tipi çok daha okunabilir bir yazı tipiyle değiştirilir. Kompakt yazı tipi, düzenlerin bozulmasını önlemek için kullanıma sunulmuştur. Android 13 (API düzeyi 33), fallbackLineSpacing
özelliğini kullanarak metin düzeninin dikey yüksekliği genişletmesine izin vererek bu bozuklukların çoğunun önüne geçer.
Android 15'te, kompakt yazı tipi sistemde kalmaya devam eder. Böylece uygulamanız, öncekiyle aynı davranışı elde etmek için elegantTextHeight
değerini false
olarak ayarlayabilir, ancak gelecekteki sürümlerde desteklenme olasılığı düşüktür. Bu nedenle, uygulamanız Arapça, Laoca, Myanmar, Tamilce, Guceratça, Kannada, Malayalam, Oriya, Telugu ve Tayca komutlarını destekliyorsa elegantTextHeight
değerini true
olarak ayarlayarak uygulamanızı test edin.
Karmaşık harf şekilleri için TextView genişliği değişiyor
Android'in önceki sürümlerinde, karmaşık şekilli belirli el yazısı yazı tipleri
veya diller, önceki ya da sonraki karakterin alanındaki harfleri çizebilir.
Bazı durumlarda, bu tür harfler başlangıç veya bitiş konumundan kırpılıyordu.
Android 15'ten itibaren TextView
, bu tür harflere yeterince alan çizmek için genişlik ayırır ve uygulamaların kırpmayı önlemek için sola doğru ekstra dolgular istemesine olanak tanır.
Bu değişiklik, bir TextView
öğesinin genişliğe karar verme şeklini etkilediğinden, uygulama Android 15 veya sonraki bir sürümü hedefliyorsa TextView
varsayılan olarak daha fazla genişlik ayırır. TextView
üzerinde setUseBoundsForWidth
API'yi çağırarak bu davranışı etkinleştirebilir veya devre dışı bırakabilirsiniz.
Sol dolgu eklemek mevcut düzenlerde uyumsuzluğa neden olabileceğinden dolgu, Android 15 veya sonraki sürümleri hedefleyen uygulamalarda bile varsayılan olarak eklenmez.
Ancak, kırpmayı önlemek için setShiftDrawingOffsetForStartOverhang
yöntemini çağırarak fazladan dolgu ekleyebilirsiniz.
Aşağıdaki örnekler, bu değişikliklerin bazı yazı tipleri ve diller için metin düzenini nasıl iyileştirebileceğini göstermektedir.
EditText için yerel ayara duyarlı varsayılan satır yüksekliği
Android'in önceki sürümlerinde metin düzeni, metnin yüksekliğini mevcut yerel ayarla eşleşen yazı tipinin satır yüksekliğini karşılayacak şekilde genişletiyordu. Örneğin, içerik Japoncaysa, Japonca yazı tipinin satır yüksekliği Latin yazı tipinden biraz daha büyük olduğu için metnin yüksekliği biraz daha büyük olur. Ancak, satır yüksekliklerindeki bu farklılıklara rağmen, aşağıdaki resimde gösterildiği gibi EditText
öğesi, kullanılan yerel ayardan bağımsız olarak eşit şekilde boyutlandırıldı:
Android 15'i hedefleyen uygulamalarda, aşağıdaki resimde gösterildiği gibi, belirtilen Yerel Ayarın referans yazı tipiyle eşleşmesi için EditText
için minimum satır yüksekliği ayrılmıştır:
Gerekirse uygulamanız useLocalePreferredLineHeightForMinimum
özelliğini false
için belirterek önceki davranışı geri yükleyebilir. Ayrıca uygulamanız, Kotlin ve Java'da setMinimumFontMetrics
API'yi kullanarak özel minimum sektör metrikleri ayarlayabilir.
Kamera ve medya
Android 15, Android 15 veya sonraki sürümleri hedefleyen uygulamaların kamera ve medya davranışında aşağıdaki değişiklikleri yapar.
Ses odağı isteğinde bulunmayla ilgili kısıtlamalar
Ses odağı isteğinde bulunabilmek için Android 15'i hedefleyen uygulamaların en iyi uygulama olması veya bir ön plan hizmeti çalıştırması gerekir. Bir uygulama bu şartlardan birini karşılamadığında odaklanma isteğinde bulunmaya çalışırsa çağrı AUDIOFOCUS_REQUEST_FAILED
değerini döndürür.
Ses odağı hakkında daha fazla bilgi edinmek için Ses odağını yönetme başlıklı makaleye göz atabilirsiniz.
SDK dışı kısıtlamalar güncellendi
Android 15'te, SDK dışı kısıtlanmış öğelerin güncellenmiş listeleri yer alır Android geliştiricileriyle ortak çalışmaya dayalı arayüzler ve en yeni dahili test. Mümkün olduğunda, herkese açık alternatiflerin SDK dışı arayüzleri kısıtlamadan önce kullanıma sunuyoruz.
Uygulamanız Android 15'i hedeflemiyorsa bu değişikliklerden bazıları sizi hemen etkilemeyebilir. Ancak uygulamanızın bazı durumlarda SDK olmayan bazı arayüzlere erişin uygulamanızın hedef API düzeyine bağlı olarak, SDK dışı herhangi bir yöntemi veya alanı her zaman uygulamanızın bozulma riski taşır.
Uygulamanızın SDK dışı arayüz kullanıp kullanmadığından emin değilseniz şunları yapabilirsiniz: Öğrenmek için uygulamanızı test edin. Uygulamanız SDK dışı kullanıyorsa SDK alternatiflerine geçiş planlamaya başlamanız gerekir. Yine de bazı uygulamaların, mobil cihazlara yönelik olarak içerik izlemek için geçerli kullanım alanları olduğunun SDK olmayan arayüzler. SDK dışı bir sürüm kullanmaya alternatif bulamıyorsanız arayüzünden ibaret kullanıyorsanız, yeni bir herkese açık API isteğinde bulunun.
Android'in bu sürümündeki değişiklikler hakkında daha fazla bilgi edinmek için Android 15'te SDK dışı arayüz kısıtlamalarında yapılan güncellemeler bölümüne bakın. Genel olarak SDK olmayan arayüzler hakkında daha fazla bilgi edinmek için SDK olmayan arayüzlerle ilgili kısıtlamalar bölümüne bakın.