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 etmeniz ve geçerli olduğu durumlarda bu değişiklikleri destekleyecek şekilde değiştirmeniz gerekir.

Yalnızca Android 17'yi hedefleyen uygulamaları etkileyen davranış değişikliklerinin listesini de inceleyin.

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ı getirir. Bu sınırlar, kullanıcı arayüzünün takılmasına, pil tüketiminin artmasına ve uygulamaların kapatılmasına neden olan sistem genelinde kararsızlığı tetiklemeden önce bellek sızıntılarına ve diğer aykırı değerlere odaklanır. Uygulama oturumlarının büyük çoğunluğunda minimum etki beklesek de bellek için bir referans oluşturmak da dahil olmak üzere bellekle ilgili aşağıdaki en iyi uygulamaları öneririz.

Uygulama oturumunuzun etkilenip etkilenmediğini belirlemek için ApplicationExitInfo içinde getDescription yöntemini çağırabilirsiniz. Uygulamanız etkilendiyse çıkış nedeni REASON_OTHER olur ve açıklama, diğer bilgilerle birlikte "MemoryLimiter:AnonSwap" dizesini içerir. Bellek sınırına ulaşıldığında toplanan yığın dökümlerini almak için TRIGGER_TYPE_ANOMALY ile tetikleyici tabanlı profillemeyi de kullanabilirsiniz.

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

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

Bellek sınırları uygulayan cihazlarda bu sınırları ayarlamak veya devre dışı bırakmak için Android Debug Bridge (adb) aracını kullanabilirsiniz. am kabuk komutu, bellek sınırlarını ayarlamak için üç alt komut sağlar. (Bu komutların, bellek sınırları 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şlemlerde yaptırımı yoksayar. Ayrıca all (tüm uygulamaları yoksay) veya none (hiçbir uygulamayı yoksayma) değerini de iletebilirsiniz. none parametresini iletmek, am memory-limiter ignore için yapılan önceki çağrıları geçersiz kılar.

Bellek sınırlayıcıya bir UID'yi yoksaymasını söylerseniz am memory-limiter manual yöntemini çağırarak uygulamadaki bir işleme manuel bellek sınırı uygulayabilirsiniz.

manual

Sisteme, belirtilen PID (işlem kimliği) ile işleme bir bellek kısıtlaması uygulamasını söyler. Bellek kısıtlaması, MB cinsinden bir tam sayı olarak belirtilir. Örneğin, 30 değerinin iletilmesi, işlemin 30 MB bellek ile sınırlı olduğunu belirtir. max parametresini ilettiğinizde ilgili işlemdeki tüm bellek sınırları kaldırılır. none değerini iletmek, 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ına yönelik korumasını genişletiyor.

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

Android 17'den itibaren bu koruma, WebOTP biçimindeki mesajlara da uygulanır. Bir uygulamanın SMS mesajlarını okuma izni varsa ancak WebOTP mesajının hedef alıcısı değilse (alan doğrulamasıyla belirlenir) mesaj, alındıktan üç saat sonrasına kadar uygulama tarafından erişilemez. Bu değişiklik, yalnızca mesajda belirtilen alan adıyla 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ırasında SMS_RECEIVED_ACTION yayını bekletilir ve SMS sağlayıcı veritabanı sorguları filtrelenir. SMS mesajı, gecikmeden sonra bu uygulamalar tarafından kullanılabilir. Bu değişiklik, hedef API düzeyinden bağımsız olarak tüm uygulamalar için geçerlidir.

Varsayılan SMS asistan uygulaması, bağlı cihaz tamamlayıcı uygulamaları gibi belirli uygulamalar bu gecikmeden muaftır. OTP'yi ayıklamak için SMS mesajlarını okumaya dayalı tüm uygulamalar, işlevlerin devam etmesi için SMS Retriever veya SMS Kullanıcı Rızası 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ğinin sonlandırılmasıyla ilgili plan

Gelecekteki bir sürümde usesCleartextTraffic öğesini kullanımdan kaldırmayı planlıyoruz. Şifrelenmemiş (HTTP) bağlantılar kurması gereken uygulamalar, uygulamanızın hangi alan adlarıyla düz metin bağlantıları kurması gerektiğini belirtmenize olanak tanıyan bir ağ güvenliği yapılandırma dosyası kullanmaya geçmelidir.

Ağ güvenliği yapılandırma dosyalarının yalnızca API düzeyi 24 ve sonraki sürümlerde desteklendiğini unutmayın. Uygulamanızın minimum API düzeyi 24'ten düşükse aşağıdakilerin her 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 bir ağ yapılandırma dosyası kullanabilirsiniz ve usesCleartextTraffic değerini ayarlamanız gerekmez.

Dolaylı 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 intent başlatırsa sistem, hedef uygulamaya otomatik olarak okuma ve yazma URI izinlerini verir. Android 18'den itibaren sistem bu izinleri otomatik olarak vermeyecektir. Bu nedenle, uygulamaların sistemin izin vermesine güvenmek yerine ilgili URI izinlerini açıkça vermesini öneririz.

Uygulamanızda bu intent'lerin 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 örtülü bir şekilde izin verdiğinde görünen Please set the grant explicitly in the app mesajını içeren günlük kaydı yapılmış istisnaları 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 intent'lerine 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 işaretlerini 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 Keystore'da aşırı sayıda anahtar oluşturmaktan kaçınmalıdır. Android 17'den itibaren sistem, bir uygulamanın sahip olabileceği anahtar sayısına sınırlama getirir. Sınır, Android 17 (API düzeyi 37) veya sonraki sürümleri hedefleyen sistem dışı uygulamalar için 50.000 anahtar, diğer tüm uygulamalar için ise 200.000 anahtardır. Sistem uygulamaları, hedefledikleri API düzeyinden bağımsız olarak 200.000 anahtar sınırına sahiptir.

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 mesaj dizesi, anahtar sınırı hakkında bilgi içerir. Uygulama, istisna üzerinde getNumericErrorCode() yöntemini çağırırsa döndürülen değer, uygulamanın hedeflediği API düzeyine bağlıdır:

  • Android 17 (API düzeyi 37) veya sonraki sürümleri hedefleyen uygulamalar: getNumericErrorCode(), yeni ERROR_TOO_MANY_KEYS değerini döndürür.
  • Diğer tüm uygulamalar: getNumericErrorCode(), ERROR_INCORRECT_USAGE değerini döndürür.

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

Android 17'den itibaren, profiller arası geri döngü trafiğine varsayılan olarak izin verilmeyecek. Aynı profildeki 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 sunmak için aşağıdaki değişiklikleri içerir.

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

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

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

  • android:windowSoftInputMode özelliğini stateAlwaysVisible olarak ayarlayın.
  • Etkinliğinizin onCreate() yönteminde sanal klavyeyi programatik olarak isteyin veya onConfigurationChanged() yöntemini ekleyin.

İnsan girdisi

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

Dokunmatik alanlar, imleç yakalama sırasında varsayılan olarak göreceli etkinlikler sunar

Android 17'den itibaren, bir uygulama View.requestPointerCapture() kullanarak işaretçi yakalama isteğinde bulunursa ve kullanıcı dokunmatik alan kullanırsa sistem, kullanıcının dokunmalarından işaretçi hareketini ve kaydırma hareketlerini tanır ve bunları, yakalanan bir faredeki işaretçi ve kaydırma tekerleği hareketleriyle aynı şekilde uygulamaya bildirir. Çoğu durumda bu, yakalanan fareleri destekleyen uygulamaların dokunmatik alanlar için özel işleme mantığı ekleme ihtiyacını ortadan kaldırır. Daha fazla bilgi için View.POINTER_CAPTURE_MODE_RELATIVE ile ilgili belgelere bakın.

Sistem daha önce dokunmatik alandaki hareketleri algılamaya çalışmıyor, bunun yerine ham ve mutlak parmak konumlarını dokunmatik ekran dokunuşlarına benzer bir biçimde uygulamaya iletiyordu. Bir uygulama bu mutlak verileri gerektirmeye devam ediyorsa bunun yerine View.POINTER_CAPTURE_MODE_ABSOLUTE ile yeni View.requestPointerCapture(int) yöntemini çağırmalıdır.

Medya

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

Arka planda ses güçlendirme

Android 17'den itibaren ses çerçevesi, ses çalma, ses odağı istekleri ve ses seviyesi değiştirme API'leri dahil olmak üzere arka plandaki ses etkileşimlerine kısıtlamalar getirerek bu değişikliklerin kullanıcı tarafından bilinçli olarak başlatılmasını sağlar.

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 plan sesini güçlendirme başlıklı makaleyi inceleyin.

Bağlantı

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

Bluetooth bağlantı kayıpları için otonom yeniden eşleme

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

Daha önce, bağlantı koptuğ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'nın güvenlik iyileştirmesini temel alır. Sistemin, kullanıcıların çevre birimlerinin eşlemesini kaldırmak ve yeniden eşlemek için manuel olarak Ayarlar'a gitmesine gerek kalmadan arka planda bağları yeniden kurmasına olanak tanır.

Çoğu uygulama için kod değişikliği gerekmez ancak geliştiriciler, Bluetooth yığınındaki aşağıdaki davranış değişikliklerine dikkat etmelidir:

  • Yeni eşleme bağlamı: ACTION_PAIRING_REQUEST artık 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ıyan EXTRA_PAIRING_CONTEXT ek bilgisini içeriyor.
  • 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 seviyesini karşılarsa veya aşarsa değiştirilir.
  • Değiştirilen intent zamanlaması: ACTION_KEY_MISSING intent'i artık yalnızca otonom yeniden eşleme denemesi başarısız olursa yayınlanır. Bu sayede, sistem arka planda bağlantıyı başarıyla kurtarırsa uygulamada gereksiz hata işleme işlemleri azaltılır.
  • Kullanıcı bildirimi: Sistem, yeniden eşlemeyi yeni kullanıcı arayüzü bildirimleri ve iletişim kutuları aracılığıyla yönetir. Kullanıcılardan, yeniden bağlanma işleminden haberdar olduklarından emin olmak için yeniden eşleme girişimini onaylamaları istenir.

Çevre birimi üreticileri ve tamamlayıcı uygulama geliştiricileri, donanım ve uygulamanın eşleme 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 uzak bağlantı kaybını simüle edin:

  • Çevre birimindeki bağ bilgilerini manuel olarak kaldırma
  • Ayarlar > Bağlı cihazlar bölümüne giderek cihazın eşlemesini manuel olarak kaldırın.