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 değerinden bağımsız olarak Android 16'da ç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 gibi 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ı

Starting in Android 16, we're adjusting regular and expedited job execution runtime quota based on the following factors:

  • Which app standby bucket the application is in: in Android 16, active standby buckets will start being enforced by a generous runtime quota.
  • If the job starts execution while the app is in a top state: in Android 16, Jobs started while the app is visible to the user and continues after the app becomes invisible, will adhere to the job runtime quota.
  • If the job is executing while running a Foreground Service: in Android 16, jobs that are executing concurrently with a foreground service will adhere to the job runtime quota. If you're leveraging jobs for user initiated data transfer, consider using user initiated data transfer jobs instead.

This change impacts tasks scheduled using WorkManager, JobScheduler, and DownloadManager. To debug why a job was stopped, we recommend logging why your job was stopped by calling WorkInfo.getStopReason() (for JobScheduler jobs, call JobParameters.getStopReason()).

For information about how your app's state affects the resources it can use, see Power management resource limits. For more information on battery-optimal best practices, refer to guidance on optimize battery use for task scheduling APIs.

We also recommend leveraging the new JobScheduler#getPendingJobReasonsHistory API introduced in Android 16 to understand why a job has not executed.

Testing

To test your app's behavior, you can enable override of certain job quota optimizations as long as the app is running on an Android 16 device.

To disable enforcement of "top state will adhere to job runtime quota", run the following adb command:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

To disable enforcement of "jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota", run the following adb command:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

To test certain app standby bucket behavior, you can set the app standby bucket of your app using the following adb command:

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

To understand the app standby bucket your app is in, you can get the app standby bucket of your app using the following adb command:

adb shell am get-standby-bucket APP_PACKAGE_NAME

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

The JobInfo.Builder#setImportantWhileForeground(boolean) method indicates the importance of a job while the scheduling app is in the foreground or when temporarily exempted from background restrictions.

This method has been deprecated since Android 12 (API level 31). Starting in Android 16, it no longer functions effectively and calling this method will be ignored.

This removal of functionality also applies to JobInfo#isImportantWhileForeground(). Starting in Android 16, if the method is called, the method returns false.

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 dahili değişiklikleri

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 引入了对 16 KB 内存页面的支持,以优化平台性能。Android 16 添加了兼容模式,让一些针对 4 KB 内存页面构建的应用可以在配置为 16 KB 内存页面的设备上运行。

当您的应用在搭载 Android 16 或更高版本的设备上运行时,如果 Android 检测到您的应用具有 4 KB 对齐的内存页面,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。如需使用 android:pageSizeCompat 属性,请使用 Android 16 SDK 编译您的应用。

为了实现最佳性能、可靠性和稳定性,应用仍应以 16 KB 对齐。如需了解详情,请参阅我们近期发布的博文,了解如何更新应用以支持 16 KB 的内存页面。

兼容模式对话框:当系统检测到 4 KB 对齐的应用在 16 KB 对齐的情况下可以更高效地运行时,系统会显示此对话框。

Kullanıcı deneyimi ve sistem 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ği sonlandırılıyor

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

替代方案示例:

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

3 düğmeli gezinme desteği

Android 16 brings predictive back support to the 3-button navigation for apps that have properly migrated to predictive back. Long-pressing the back button initiates a predictive back animation, giving you a preview of where the back swipe takes you.

This behavior applies across all areas of the system that support predictive back animations, including the system animations (back-to-home, cross-task, and cross-activity).

The predictive back animations in 3-button navigation mode.

Otomatik temalı uygulama simgeleri

从 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ılma işlemleri

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

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

按应用替换项

在搭载 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 korumak için sistem güvenliğini artıran değişiklikler içerir.

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

Android 16 针对一般的 Intent 重定向攻击提供了默认安全性,并且只需要最低限度的兼容性和开发者更改。

我们引入了默认安全加固解决方案,以应对 Intent 重定向漏洞。在大多数情况下,正常使用 intent 的应用不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会出现中断。

Intent 重定向在 Android 中出现,当攻击者可以部分或完全 控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,而受害应用会在 intent 的 extra 字段中启动不受信任的子级 intent。这可能会导致攻击者应用在受害应用的上下文中启动私有组件、触发特权操作或获取对敏感数据的 URI 访问权限,从而可能导致数据窃取和任意代码执行。

选择停用 intent 重定向处理

Android 16 引入了一个新 API,允许应用选择停用启动安全保护。在默认安全行为会干扰合法应用用例的特定情况下,这可能是必要的。

对于针对 Android 16(API 级别 36)SDK 或更高版本进行编译的应用

您可以直接对 Intent 对象使用 removeLaunchSecurityProtection() 方法。

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
对于针对 Android 15(API 级别 35)或更低版本进行编译的应用

虽然不建议这样做,但您可以使用反射来访问 removeLaunchSecurityProtection() 方法。

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 introduces a new behavior during companion device pairing flow to protect the user's location privacy from malicious apps. All companion apps running on Android 16 are no longer directly notified of discovery timeout using RESULT_DISCOVERY_TIMEOUT. Instead, the user is notified of timeout events with a visual dialog. When the user dismisses the dialog, the app is alerted of the association failure with RESULT_USER_REJECTED.

The search duration has also been extended from the original 20 seconds, and the device discovery can be stopped by the user at any point during the search. If at least one device was discovered within the first 20 seconds of starting the search, the CDM stops searching for additional devices.

Bağlantı

Android 16 (API düzeyi 36), çevre birimi cihazlarla 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'dan itibaren Bluetooth yığını, uzak bağlantı kaybı algılandığında güvenliği ve kullanıcı deneyimini iyileştirmek için güncellendi. Daha önce sistem, bağı otomatik olarak kaldırır ve yeni bir eşleme işlemi başlatırdı. Bu da istemeden yeniden eşlemeye neden olabilirdi. Birçok durumda, uygulamaların bağ kaybı etkinliğini tutarlı bir şekilde ele almadığını tespit ettik.

Android 16, deneyimi birleştirmek için sistemde bağ kaybının ele alınmasını iyileştirdi. Daha önce bağlanmış bir Bluetooth cihazı yeniden bağlandığında kimliği doğrulanamazsa sistem bağlantıyı keser, yerel bağlantı bilgilerini saklar ve kullanıcıları bağlantı kaybı hakkında bilgilendirip yeniden eşlemeye yönlendiren bir sistem iletişim kutusu gösterir.