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

Android 16 platformu, uygulamanızı etkileyebilecek davranış değişiklikleri içerir. Aşağıdaki davranış değişiklikleri, targetSdkVersion'den bağımsız olarak Android 16'da çalıştırılan tüm uygulamalar için geçerlidir. Uygulamanızı test etmeli ve ardından, geçerli olduğu durumlarda bu değişiklikleri desteklemek için gerektiği şekilde değiştirmelisiniz.

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

Temel işlevler

Android 16 (API düzeyi 36), 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'dan itibaren, normal ve hızlandırılmış iş yürütme çalışma süresi kotasını aşağıdaki faktörlere göre ayarlıyoruz:

  • Uygulamanın bulunduğu uygulama bekleme grubu: Android 16'da, etkin bekleme grupları geniş bir çalışma süresi kotasıyla uygulanmaya başlayacaktır.
  • İş, uygulama üst durumdayken çalışmaya başlarsa: Android 16'da, uygulama kullanıcı tarafından görünür durumdayken başlatılan ve uygulama görünmez hale geldikten sonra devam eden işler, iş çalışma süresi kotasına uyar.
  • İş, bir ön plan hizmeti çalışırken yürütülüyorsa: Android 16'da, bir ön plan hizmetiyle eşzamanlı olarak yürütülen işler iş çalışma süresi kotasına uyar. Kullanıcı tarafından başlatılan veri aktarımı için işlerden yararlanıyorsanız bunun yerine kullanıcı tarafından başlatılan veri aktarım işlerini kullanmayı düşünebilirsiniz.

Bu değişiklik, WorkManager, JobScheduler ve DownloadManager kullanılarak planlanan görevleri etkiler. Bir işin neden durdurulduğunu hata ayıklamak için WorkInfo.getStopReason()'u çağırarak işinizin neden durdurulduğunu kaydetmenizi öneririz (JobScheduler işleri için JobParameters.getStopReason()'i çağırın).

Uygulamanızın durumunun kullanabileceği kaynakları nasıl etkilediği hakkında bilgi edinmek için Güç yönetimi kaynak sınırları başlıklı makaleyi inceleyin. Pil kullanımı için en iyi uygulamalar hakkında daha fazla bilgi edinmek isterseniz görev planlama API'leri için pil kullanımını optimize etme konulu makaleyi inceleyin.

Ayrıca, bir işin neden yürütülmediğini anlamak için Android 16'da kullanıma sunulan yeni JobScheduler#getPendingJobReasonsHistory API'den yararlanmanızı öneririz.

Test

Uygulamanızın davranışını test etmek için uygulama Android 16 cihazda çalışıyorsa belirli iş kotası optimizasyonlarının geçersiz kılınmasını etkinleştirebilirsiniz.

"Üst durum, iş çalışma zamanı kotasına bağlı olacak" kuralının uygulanmasını devre dışı bırakmak için aşağıdaki adb komutunu çalıştırın:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

"Ön plan hizmetiyle eşzamanlı olarak yürütülen işler, iş çalışma süresi kotasına uymalıdır" kuralının uygulanmasını devre dışı bırakmak için aşağıdaki adb komutunu çalıştırın:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

Belirli uygulama bekleme grubu davranışlarını test etmek için aşağıdaki adb komutunu kullanarak uygulamanızın uygulama bekleme grubunu ayarlayabilirsiniz:

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

Uygulamanızın bulunduğu uygulama bekleme grubunu anlamak için aşağıdaki adb komutunu kullanarak uygulamanızın uygulama bekleme grubunu alabilirsiniz:

adb shell am get-standby-bucket APP_PACKAGE_NAME

Boş işlerin bırakılma 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 tamamen kullanımdan kaldırılıyor

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 ile ilgili 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.

Uygulamanız Android 16 veya sonraki bir sürümün yüklü olduğu bir cihazda çalışırken 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. AndroidManifest.xml özelliğini AndroidManifest.xml içinde geriye dönük uyumluluk modunu etkinleştirecek şekilde ayarlamak, uygulamanız başlatıldığında iletişim kutusunun gösterilmesini engeller.android:pageSizeCompat android:pageSizeCompat mülkünü kullanmak için uygulamanızı Android 16 SDK'sını kullanarak derleyin.

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 optimal şekilde ç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 (API düzeyi 36), daha tutarlı ve sezgisel bir kullanıcı deneyimi oluşturmak için aşağıdaki değişiklikleri içerir.

Kullanımı engelleyen erişilebilirlik duyurularının desteğinin sonlandırılması

Android 16 废弃了无障碍功能通告,其特征是使用 announceForAccessibility 或调度 TYPE_ANNOUNCEMENT 无障碍功能事件。这可能会给 TalkBack 和 Android 屏幕阅读器用户带来不一致的用户体验,而替代方案可以更好地满足各种 Android 辅助技术的用户需求。

替代方案示例:

已废弃的 announceForAccessibility API 的参考文档中包含有关建议替代方案的更多详细信息。

3 düğmeli gezinme desteği

Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。

此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。

“三按钮”导航模式下的预测性返回动画。

3 düğmeli gezinme desteği

从 Android 16 QPR 2 开始,Android 会自动将主题应用于应用图标,以打造一致的主屏幕体验。如果应用未提供自己的带主题的应用图标,就会发生这种情况。应用可以通过在自适应图标中添加单色图层来控制主题化应用图标的设计,并在 Android Studio 中预览应用图标的外观。

Cihaz form faktörleri

Android 16 (API düzeyi 36), sanal cihaz sahipleri tarafından ekranlara yansıtılan uygulamalar için aşağıdaki değişiklikleri içerir.

Sanal cihaz sahibinin geçersiz kılmaları

虚拟设备所有者是创建和管理虚拟设备的受信任应用或特权应用。虚拟设备所有者在虚拟设备上运行应用,然后将应用投影到远程设备的显示屏上,例如个人电脑、虚拟现实设备或车载信息娱乐系统。虚拟设备所有者位于本地设备上,例如手机。

手机上的虚拟设备所有者创建将应用投影到远程显示屏的虚拟设备。

按应用替换项

在搭载 Android 16(API 级别 36)的设备上,虚拟设备所有者可以替换其管理的特定虚拟设备上的应用设置。例如,为了改进应用布局,虚拟设备所有者在将应用投影到外部显示屏上时,可以忽略屏幕方向、宽高比和可调整大小性限制。

常见的重大更改

Android 16 行为可能会影响应用在汽车显示屏或 Chromebook 等大屏幕设备上的界面,尤其是那些专为竖屏小显示屏设计的布局。如需了解如何让应用适应所有设备类型,请参阅关于自适应布局

参考编号

配套应用串流

Güvenlik

Android 16 (API düzeyi 36), uygulamaları ve kullanıcıları kötü amaçlı uygulamalardan korumaya yardımcı olmak için sistem güvenliğini artıran değişiklikler içerir.

Niyet yönlendirme saldırılarına karşı daha iyi güvenlik

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

Intent yönlendirme açıklarına karşı varsayılan olarak güvenlik sağlamlaştırma çözümleri sunuyoruz. Çoğu durumda, amaçları kullanan uygulamalarda normalde herhangi bir uyumluluk sorunu yaşanmaz. Hangi uygulamalarda bozulma olabileceğini izlemek için geliştirme sürecimiz boyunca metrikler topladık.

Android'de Intent yönlendirmesi, saldırganın savunmasız bir uygulama bağlamında yeni bir bileşeni başlatmak için kullanılan bir Intent'in içeriğini kısmen veya tamamen kontrol edebildiği, kurban uygulamanın ise bir ("üst düzey") Intent'in ekstralar alanında güvenilmeyen bir alt düzey Intent başlattığı durumlarda 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 kazanmasına yol açabilir. Bu da veri hırsızlığına ve rastgele kod yürütmeye neden olabilir.

Intent yönlendirme işleme özelliğini devre dışı bırakma

Android 16, uygulamaların başlatma güvenlik korumalarını devre dışı bırakmasına olanak tanıyan yeni bir API sunuyor. Bu, varsayılan güvenlik davranışının meşru uygulama kullanım alanlarını engellediği belirli durumlarda gerekli olabilir.

Android 16 (API düzeyi 36) SDK'sı veya sonraki sürümlerine karşı 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

Önerilmese de removeLaunchSecurityProtection() yöntemine erişmek için yansıtma 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) }

Tamamlayıcı uygulamalar artık keşif zaman aşımları hakkında bildirim almayacak

Android 16, kullanıcının konum gizliliğini kötü amaçlı uygulamalardan korumak için yardımcı cihaz eşleme akışında yeni bir davranış sunar. Android 16'da çalışan tüm tamamlayıcı uygulamalar artık RESULT_DISCOVERY_TIMEOUT kullanılarak keşif zaman aşımı hakkında doğrudan bilgilendirilmez. Bunun yerine, kullanıcıya görsel bir iletişim kutusu gösterilerek zaman aşımı etkinlikleri bildirilir. Kullanıcı iletişim kutusunu kapattığında uygulama, RESULT_USER_REJECTED ile ilişkilendirme hatası konusunda uyarılır.

Arama süresi de orijinal 20 saniyeden uzatıldı ve cihaz bulma işlemi, arama sırasında kullanıcı tarafından herhangi bir noktada durdurulabilir. Aramanın başlatılmasından sonraki ilk 20 saniye içinde en az bir cihaz bulunursa CDM başka cihaz aramayı durdurur.

Bağlantı

Android 16 (API düzeyi 36), çevre birimi cihazlarıyla bağlantıyı iyileştirmek için Bluetooth yığınında aşağıdaki değişiklikleri içerir.

Geliştirilmiş bağ kaybı işleme

从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。

为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。