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 引入了基于设备总 RAM 的应用内存限制,旨在为您的应用和 Android 用户打造更稳定、更具确定性的环境。这些限制侧重于在内存泄漏和其他异常值触发系统范围的不稳定性(导致界面卡顿、电池耗电量增加和应用被终止)之前,对其进行限制。虽然我们预计对绝大多数应用会话的影响很小,但我们建议您遵循以下内存最佳实践,包括建立内存基准。
您可以在 ApplicationExitInfo 中调用
getDescription,以确定您的应用会话是否受到影响;如果您的应用受到
影响,退出原因将为 REASON_OTHER,并且
说明将包含字符串 "MemoryLimiter:AnonSwap" 以及
其他信息。您还可以使用基于触发器的分析(使用
TRIGGER_TYPE_ANOMALY)来获取在达到
内存限制时收集的堆转储。
“管理应用内存”文档提供了相关信息 可帮助您诊断应用的内存问题并优化其资源 消耗。
在内存限制下测试应用的行为
您可以使用 Android 调试桥 (adb) 调整或停用对任何设备施加的
内存限制。Shell 命令 am 提供了三个子命令来调整内存限制。(这些命令对未施加内存限制的设备没有影响。)
am memory-limiter ignore <uid>|none|allam memory-limiter manual <pid> <limit>|max|noneam memory-limiter status
ignore指示内存限制器忽略部分或所有进程。 传递 UID(Android 用户 ID) 会指示内存限制器 忽略对与该 UID 相关联的所有进程的强制执行。 您还可以传递
all(忽略所有应用)或none(不忽略任何应用)。 传递none会替换之前对am memory-limiter ignore的任何调用。如果您指示内存限制器忽略某个 UID,您仍然可以通过调用
am memory-limiter manual对应用中的进程应用手动内存限制。manual指示系统对具有指定 PID(进程 ID)的进程施加内存限制。内存限制以整数形式的 MB 数指定;例如,传递
30指定进程的内存限制为 30 MB。传递max会移除对该进程的所有内存限制。 传递none会移除对该进程设置的任何手动限制,从而恢复系统的默认限制(如果有)。status报告内存限制器的当前状态。该状态包括对可见和不可见进程施加的内存限制。
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ğinitrueolarak 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ı
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'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_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