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ı

Beginning with Android 17, Android is expanding its protection for SMS messages containing one-time passwords (OTP).

In previous versions of Android, this protection was primarily focused on the SMS Retriever format. Delivery of messages containing an SMS retriever hash was delayed for most apps for three hours. However, certain apps (like the default SMS handler) were exempt from the delay, and the app that owned the hash was also exempted.

Beginning with Android 17, the protection is also applied to WebOTP format messages. If an app has permission to read SMS messages but is not the intended recipient of a WebOTP message (as determined by domain verification), the message is not accessible to the app until three hours after the message's receipt. This change is intended to improve user security by ensuring that only apps associated with the domain mentioned in the message can programmatically read the verification code.

During this three hour delay, the SMS_RECEIVED_ACTION broadcast is withheld and SMS provider database queries are filtered. The SMS message is available to these apps after the delay. This change applies to all apps, regardless of their target API level.

Certain apps such as the default SMS assistant app, connected device companion apps, etc., are exempted from this delay. All apps that rely on reading SMS messages for OTP extraction should transition to using SMS Retriever or SMS User Consent APIs to ensure continued functionality.

Güvenlik

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

usesClearTraffic desteğini sonlandırma planı

In a future release, we plan to deprecate the usesCleartextTraffic element. Apps that need to make unencrypted (HTTP) connections should migrate to using a network security configuration file, which lets you specify which domains your app needs to make cleartext connections to.

Be aware that network security configuration files are only supported on API levels 24 and higher. If your app has a minimum API level lower than 24, you should do both of the following:

  • Set the usesCleartextTraffic attribute to true
  • Use a network configuration file

If your app's minimum API level is 24 or higher, you can use a network configuration file and you don't need to set usesCleartextTraffic.

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

Currently, if an app launches an intent with a URI that has the action ACTION_SEND, ACTION_SEND_MULTIPLE, or ACTION_IMAGE_CAPTURE, the system automatically grants the read and write URI permissions to the target app. Starting in Android 18, the system will no longer automatically grant these permissions. For this reason, we recommend that apps explicitly grant the relevant URI permissions instead of relying on the system to grant them.

To detect the usage of these intents in your app, use StrictMode with detectImplicitUriPermissionGrant() to trigger a violation:

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);

Alternatively, you can monitor for logged exceptions containing the message Please set the grant explicitly in the app that appears when system implicitly sets the grant. You can monitor for these logs using the following adb command:

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

To explicitly grant the necessary permissions, add the FLAG_GRANT_READ_URI_PERMISSION flag to ACTION_SEND and ACTION_SEND_MULTIPLE intents:

Kotlin

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

Java

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

Include both FLAG_GRANT_READ_URI_PERMISSION and FLAG_GRANT_WRITE_URI_PERMISSION flags for ACTION_IMAGE_CAPTURE intents:

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

Beginning with Android 17, when the device's configuration changes (for example, through rotation), and this is not handled by the app itself, the previous IME visibility is not restored.

If your app undergoes a configuration change that it does not handle, and the app needs the keyboard to be visible after the change, you must explicitly request this. You can make this request in one of the following ways:

  • Set the android:windowSoftInputMode attribute to stateAlwaysVisible.
  • Programmatically request the soft keyboard in your activity's onCreate() method, or add the onConfigurationChanged() method.

İ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.

Android 17'den itibaren bir uygulama View.requestPointerCapture() kullanarak işaretçi yakalama isteğinde bulunursa ve kullanıcı dokunmatik yüzey kullanırsa sistem, kullanıcının dokunuşlarından işaretçi hareketini ve kaydırma hareketlerini tanır ve bunları, yakalanan bir fareden gelen işaretçi ve kaydırma tekerleği hareketleriyle aynı şekilde uygulamaya bildirir. Çoğu durumda bu, yakalanan fareleri destekleyen uygulamaların dokunmatik yüzeyler için özel işleme mantığı eklemesini gerektirmez. Daha fazla bilgi için View.POINTER_CAPTURE_MODE_RELATIVE dokümanlarına bakın.

Daha önce sistem, dokunma yüzeyindeki hareketleri tanımaya çalışmıyordu. Bunun yerine, parmakların ham ve mutlak konumlarını dokunmatik ekran dokunuşlarına benzer bir biçimde uygulamaya iletiyordu. Bir uygulama hâlâ bu mutlak verileri gerektiriyorsa bunun yerine View.requestPointerCapture(int) yöntemini View.POINTER_CAPTURE_MODE_ABSOLUTE ile çağırmalıdır.

Medya

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

Arka planda ses sağlamlaştırma

Android 17'den itibaren ses çerçevesi, bu değişikliklerin kullanıcı tarafından kasıtlı olarak başlatılmasını sağlamak için ses çalma, ses odağı istekleri ve ses seviyesi değişikliği API'leri dahil olmak üzere arka plandaki ses etkileşimleriyle ilgili kısıtlamalar uygular.

Uygulama geçerli bir yaşam döngüsünde değilken ses API'lerini çağırmaya çalışırsa ses çalma ve ses seviyesi değiştirme API'leri, istisna oluşturmadan veya hata mesajı vermeden sessizce başarısız olur. Ses odağı API'si, AUDIOFOCUS_REQUEST_FAILED sonuç koduyla başarısız oluyor.

Azaltma stratejileri de dahil olmak üzere daha fazla bilgi için Arka planda ses sağlamlaştırma başlıklı makaleyi inceleyin.

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