Davranış değişiklikleri: Android 15 veya sonraki bir sürümü hedefleyen uygulamalar

Önceki sürümlerde olduğu gibi Android 15 de en iyi şekilde yararlanabilirsiniz. Aşağıdaki davranış değişiklikleri, yalnızca şu özelliklere sahip uygulamalar için geçerlidir: Android 15 veya sonraki sürümleri hedefleyen. Uygulamanız Android 15 veya sonraki sürümleri hedefliyorsa uygulamanızı bu davranışları destekleyecek şekilde değiştirmeniz gerekir. geçerlidir.

Ayrıca, tüm uygulamaları etkileyen davranış değişikliklerinin listesini de incelediğinizden emin olun. uygulamanızın targetSdkVersion sürümünden bağımsız olarak Android 15'te çalıştırma.

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ışı

Android 15, uygulama hedefleme için dataSync ile ilgili yeni bir zaman aşımı davranışı sunuyor Android 15 (API düzeyi 35) veya sonraki sürümler. Bu davranış yeni mediaProcessing ön plan hizmet türü.

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:

  1. 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ı.)
  2. 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).
  3. 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.
  4. 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 hizmeti türü

Android 15, mediaProcessing adlı yeni ön plan hizmeti türünü kullanıma sunuyor. Bu hizmet türünün, medya dosyalarının kodunu dönüştürme gibi işlemler için uygun olduğunu unutmayın. Örneğin, Örneğin, bir medya uygulaması bir ses dosyasını indirdikten sonra bunu farklı bir formatta olması gerekir. mediaProcessing ön planı kullanabilirsiniz hizmeti kullanıma sunduk. arka plan.

Sistem, bir uygulamanın mediaProcessing hizmetlerinin toplam 6 defa ç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(). 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 mediaProcessing did not stop within its timeout: [component name]"

İstisnayla karşılaşmamak için aşağıdakilerden birini yapabilirsiniz:

  1. 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ı.)
  2. Uygulamanızın mediaProcessing hizmetlerinin en fazla bir süre çalışmadığından emin olun toplam 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).
  3. mediaProcessing ö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.
  4. Bir mediaProcessing ön plan hizmeti kullanmak yerine alternatif bir çözüm kullanın API (ör. WorkManager).

Uygulamanızın mediaProcessing ön plan hizmeti 6 saat boyunca çalışıyorsa Son 24'te, başka bir mediaProcessing ön plan hizmeti başlatamazsanız bunun için Kullanıcı uygulamanızı ön plana getirir (bu işlem zamanlayıcıyı sıfırlar). Şu durumda: başka bir mediaProcessing ön plan hizmeti başlatmayı denediğinizde ForegroundServiceStartNotAllowedException "Ön plan hizmeti için süre sınırı aşıldı" gibi bir hata mesajı gösterilir MediaProcessing yazın."

mediaProcessing hizmet türü hakkında daha fazla bilgi için Android 15 için ön plan hizmet türleri: Medya işleme.

Test

Uygulamanızın davranışını test etmek için, uygulamanızın davranışını test etmek için uygulamanız Android 15'i hedeflemiyor (uygulamanız Android 15 cihaz) tıklayın. 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 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:

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

SYSTEM_ALERT_WINDOW izni bulunan bir uygulama için ön plan hizmetlerinin başlatılmasıyla ilgili kısıtlamalar

Önceden, SYSTEM_ALERT_WINDOW iznine sahip olan bir uygulama başlatılabiliyordu. uygulama arka planda çalışıyor olsa bile (örneğin, arka planda başlatma kısıtlamalarından muafiyetler bölümünde ele alınmıştır.

Bir uygulama Android 15'i hedefliyorsa bu muafiyet artık daha dar olacaktır. Uygulama artık SYSTEM_ALERT_WINDOW iznine sahip olma ve ayrıca görünür bir yer paylaşımına sahip olma penceresini kapatın. Yani, uygulamanın ilk olarak TYPE_APPLICATION_OVERLAY penceresi ve pencere bir ön plan hizmeti başlatılmadan önce görünür olması gerekir.

Uygulamanız arka planda bir ön plan hizmeti başlatmaya çalışıyorsa (başka bir muafiyeti yoksa) ilgili şartların karşılanıp karşılanmadığı sistem ForegroundServiceStartNotAllowedException hatasını bildirir.

Uygulamanız SYSTEM_ALERT_WINDOW iznini beyan ederse ve arka planda ön plan hizmetlerini başlattığında, unutmayın. Uygulamanız ForegroundServiceStartNotAllowedException alırsa kontrol edin emin olun ve uygulamanızda zaten etkin bir başlatmadan önce bir ön plan hizmeti başlatmaya çalışmadan önce arka plan. Yer paylaşımı pencerenizin şu anda görünür olup olmadığını kontrol edebilirsiniz View.getWindowVisibility() numaralı telefonu arayarak veya View.onWindowVisibilityChanged() geçersiz kılabilir bildirim alın.

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. Ön plan hizmetlerini başlatırken bu yeni kısıtlamaları etkinleştirmek için aşağıdaki adb komutunu çalıştırın:

adb shell am compat enable FGS_SAW_RESTRICTIONS your-package-name

Uygulamaların Rahatsız Etmeyin modunun genel durumunu değiştirebileceği 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() ve Formatter.format() API'leri:

    Ö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ık Object olur; temel dizideki öğelerin türü değildir. Dolayısıyla Aşağıdaki kod bir ClassCastException hatası verir:

    String[] elements = (String[]) Arrays.asList("one", "two").toArray();
    

    Bu durumda, sonuçta String bileşen türünü korumak için dizisi yerine Collection.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 eski biçimlerine (İ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ın Random.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() ve kotlin-stdlib içindeki MutableList.removeLast() uzantı işlevleri

    Java'daki List türü, Kotlin'de MutableList türüyle eşlenir. Çünkü List.removeFirst() ve List.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 yeni List API'lerini kullanabilirsiniz. kotlin-stdlib.

    Bir uygulama compileSdk ile yeniden derlenirse 35 olarak ve minSdk olarak ayarlanırsa 34 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() ve removeLast() işlev çağrısı removeAt(0) ve Kotlin'de sırasıyla removeAt(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") ve lintOptions { 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 ve Deque. 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 olursa javac 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 error
    

    Bu 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'te, uygulamaların korunmasına yardımcı olmak için sistem güvenliğini teşvik eden değişiklikler bulunur. ve kötü amaçlı uygulamalardan gelen trafiktir.

Güvenli arka plan etkinliği lansmanları

Android 15, kullanıcıları kötü amaçlı uygulamalardan korur ve üzerinde daha fazla kontrol imkanı sunar. kötü amaçlı arka plan uygulamalarının çalışmasını engelleyen değişiklikler ekleyerek diğer uygulamaları ön plana alarak, ayrıcalıklarının yükseltilmesine ve kötü amaçlı kullanıcı etkileşimi. Arka plan etkinliği lansmanları şu tarihten beri kısıtlanmıştır: Android 10 (API düzeyi 29).

Yığındaki en iyi UID ile eşleşmeyen uygulamaların etkinlik başlatmasını engelle

Kötü amaçlı uygulamalar aynı görev içinde başka bir uygulamanın etkinliğini başlatabilir ve ardından Böylece uygulama olduğu izlenimi yaratıyor. Bu "görev hesabı ele geçirme" mevcut arka plan başlatma kısıtlamalarını atlar çünkü aynı görev içinde gerçekleşir. Android 15, bu riski azaltmak için Yığındaki en iyi UID ile eşleşmeyen uygulamaların başlatılmasını engelleyen işaret yardımcı olur. Uygulamanızdaki tüm etkinlikleri etkinleştirmek için allowCrossUidActivitySwitchFromBelow özelliği ekleyin:AndroidManifest.xml

<application android:allowCrossUidActivitySwitchFromBelow="false" >

Aşağıdaki koşulların tamamı 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.
  • Görünen tüm etkinlikler yeni korumaları etkinleştirmiştir.

Güvenlik önlemleri etkinleştirilirse uygulamalar, görünür hale getirebilirsiniz.

Diğer değişiklikler

UID eşleşmesi kısıtlamasına ek olarak, bu diğer değişiklikler de dahil:

  • PendingIntent içerik üreticiyi, şu tarihe kadar arka planda etkinlik başlatmaları engelleyecek şekilde değiştirin: varsayılan. Bu, uygulamaların kötü niyetli kişiler tarafından kötüye kullanılabilecek bir PendingIntent oluşturmasını önler.
  • PendingIntent adlı göndereni göndermediği sürece uygulamayı ön plana taşıma izin veriyor. Bu değişikliğin amacı, kötü amaçlı uygulamaların arka planda etkinlik başlatma becerisi. Uygulamalar varsayılan olarak oluşturan kullanıcı izin vermediği sürece görev yığınını ön plana taşımasına izin verilir arka planda etkinlik başlatma ayrıcalıkları veya gönderenin arka planda etkinliği olması başlatma ayrıcalıkları.
  • Bir görev yığınının en üst etkinliğinin, görevini nasıl tamamlayabileceğini kontrol edin. Öğe bir görevi tamamladığında, Android o göreve geri döner son etkin olma zamanı. Ayrıca, en üstte olmayan bir etkinlik görevini tamamlarsa Android, ana ekrana geri dön; bu üst olmayan bu bölümün bitişini etkinliği'ne dokunun.
  • Diğer uygulamalardan kendi görevinize rastgele etkinliklerin başlatılmasını engelleyin. Bu değişiklik, kötü amaçlı uygulamaların kullanıcıları kimlik avına karşı korumak için diğer uygulamalardan geliyormuş gibi görünen etkinlikler.
  • Görünmeyen pencerelerin arka plan etkinliği için değerlendirilmesini engelle lansmanlar. Bu, kötü amaçlı uygulamaların arka planı kötüye kullanmasını önlemeye yardımcı olur kullanıcılara istenmeyen veya kötü amaçlı içeriklerin gösterilmesi için etkinlik başlatma.

Daha güvenli amaçlar

Android 15, intent'leri daha güvenli ve daha güçlü hale getirmek için isteğe bağlı yeni güvenlik önlemleri sunar. Bu değişiklikler, kötü amaçlı uygulamalar tarafından kötüye kullanılabilecek olası güvenlik açıklarını ve intent'lerin kötüye kullanımını önlemeyi amaçlamaktadır. Android 15'te intent'lerin güvenliğiyle ilgili iki önemli iyileştirme yapılmıştır:

  • 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 amaç 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.

Uygulamanızın bu değişikliklere nasıl yanıt verdiğini kontrol etmek için uygulamanızda StrictMode kullanın. Intent kullanım ihlalleriyle ilgili ayrıntılı günlükleri görmek için aşağıdaki yöntemi ekleyin:

Kotlin


fun onCreate() {
    StrictMode.setVmPolicy(VmPolicy.Builder()
        .detectUnsafeIntentLaunch()
        .build()
    )
}

Java


public void onCreate() {
    StrictMode.setVmPolicy(new VmPolicy.Builder()
            .detectUnsafeIntentLaunch()
            .build());
}

Kullanıcı deneyimi ve sistem arayüzü

Android 15'te daha tutarlı, daha iyi ve daha iyi en iyi uygulamaları paylaşacağız.

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 yaptırım

Android 15 çalıştıran cihazlarda uygulamalar varsayılan olarak uçtan uca hedeflenen Android 15'i (API düzeyi 35) hedefleyebilir.

Android 14'ü hedefleyen ve Android 15 cihaz.


Android 15'i (API düzeyi 35) hedefleyen ve uçtan uca uygulama Android 15 cihazda. Bu uygulama çoğunlukla Material 3 Compose Bileşenlerini kullanıyor otomatik olarak ekler. Bu ekran, Android 15 uçtan uca yaptırım.

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 ve R.attr#navigationBarColor desteği sonlandırılmıştır ve hareketle gezinmeyi etkilemeyecektir.
    • setNavigationBarContrastEnforced ve R.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 ve R.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 ve R.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 ve R.attr#statusBarColor ve Android 15 üzerinde herhangi bir etkisi yoktur.
    • setStatusBarContrastEnforced ve R.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 ve DEFAULT, kullanıcıların Siyah renk görmemesi için ALWAYS olarak yorumlanır kenardan kenara göründüğünden emin olun.

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.

Android 14'ü hedefleyen ve Android 15 cihaz.
ziyaret edin.
Android 15'i (API düzeyi 35) hedefleyen ve uçtan uca uygulama Android 15 cihazda. Ancak birçok öğe artık duruma göre gizleniyor Android 15 nedeniyle çubuk, 3 düğmeli gezinme çubuğu veya ekran kesimi uçtan uca yaptırımlar. Gizli kullanıcı arayüzü, Material 2'yi içeriyor üst uygulama çubuğu, kayan işlem düğmeleri ve liste öğeleri içeriyor.
ziyaret edin.
Android 15'i (API düzeyi 35) hedefleyen bir uygulama, Android 15 cihaza erişiyor ve kullanıcı arayüzünün gizli.
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.

  • Activity gibi kayan olmayan bir pencereniz vardır. Bunun yerine, SHORT_EDGES, NEVER veya DEFAULT 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ığı veya window.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 ve NavigationBar 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çin windowInsets parametresini kullanın. BottomAppBar, TopAppBar, BottomNavigation ve NavigationRail. Benzer şekilde, şunun için contentWindowInsets 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ı Materyal BottomNavigationView, BottomAppBar, gibi bileşenler NavigationRailView veya NavigationView, ekleri işleyebilir ve hiçbir işlem gerektirmemesini sağlar gerek yok. Ancak, android:fitsSystemWindows="true" eklemeniz gerekiyor AppBarLayout 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çin ViewCompat.setOnApplyWindowInsetsListener. Örneğin, RecyclerView, bu işleyiciyi kullanarak dolgu uygulayın ve ayrıca clipToPadding="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:

Kararlı yapılandırma

Uygulamanız Android 15 (API düzeyi 35) veya sonraki sürümleri hedefliyorsa Configuration artık sistem çubuklarını hariç tutmuyor. Configuration sınıfında ekran boyutunu düzen hesaplaması için kullanıyorsanız ihtiyacınıza bağlı olarak uygun bir ViewGroup, WindowInsets veya WindowMetricsCalculator gibi daha iyi alternatiflerle değiştirmeniz gerekir.

Configuration, API 1'den beri kullanılabilir. Genellikle Activity.onConfigurationChanged Pencere yoğunluğu, ve boyutları kontrol edin. Configuration tarafından döndürülen pencere boyutlarıyla ilgili önemli bir özellik, daha önce sistem çubuklarını hariç tutmasıdır.

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, hemen uzaklaşmanız gerekir. Configuration kullanımını başka bir değerle değiştirmeniz gerekir kullanım alanınıza daha uygun olabilir.

Bu özelliği düzeni hesaplamak için kullanıyorsanız CoordinatorLayout veya ConstraintLayout gibi uygun bir ViewGroup kullanın. Sistem gezinme çubuğunun yüksekliğini belirlemek için kullanıyorsanız 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:

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.

Android 14 (API düzeyi 34) ve önceki sürümleri hedefleyen uygulamalar için elegantTextHeight davranışı.
Android 15'i hedefleyen uygulamalar için elegantTextHeight davranışı.

Karmaşık harf şekilleri için TextView genişliği değişiyor

Android'in önceki sürümlerinde, karmaşık şekillendirme, önceki veya 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, yeterli alan çizmek için genişliği ayırır ve uygulamaların sol tarafta ekstra dolgu istemesine izin verir. sabitlenmesi önlenir.

Bu değişiklik, TextView genişliğe karar verme şeklini etkilediği için TextView Uygulama Android 15'i (API düzeyi 35) veya daha yüksek. Bu davranışı, TextView üzerinde setUseBoundsForWidth API.

Sol dolgu eklemek mevcut düzenlerde bir uyumsuzluğa neden olabileceğinden, Android 15 veya sonraki sürümleri hedefleyen uygulamalar için bile varsayılan olarak dolgu eklenmez. Bununla birlikte, kırpma işlemini önlemek için setShiftDrawingOffsetForStartOverhang

Aşağıdaki örneklerde, bu değişikliklerin bazı reklamverenler için metin düzenini nasıl iyileştirebileceği yazı tipleri ve diller.

El yazısıyla yazılmış İngilizce metinler için standart düzen. Bazı harfler kırpılır. İlgili XML:

<TextView
    android:fontFamily="cursive"
    android:text="java" />
Aynı İngilizce metne yönelik, ek genişlik ve dolgu. İlgili XML:

<TextView
    android:fontFamily="cursive"
    android:text="java"
    android:useBoundsForWidth="true"
    android:shiftDrawingOffsetForStartOverhang="true" />
Tayca metin için standart düzen. Harflerden bazıları kesilmiş. İlgili XML:

<TextView
    android:text="คอมพิวเตอร์" />
Aynı Tayca metin için ek genişlik ve dolgu. İlgili XML:

<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ğ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ı:

İngilizce (en), Japonca (ja) ve Burmaca (my) metinleri içerebilen, EditText öğelerini temsil eden üç kutu. Bu diller birbirinden farklı satır yüksekliklerine sahip olsa da EditText öğesinin yüksekliği aynıdır.

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:

İngilizce (en), Japonca (ja) ve Burmaca (my) metinleri içerebilen, EditText öğelerini temsil eden üç kutu. EditText öğesinin yüksekliği, artık bu dillerin yazı tipleri için varsayılan satır yüksekliğinin barındırılabileceği bir alan içeriyor.

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, uygulamaların kamera ve medya davranışında aşağıdaki değişiklikleri yapar Android 15 veya sonraki sürümleri hedefleyen uygulamalar.

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, SDK dışı kısıtlanmış öğelerin güncel listelerini içerir Android geliştiricileriyle ortak çalışmaya dayalı arayüzler ve en yeni dahili test. Mümkün olduğunda, SDK olmayan arayüzleri kısıtlamadan önce herkese açık alternatiflerin kullanılabildiğinden emin oluruz.

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 bunu öğrenmek için uygulamanızı test edebilirsiniz. Uygulamanız SDK dışı kullanıyorsa SDK alternatiflerine geçiş planlamaya başlamanız gerekir. Bununla birlikte, bazı uygulamaların SDK dışı arayüzleri kullanmanın geçerli kullanım alanları olduğunu biliyoruz. Uygulamanızdaki bir özellik için SDK dışında bir arayüz kullanmanın alternatifini bulamıyorsanız yeni bir herkese açık API isteğinde bulunmanız gerekir.

Android'in bu sürümündeki değişiklikler hakkında daha fazla bilgi edinmek için Android 15'te SDK dışı arayüz kısıtlamalarında yapılan güncellemeler bölümüne bakın. Genel olarak SDK olmayan arayüzler hakkında daha fazla bilgi edinmek için SDK olmayan arayüzlerle ilgili kısıtlamalar bölümüne bakın.