Davranış değişiklikleri: tüm uygulamalar

Android 17 platformu, uygulamanızı etkileyebilecek davranış değişiklikleri içerir. Aşağıdaki davranış değişiklikleri, targetSdkVersion değerinden bağımsız olarak Android 17'de çalışan tüm uygulamalar için geçerlidir. Uygulamanızı test etmeli ve uygun olduğu durumlarda bu değişiklikleri desteklemek için uygulamanızı gerektiği şekilde değiştirmelisiniz.

Yalnızca Android 17'yi hedefleyen uygulamaları etkileyen davranış değişiklikleri listesini de incelemeyi unutmayın.

Temel işlevler

Android 17 (API düzeyi 37), Android sisteminin çeşitli temel özelliklerini değiştiren veya genişleten aşağıdaki değişiklikleri içerir.

Uygulama bellek sınırları

Android 17, uygulamalarınız ve Android kullanıcıları için daha kararlı ve deterministik bir ortam oluşturmak amacıyla cihazın toplam RAM'ine göre uygulama bellek sınırları getiriyor. Android 17'de, sistem temellerini oluşturmak için sınırlar muhafazakar bir şekilde belirlenir. Bu sınırlar, sistem genelinde kararsızlığa yol açarak kullanıcı arayüzünde takılmaya, pilin daha hızlı tükenmesine ve uygulamaların kapatılmasına neden olmadan önce aşırı bellek sızıntılarını ve diğer aykırı değerleri hedefler. Uygulama oturumlarının büyük çoğunluğunun bu durumdan en az düzeyde etkileneceğini tahmin etsek de bellekle ilgili aşağıdaki en iyi uygulamaları (ör. bellek için bir temel oluşturma) uygulamanızı öneririz.

ApplicationExitInfo içinde getDescription işlevini çağırarak uygulama oturumunuzun etkilenip etkilenmediğini belirleyebilirsiniz. Uygulamanız etkilendiyse çıkış nedeni REASON_OTHER olur ve açıklamada diğer bilgilerle birlikte "MemoryLimiter:AnonSwap" dizesi yer alır. Bellek sınırı aşıldığında toplanan yığın dökümlerini almak için TRIGGER_TYPE_ANOMALY ile tetikleyici tabanlı profil oluşturma özelliğini de kullanabilirsiniz.

Uygulamanızın belleğini yönetme dokümanında, uygulamanızın bellek sorunlarını teşhis etmenize ve kaynak tüketimini optimize etmenize yardımcı olacak bilgiler yer alır.

Uygulamanızın bellek kısıtlamaları altındaki davranışını test etme

Android Debug Bridge (adb) kullanarak bellek sınırlarını uygulayan cihazlarda bu sınırları ayarlayabilir veya devre dışı bırakabilirsiniz. am kabuk komutu, bellek sınırlarını ayarlamak için üç alt komut sağlar. (Bu komutların, bellek sınırı uygulamayan cihazlar üzerinde etkisi yoktur.)

  • am memory-limiter ignore <uid>|none|all
  • am memory-limiter manual <pid> <limit>|max|none
  • am memory-limiter status
ignore

Bellek sınırlayıcıya bazı veya tüm işlemleri yoksayma talimatı verir. UID (Android Kullanıcı Kimliği) iletildiğinde bellek sınırlayıcı, bu UID ile ilişkili tüm işlemler için zorlamayı yoksayma talimatı alır. Ayrıca all (tüm uygulamaları yoksay) veya none (hiçbir uygulamayı yoksayma) değerini de iletebilirsiniz. none değerini iletmek, am memory-limiter ignore için yapılan önceki tüm çağrıları geçersiz kılar.

Bellek sınırlayıcıya bir UID'yi yoksayma talimatı verirseniz am memory-limiter manual işlevini çağırarak uygulama içindeki bir işleme manuel bellek sınırı uygulayabilirsiniz.

manual

Sisteme, belirtilen PID'ye (işlem kimliği) sahip işleme bellek kısıtlaması uygulama talimatı verir. Bellek kısıtlaması, MB cinsinden bir tam sayı olarak belirtilir. Örneğin, 30 parametresinin iletilmesi, işlemin 30 MB bellek ile sınırlandırıldığını belirtir. max parametresinin iletilmesi, söz konusu işlemdeki tüm bellek sınırlarını kaldırır. none parametresinin iletilmesi, işlemde ayarlanan tüm manuel sınırları kaldırarak sistemin varsayılan sınırını (varsa) geri yükler.

status

Bellek sınırlayıcının mevcut durumunu bildirir. Durum, görünür ve görünür olmayan işlemlere uygulanan bellek sınırlarını içerir.

Gizlilik

Android 17, kullanıcı gizliliğini iyileştirmek için aşağıdaki değişiklikleri içerir.

SMS OTP koruması

Android 17'den itibaren Android, tek kullanımlık şifre (OTP) içeren SMS mesajları için korumasını genişletiyor.

Android'in önceki sürümlerinde bu koruma öncelikle SMS Retriever biçimine odaklanıyordu. SMS alıcı karması içeren mesajların teslimi, çoğu uygulamada üç saat gecikiyordu. Ancak belirli uygulamalar (ör. varsayılan SMS işleyici) gecikmeden muaf tutulmuştu ve karma değerin sahibi olan uygulama da muaf tutulmuştu.

Android 17'den itibaren koruma, WebOTP biçimli mesajlara da uygulanır. Bir uygulamanın SMS mesajlarını okuma izni varsa ancak alan doğrulamasıyla belirlendiği üzere WebOTP mesajının amaçlanan alıcısı değilse mesaj, alındıktan üç saat sonrasına kadar uygulamaya erişilemez. Bu değişiklik, yalnızca mesajda belirtilen alanla ilişkili uygulamaların doğrulama kodunu programatik olarak okuyabilmesini sağlayarak kullanıcı güvenliğini artırmayı amaçlamaktadır.

Bu üç saatlik gecikme süresinde SMS_RECEIVED_ACTION yayını engellenir ve SMS sağlayıcı veritabanı sorguları filtrelenir. SMS mesajı, gecikme süresinden sonra bu uygulamalarda kullanılabilir. Bu değişiklik, hedef API seviyelerinden bağımsız olarak tüm uygulamalar için geçerlidir.

Varsayılan SMS asistanı uygulaması ve bağlı cihaz yardımcı uygulamaları gibi belirli uygulamalar bu gecikmeden muaftır. OTP çıkarma için SMS mesajlarını okumaya dayalı tüm uygulamalar, işlevselliğin devam etmesini sağlamak için SMS Retriever veya SMS User Consent API'lerini kullanmaya geçmelidir.

Güvenlik

Android 17, cihaz ve uygulama güvenliğiyle ilgili aşağıdaki iyileştirmeleri içerir.

usesClearTraffic desteğini sonlandırma planı

Gelecekteki bir sürümde usesCleartextTraffic öğesinin desteğini sonlandırmayı planlıyoruz. Şifrelenmemiş (HTTP) bağlantılar oluşturması gereken uygulamalar, ağ güvenlik yapılandırması dosyası kullanmaya geçmelidir. Bu dosya, uygulamanızın hangi alan adlarına şifresiz metin bağlantıları oluşturması gerektiğini belirtmenize olanak tanır.

Ağ güvenlik yapılandırma dosyalarının yalnızca API seviyesi 24 ve sonraki sürümlerde desteklendiğini unutmayın. Uygulamanızın minimum API düzeyi 24'ten düşükse aşağıdakilerin ikisini de yapmanız gerekir:

  • usesCleartextTraffic özelliğini true olarak ayarlayın.
  • Ağ yapılandırma dosyası kullanma

Uygulamanızın minimum API düzeyi 24 veya daha yüksekse ağ yapılandırma dosyası kullanabilirsiniz ve usesCleartextTraffic şeklinde ayarlamanız gerekmez.

Örtülü URI izinlerini kısıtlama

Şu anda bir uygulama, ACTION_SEND, ACTION_SEND_MULTIPLE veya ACTION_IMAGE_CAPTURE işlemini içeren bir URI ile amaç başlattığında sistem, hedef uygulamaya okuma ve yazma URI izinlerini otomatik olarak verir. Android 18'den itibaren sistem bu izinleri otomatik olarak vermeyecek. Bu nedenle, uygulamaların sistemin ilgili URI izinlerini vermesini beklemek yerine bunları açıkça vermesini öneririz.

Uygulamanızda bu amaçların kullanımını tespit etmek için StrictMode ile detectImplicitUriPermissionGrant() kullanarak ihlali tetikleyin:

Kotlin

val policy = StrictMode.VmPolicy.Builder()
    .detectImplicitUriPermissionGrant()
    .penaltyLog()
    .build()
StrictMode.setVmPolicy(policy)

Java

StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder()
    .detectImplicitUriPermissionGrant()
    .penaltyLog()
    .build();
StrictMode.setVmPolicy(policy);

Alternatif olarak, sistem izni örtülü olarak ayarladığında görünen Please set the grant explicitly in the app mesajını içeren, kaydedilmiş istisnaları da izleyebilirsiniz. Aşağıdaki adb komutunu kullanarak bu günlükleri izleyebilirsiniz:

adb logcat | grep "Please set the grant explicitly in the app"

Gerekli izinleri açıkça vermek için ACTION_SEND ve ACTION_SEND_MULTIPLE amaçlarına FLAG_GRANT_READ_URI_PERMISSION işaretini ekleyin:

Kotlin

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

Java

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

ACTION_IMAGE_CAPTURE amaçları için hem FLAG_GRANT_READ_URI_PERMISSION hem de FLAG_GRANT_WRITE_URI_PERMISSION bayraklarını ekleyin:

Kotlin

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

Java

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

Uygulama başına anahtar deposu sınırları

Apps should avoid creating excessive numbers of keys in Android Keystore, because it is a shared resource for all apps on the device. Beginning with Android 17, the system enforces a limit on the number of keys an app can own. The limit is 50,000 keys for non-system apps targeting Android 17 (API level 37) or higher, and 200,000 keys for all other apps. System apps have a limit of 200,000 keys, regardless of which API level they target.

If an app attempts to create keys beyond the limit, the creation fails with a KeyStoreException. The exception's message string contains information about the key limit. If the app calls getNumericErrorCode() on the exception, the return value depends on what API level the app targets:

  • Apps targeting Android 17 (API level 37) or higher: getNumericErrorCode() returns the new ERROR_TOO_MANY_KEYS value.
  • All other apps: getNumericErrorCode() returns ERROR_INCORRECT_USAGE.

Profiller arası geri döngü trafiğini engelleme

Android 17'den itibaren, profiller arası geri döngü trafiğine varsayılan olarak izin verilmemektedir. Aynı profil içindeki geri döngü trafiği etkilenmez. Bu değişiklik, uygulamanın hedeflediği API düzeyinden bağımsız olarak Android 17 veya sonraki sürümlerde çalışan tüm uygulamalar için geçerlidir.

Kullanıcı deneyimi ve sistem arayüzü

Android 17, daha tutarlı ve sezgisel bir kullanıcı deneyimi oluşturmak için aşağıdaki değişiklikleri içerir.

Döndürme işleminden sonra varsayılan IME görünürlüğünü geri yükleme

Android 17'den itibaren, cihazın yapılandırması değiştiğinde (ör. döndürme yoluyla) ve bu değişiklik uygulamanın kendisi tarafından işlenmediğinde önceki IME görünürlüğü geri yüklenmez.

Uygulamanızın, işlemeyeceği bir yapılandırma değişikliğine uğraması ve değişiklikten sonra klavyenin görünür olması gerekiyorsa bunu açıkça istemeniz gerekir. Bu isteği aşağıdaki yöntemlerden biriyle yapabilirsiniz:

  • android:windowSoftInputMode özelliğini stateAlwaysVisible olarak ayarlayın.
  • Etkinliğinizin onCreate() yönteminde programatik olarak dokunmatik klavye isteğinde bulunun veya onConfigurationChanged() yöntemini ekleyin.

İnsan girdisi

Android 17, uygulamaların klavye ve dokunmatik yüzey gibi insan giriş cihazlarıyla etkileşimini etkileyen aşağıdaki değişiklikleri içerir.

Dokunmatik alanlar, işaretçi yakalama sırasında varsayılan olarak göreli etkinlikler sunar.

Beginning with Android 17, if an app requests pointer capture using View.requestPointerCapture() and the user uses a touchpad, the system recognizes pointer movement and scrolling gestures from the user's touches and reports them to the app in the same way as pointer and scroll wheel movements from a captured mouse. In most cases, this removes the need for apps that support captured mice to add special handling logic for touchpads. For more details, see the documentation for View.POINTER_CAPTURE_MODE_RELATIVE.

Previously, the system did not attempt to recognize gestures from the touchpad, and instead delivered the raw, absolute finger locations to the app in a similar format to touchscreen touches. If an app still requires this absolute data, it should call the new View.requestPointerCapture(int) method with View.POINTER_CAPTURE_MODE_ABSOLUTE instead.

Medya

Android 17, medya davranışıyla ilgili aşağıdaki değişiklikleri içerir.

Arka planda ses sağlamlaştırma

Beginning with Android 17, the audio framework enforces restrictions on background audio interactions including audio playback, audio focus requests, and volume change APIs to ensure that these changes are started intentionally by the user.

If the app tries to call audio APIs while the app is not in a valid lifecycle, the audio playback and volume change APIs fail silently without throwing an exception or providing a failure message. The audio focus API fails with the result code AUDIOFOCUS_REQUEST_FAILED.

For more information, including mitigation strategies, see Background audio hardening.

Bağlantı

Android 17, cihaz bağlantısını geliştirmek için aşağıdaki değişiklikleri içerir.

Bluetooth bağlantı kaybı durumunda otomatik olarak yeniden eşleme

Android 17, Bluetooth bağlantı kaybını otomatik olarak çözmek için tasarlanmış sistem düzeyinde bir geliştirme olan bağımsız yeniden eşlemeyi sunar.

Daha önce, bir bağlantı kaybolduğunda kullanıcıların çevre biriminin eşlemesini kaldırmak ve ardından yeniden eşlemek için Ayarlar'a manuel olarak gitmesi gerekiyordu. Bu özellik, Android 16'daki güvenlik iyileştirmesini temel alır. Kullanıcıların çevre birimlerinin eşlemesini kaldırmak ve yeniden eşlemek için Ayarlar'a manuel olarak gitmesini gerektirmeden sistemin arka planda bağları yeniden kurmasına olanak tanır.

Çoğu uygulama için kod değişikliği gerekmez ancak geliştiricilerin Bluetooth yığınındaki aşağıdaki davranış değişikliklerinden haberdar olması gerekir:

  • Yeni eşleme bağlamı: ACTION_PAIRING_REQUEST artık EXTRA_PAIRING_CONTEXT ekstrasını içeriyor. Bu ekstra, uygulamaların standart bir eşleme isteği ile otonom sistem tarafından başlatılan yeniden eşleme girişimi arasında ayrım yapmasına olanak tanır.
  • Koşullu anahtar güncellemeleri: Mevcut güvenlik anahtarları yalnızca yeniden eşleme başarılı olursa ve yeni bağlantı, önceki bağlantının güvenlik düzeyini karşılarsa veya aşarsa değiştirilir.
  • Değiştirilmiş amaç zamanlaması: ACTION_KEY_MISSING amacı artık yalnızca bağımsız yeniden eşleme girişimi başarısız olursa yayınlanır. Bu, sistem arka planda bağı başarıyla kurtarırsa uygulamadaki gereksiz hata işlemeyi azaltır.
  • Kullanıcı bildirimi: Sistem, yeni kullanıcı arayüzü bildirimleri ve iletişim kutuları aracılığıyla yeniden eşlemeyi yönetir. Kullanıcılardan, yeniden eşleme girişimini onaylamaları istenir. Böylece yeniden bağlantı kurulduğundan haberdar olurlar.

Çevre birimi üreticileri ve yardımcı uygulama geliştiricileri, donanım ve uygulamanın bağ geçişlerini sorunsuz bir şekilde gerçekleştirdiğini doğrulamalıdır. Bu davranışı test etmek için aşağıdaki yöntemlerden birini kullanarak uzaktan bağlantı kaybını simüle edin:

  • Bağlantı bilgilerini çevre biriminden manuel olarak kaldırma
  • Cihazın eşlemesini manuel olarak kaldırın: Ayarlar > Bağlı cihazlar