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. Bu sınırlar, bellek sızıntılarına ve diğer aykırı değerlere odaklanarak sistem genelinde kararsızlığa yol açıp kullanıcı arayüzünün titremesine, pilin daha hızlı tükenmesine ve uygulamaların kapatılmasına neden olmalarını engeller. Uygulama oturumlarının büyük çoğunluğunun bu durumdan en az düzeyde etkileneceğini tahmin etsek de bellek için bir temel oluşturmak da dahil olmak üzere aşağıdaki en iyi bellek uygulamalarını kullanmanızı öneririz.
Uygulama oturumunuzun etkilenip etkilenmediğini ApplicationExitInfo içinde getDescription işlevini çağırarak belirleyebilirsiniz. Uygulamanız etkilenmişse çıkış nedeni REASON_OTHER olur ve açıklamada "MemoryLimiter:AnonSwap" dizesiyle birlikte diğer bilgiler 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
Bellek sınırlarını uygulayan cihazlarda bu sınırları ayarlamak veya devre dışı bırakmak için Android Debug Bridge'i (adb) kullanabilirsiniz. Kabuk komutu am
bellek sınırlarını ayarlamak için üç alt komut sağlar. (Bu komutlar, bellek sınırı olmayan cihazlarda etkili olmaz.)
am memory-limiter ignore <uid>|none|allam memory-limiter manual <pid> <limit>|max|noneam memory-limiter status
ignoreBellek 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) veyanone(hiçbir uygulamayı yoksayma) değerini de iletebilirsiniz.nonedeğerinin iletilmesi,am memory-limiter ignoreiç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 manualişlevini çağırarak uygulama içindeki bir işleme manuel bellek sınırı uygulayabilirsiniz.manualSisteme, belirtilen PID (işlem kimliği) ile işleme bellek kısıtlaması uygulama talimatı verir. Bellek kısıtlaması MB cinsinden bir tam sayı olarak belirtilir. Örneğin,
30iletildiğinde işlemin 30 MB bellek ile sınırlandırıldığı belirtilir.maxiletildiğinde bu işlemle ilgili tüm bellek sınırlamaları kaldırılır.noneiletildiğinde, süreçte belirlenen tüm manuel sınırlar kaldırılır ve sistemin varsayılan sınırı (varsa) geri yüklenir.statusBellek 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 开始,Android 将扩大对包含一次性密码 (OTP) 的短信的保护范围。
在之前的 Android 版本中,此保护主要侧重于 SMS Retriever 格式。对于大多数应用,包含 SMS Retriever 哈希的消息的递送延迟了 3 小时。不过,某些应用(例如默认短信处理程序)不受此延迟的影响,拥有哈希的应用也不受此延迟的影响。
从 Android 17 开始,此保护也适用于 WebOTP 格式的消息。如果应用有权读取短信,但不是 WebOTP 消息的预期接收者(由网域验证确定),则该应用在收到消息后 3 小时内无法访问该消息。此变更旨在提高用户安全性,确保只有与消息中提及的网域关联的应用才能以编程方式读取验证码。
在这 3 小时的延迟期间,系统会保留 SMS_RECEIVED_ACTION 广播,并过滤 短信提供商 数据库查询。延迟结束后,这些应用即可使用短信。此变更适用于
所有应用,无论其目标 API 级别如何。
某些应用(例如默认短信助理应用、关联设备配套应用等)不受此延迟的影响。所有依赖于读取短信 来提取 OTP 的应用都应过渡到使用 SMS Retriever 或 SMS User Consent API,以确保功能持续可用。
Güvenlik
Android 17, cihaz ve uygulama güvenliğiyle ilgili aşağıdaki iyileştirmeleri içerir.
usesClearTraffic desteğini sonlandırma planı
我们计划在未来的版本中弃用 usesCleartextTraffic 元素。需要建立未加密 (HTTP) 连接的应用应迁移为使用网络安全配置文件,该文件可让您指定应用需要与哪些网域建立明文连接。
请注意,网络安全配置文件仅在 API 级别 24 及更高版本中受支持。如果您的应用的最低 API 级别低于 24,您应执行以下两项操作:
- 将
usesCleartextTraffic属性设置为true - 使用网络配置文件
如果应用的最低 API 级别为 24 或更高,您可以使用网络配置文件,而无需设置 usesCleartextTraffic。
Ö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ı
Uygulamalar, cihazdaki tüm uygulamalar için paylaşılan bir kaynak olduğundan Android anahtar deposunda çok sayıda anahtar oluşturmaktan kaçınmalıdır. Android 17'den itibaren sistem, bir uygulamanın sahip olabileceği anahtar sayısını sınırlamaktadır. Android 17 (API düzeyi 37) veya sonraki sürümleri hedefleyen sistem dışı uygulamalar için sınır 50.000 anahtar, diğer tüm uygulamalar için ise 200.000 anahtardır. Sistem uygulamaları, hangi API düzeyini hedeflediklerinden bağımsız olarak 200.000 anahtarla sınırlıdır.
Bir uygulama sınırın üzerinde anahtar oluşturmaya çalışırsa oluşturma işlemi KeyStoreException ile başarısız olur. İstisnanın ileti dizesinde anahtar sınırı hakkında bilgiler yer alır. Uygulama, istisna durumunda getNumericErrorCode() çağrısı yaparsa döndürülen değer, uygulamanın hedeflediği API düzeyine bağlıdır:
- Android 17'yi (API düzeyi 37) veya sonraki sürümleri hedefleyen uygulamalar:
getNumericErrorCode()yeniERROR_TOO_MANY_KEYSdeğerini döndürür. - Diğer tüm uygulamalar:
getNumericErrorCode()döndürürERROR_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ğinistateAlwaysVisibleolarak ayarlayın.- Etkinliğinizin
onCreate()yönteminde programatik olarak dokunmatik klavye isteğinde bulunun veyaonConfigurationChanged()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.
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 开始,音频框架会对后台音频互动(包括音频播放、音频焦点请求和音量更改 API)强制执行限制,以确保这些更改是由用户有意发起的。
如果应用尝试在应用未处于有效生命周期时调用音频 API,则音频播放和音量更改 API 会以静默方式失败,而不会抛出异常或提供失败消息。音频焦点 API 会失败,并返回结果代码 AUDIOFOCUS_REQUEST_FAILED。
如需了解详情(包括缓解措施),请参阅后台音频安全加固。
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_REQUESTartıkEXTRA_PAIRING_CONTEXTekstrası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_MISSINGamacı 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