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

Android 16 platformunda, uygulamanızı etkileyebilecek davranış değişiklikleri vardır. Aşağıdaki davranış değişiklikleri, targetSdkVersion'ten bağımsız olarak Android 16'da çalıştırılan tüm uygulamalar için geçerlidir. Uygulamanızı test etmeniz ve ardından geçerli olduğu durumlarda bu değişiklikleri desteklemek için gerektiği gibi değiştirmeniz gerekir.

Yalnızca Android 16'yı hedefleyen uygulamaları etkileyen davranış değişiklikleri listesini de inceleyin.

Temel işlevler

Android 16, Android sisteminin çeşitli temel özelliklerini değiştiren veya genişleten aşağıdaki değişiklikleri içerir.

JobScheduler kota optimizasyonları

从 Android 16 开始,我们将根据以下因素调整常规作业和加急作业执行运行时配额:

  • 应用位于哪个应用待机分桶:在 Android 16 中,系统将开始使用充足的运行时配额来强制执行处于活动状态的待机分桶。
  • 如果作业在应用处于顶部状态时开始执行:在 Android 16 中,如果作业在应用对用户可见时启动,并在应用变为不可见后继续执行,则将遵循作业运行时配额。
  • 如果作业在运行前台服务时执行:在 Android 16 中,与前台服务同时执行的作业将遵循作业运行时配额。如果您要使用作业进行用户发起的数据传输,请考虑改用用户发起的数据传输作业

此更改会影响使用 WorkManager、JobScheduler 和 DownloadManager 调度的任务。如需调试作业停止的原因,我们建议您通过调用 WorkInfo.getStopReason() 来记录作业停止的原因(对于 JobScheduler 作业,请调用 JobParameters.getStopReason())。

如需详细了解有关延长电池续航时间的最佳实践,请参阅有关优化任务调度 API 的电池用量的指南。

我们还建议您利用 Android 16 中引入的新 JobScheduler#getPendingJobReasonsHistory API 来了解作业未执行的原因。

测试

如需测试应用的行为,您可以启用替换特定作业配额优化,前提是应用在 Android 16 设备上运行。

如需停用强制执行“顶部状态将遵守作业运行时配额”政策,请运行以下 adb 命令:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

如需停用强制执行“与前台服务同时执行的作业将遵守作业运行时配额”政策,请运行以下 adb 命令:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

如需测试特定的应用待机分桶行为,您可以使用以下 adb 命令设置应用的应用待机分桶:

adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted

如需了解应用所在的应用待机分桶,您可以使用以下 adb 命令获取应用的应用待机分桶:

adb shell am get-standby-bucket APP_PACKAGE_NAME

Terk edilmiş boş işlerin durdurulma nedeni

İşle ilişkili JobParameters nesnesi çöp toplandıysa ancak iş tamamlandığını belirtmek için JobService#jobFinished(JobParameters, boolean) çağrılmadıysa iş terk edilmiş olur. Bu, işin uygulamanın bilgisi olmadan çalıştığını ve yeniden planlandığını gösterir.

JobScheduler'ı kullanan uygulamalar JobParameters nesnesine güçlü bir referans sağlamaz ve zaman aşımı artık STOP_REASON_TIMEOUT yerine yeni iş durdurma nedeni STOP_REASON_TIMEOUT_ABANDONED ile verilir.

Yeni terk edilmiş duraklatma nedeni sık sık gerçekleşirse sistem, iş sıklığını azaltmak için azaltma adımları atar.

Uygulamalar, terk edilmiş işleri tespit edip azaltmak için yeni durdurma nedenini kullanmalıdır.

WorkManager, AsyncTask veya DownloadManager kullanıyorsanız bu API'ler iş yaşam döngüsünü uygulamanız adına yönettiğinden bu değişiklikten etkilenmezsiniz.

JobInfo#setImportantWhileForeground desteğinin tamamen sonlandırılması

JobInfo.Builder#setImportantWhileForeground(boolean) yöntemi, planlama uygulaması ön plandayken veya geçici olarak arka plan kısıtlamalarından muafken bir işin önemini belirtir.

Bu yöntem, Android 12 (API düzeyi 31) sürümünden itibaren kullanımdan kaldırılmıştır. Android 16'dan itibaren bu yöntem artık etkili bir şekilde çalışmaz ve bu yöntem çağrılırsa yoksayılır.

Bu işlev kaldırma işlemi JobInfo#isImportantWhileForeground() için de geçerlidir. Android 16'dan itibaren, yöntem çağrılırsa false döndürülür.

Sıralı yayın önceliği kapsamı artık global değil

Android uygulamalarının, alıcılara yayını alma ve işleme sırasını kontrol etmek için yayın alıcılarında öncelikleri tanımlamasına izin verilir. Manifestte tanımlanan alıcılarda uygulamalar önceliği tanımlamak için android:priority özelliğini, bağlamda kaydedilen alıcılarda ise IntentFilter#setPriority() API'yi kullanabilir. Bir yayın gönderildiğinde sistem, yayını öncelik sırasına göre (en yüksekten en düşüğe) alıcılara iletir.

Android 16'da, farklı işlemlerde android:priority özelliğini veya IntentFilter#setPriority() değerini kullanan yayın sırası garanti edilmez. Yayın önceliklerine tüm süreçlerde değil, yalnızca aynı başvuru sürecinde uyulur.

Ayrıca yayın öncelikleri otomatik olarak (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1) aralığına sınırlandırılır. Yalnızca sistem bileşenlerinin SYSTEM_LOW_PRIORITY, SYSTEM_HIGH_PRIORITY'ü yayın önceliği olarak ayarlamasına izin verilir.

Uygulamanız aşağıdakilerden birini yapıyorsa bu durumdan etkilenebilir:

  1. Uygulamanız aynı yayın intent'iyle birden fazla işlem tanımladı ve bu intent'leri önceliğe göre belirli bir sırada alma konusunda beklentileri var.
  2. Başvuru süreciniz diğer süreçlerle etkileşim kurar ve belirli bir sırada yayın amacı almayla ilgili beklentileri vardır.

İşlemlerin birbiriyle koordinasyon kurması gerekiyorsa diğer koordinasyon kanallarını kullanarak iletişim kurmalıdır.

ART'daki dahili değişiklikler

Android 16, Android Runtime'da (ART) performansı artıran ve ek Java özellikleri için destek sağlayan en son güncellemeleri içerir. Google Play sistem güncellemeleri sayesinde bu iyileştirmeler, Android 12 (API düzeyi 31) ve sonraki sürümleri çalıştıran bir milyardan fazla cihazda da kullanılabilir.

Bu değişiklikler kullanıma sunulduğunda, ART'nin dahili yapılarına dayanan kitaplıklar ve uygulama kodları, Android 16 çalıştıran cihazların yanı sıra Google Play sistem güncellemeleri aracılığıyla ART modülünü güncelleyen önceki Android sürümlerinde düzgün çalışmayabilir.

Dahili yapılara (ör. SDK dışı arayüzler) güvenmek her zaman uyumluluk sorunlarına yol açabilir. Ancak ART değişiklikleri cihazın çalıştığı platform sürümüne bağlı olmadığı ve Google Play sistem güncellemeleri aracılığıyla bir milyardan fazla cihaza dağıtıldığı için özellikle dahili ART yapılarından yararlanan koda (veya kod içeren kitaplıklara) güvenmekten kaçınmak önemlidir.

Tüm geliştiriciler, uygulamalarını Android 16'da ayrıntılı bir şekilde test ederek uygulamalarının etkilenip etkilenmediğini kontrol etmelidir. Ayrıca, uygulamanızın dahili ART yapılarına dayalı olarak tespit ettiğimiz kitaplıklara bağımlı olup olmadığını görmek için bilinen sorunları kontrol edin. Etkilenen uygulama kodunuz veya kitaplık bağımlılıklarınız varsa mümkün olduğunda herkese açık API alternatifleri arayın ve sorun takipçimizde özellik isteği oluşturarak yeni kullanım alanları için herkese açık API'ler isteyin.

16 KB sayfa boyutu uyumluluk modu

Android 15, platformun performansını optimize etmek için 16 KB bellek sayfası desteğini kullanıma sundu. Android 16, 4 KB bellek sayfaları için geliştirilmiş bazı uygulamaların 16 KB bellek sayfaları için yapılandırılmış bir cihazda çalışmasına olanak tanıyan bir uyumluluk modu ekler.

Android, uygulamanızda 4 KB'lık hizalanmış bellek sayfaları olduğunu algılarsa otomatik olarak uyumluluk modunu kullanır ve kullanıcıya bir bildirim iletişim kutusu gösterir. Geriye dönük uyumluluk modunu etkinleştirmek için AndroidManifest.xml içindeki android:pageSizeCompat mülkünü ayarlamak, uygulamanız başlatıldığında iletişim kutusunun gösterilmesini engeller. En iyi performans, güvenilirlik ve kararlılık için uygulamanız 16 KB'ya hizalanmış olmalıdır. Uygulamalarınızı 16 KB bellek sayfalarını destekleyecek şekilde güncellemeyle ilgili daha fazla bilgi için son blog yayınımıza göz atın.

Sistem, 4 KB'lık bir uygulamanın 16 KB'lık bir uygulamayla daha uyumlu çalışabileceğini tespit ettiğinde görüntülenen uyumluluk modu iletişim kutusu.

Kullanıcı deneyimi ve sistem kullanıcı arayüzü

Android 16, daha tutarlı ve sezgisel bir kullanıcı deneyimi sunmak için tasarlanmış aşağıdaki değişiklikleri içerir.

Kullanımı engelleyen erişilebilirlik duyurularının desteği sonlandırılıyor

Android 16, announceForAccessibility kullanımı veya TYPE_ANNOUNCEMENT erişilebilirlik etkinliklerinin gönderilmesiyle karakterize edilen erişilebilirlik duyurularını desteklememektedir. Bu durum, TalkBack ve Android'in ekran okuyucusunun kullanıcıları için tutarsız kullanıcı deneyimleri oluşturabilir. Alternatifler ise Android'in çeşitli yardımcı teknolojileri genelinde daha geniş bir kullanıcı ihtiyacı yelpazesine daha iyi hizmet eder.

Alternatiflere örnekler:

Kullanımdan kaldırılan announceForAccessibility API'nin referans dokümanlarında, önerilen alternatifler hakkında daha fazla bilgi verilmektedir.

3 düğmeli gezinme desteği

Android 16, tahmini geriye doğru geçişi doğru şekilde gerçekleştiren uygulamalarda 3 düğmeli gezinme için tahmini geri desteği sunar. Geri düğmesine uzun bastığınızda tahmini geri animasyonu başlatılır. Bu animasyon, geri kaydırmanın sizi nereye götüreceğinin önizlemesini gösterir.

Bu davranış, sistem animasyonları (ana sayfaya geri gitme, görevler arası ve etkinlikler arası) dahil olmak üzere sistemin tahmine dayalı geri animasyonlarını destekleyen tüm alanlarında geçerlidir.

3 düğmeli gezinme modundaki tahmine dayalı geri hareketi animasyonları.

Güvenlik

Android 16, uygulamaları ve kullanıcıları kötü amaçlı uygulamalardan korumaya yardımcı olmak için sistem güvenliğini destekleyen değişiklikler içerir.

Intent yönlendirme saldırılarına karşı gelişmiş güvenlik

Android 16, minimum uyumluluk ve geliştirici değişiklikleri gerektiren genel Intent yönlendirme saldırılarına karşı varsayılan güvenlik sağlar.

Yönlendirme kötüye kullanımlarına karşı varsayılan olarak güvenlik sağlamlaştırma çözümleri sunuyoruz.Intent Intent kullanan uygulamalar çoğu durumda uyumluluk sorunları yaşamaz. Hangi uygulamaların kesinti yaşayabileceğini izlemek için geliştirme sürecimiz boyunca metrikler topladık.

Android'de Intent yönlendirmesi, saldırgan bir uygulamanın, güvenlik açığı olan bir uygulama bağlamında yeni bir bileşeni başlatmak için kullanılan Intent'in içeriğini kısmen veya tamamen kontrol edebilmesi ve kurban uygulamanın da bir ("üst düzey") Intent'in ekstralar alanında güvenilmeyen bir alt düzey Intent'i başlatması durumunda gerçekleşir. Bu durum, saldırgan uygulamasının kurban uygulaması bağlamında özel bileşenler başlatmasına, ayrıcalıklı işlemleri tetiklemesine veya hassas verilere URI erişimi elde etmesine neden olabilir. Bu da veri hırsızlığına ve keyfi kod yürütmeye yol açabilir.

Intent yönlendirme işlevini devre dışı bırakma

Android 16, uygulamaların lansman güvenlik korumalarını devre dışı bırakmasına olanak tanıyan yeni bir API'yi kullanıma sunar. Bu, varsayılan güvenlik davranışının meşru uygulama kullanım alanlarını etkilediği belirli durumlarda gerekli olabilir.

Android 16 SDK'sı veya sonraki sürümler kullanılarak derlenen uygulamalar için

Intent nesnesinde doğrudan removeLaunchSecurityProtection() yöntemini kullanabilirsiniz.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
Android 15 (API düzeyi 35) veya önceki sürümlere göre derlenen uygulamalar için

Önerilmez ancak removeLaunchSecurityProtection() yöntemine erişmek için yansımayı kullanabilirsiniz.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
    val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
    removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
    // Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }