Changements de comportement : toutes les applications

La plate-forme Android 16 apporte des modifications de comportement susceptibles d'affecter votre application. Les modifications de comportement suivantes s'appliquent à toutes les applications lorsqu'elles s'exécutent sur Android 16, peu importe la targetSdkVersion. Vous devez tester votre application, puis la modifier si nécessaire afin de prendre en charge ces modifications, le cas échéant.

Veillez également à consulter la liste des modifications de comportement qui n'affectent que les applications ciblant Android 16.

Fonctionnalité de base

Android 16 (niveau d'API 36) inclut les modifications suivantes qui modifient ou étendent diverses fonctionnalités de base du système Android.

Optimisations du quota JobScheduler

À partir d'Android 16, nous ajustons le quota d'exécution des tâches régulières et accélérées en fonction des facteurs suivants :

  • Bucket de veille de l'application dans lequel se trouve l'application : dans Android 16, les buckets de veille actifs commenceront à être appliqués par un quota d'exécution généreux.
  • Si le job commence à s'exécuter alors que l'application est au premier plan : dans Android 16, les jobs démarrés alors que l'application est visible par l'utilisateur et qui se poursuivent après que l'application est devenue invisible respecteront le quota de temps d'exécution des jobs.
  • Si le job s'exécute en même temps qu'un service de premier plan : dans Android 16, les jobs qui s'exécutent en même temps qu'un service de premier plan respectent le quota de temps d'exécution des jobs. Si vous utilisez des tâches pour le transfert de données déclenché par l'utilisateur, pensez à utiliser plutôt les tâches de transfert de données déclenchées par l'utilisateur.

Ce changement a un impact sur les tâches planifiées à l'aide de WorkManager, JobScheduler et DownloadManager. Pour comprendre pourquoi une tâche a été arrêtée, nous vous recommandons de consigner la raison de l'arrêt en appelant WorkInfo.getStopReason() (pour les tâches JobScheduler, appelez JobParameters.getStopReason()).

Pour en savoir plus sur l'impact de l'état de votre application sur les ressources qu'elle peut utiliser, consultez Limites de ressources de gestion de l'alimentation. Pour en savoir plus sur les bonnes pratiques d'optimisation de la batterie, consultez les conseils sur l'optimisation de l'utilisation de la batterie pour les API de planification des tâches.

Nous vous recommandons également d'utiliser la nouvelle API JobScheduler#getPendingJobReasonsHistory introduite dans Android 16 pour comprendre pourquoi une tâche ne s'est pas exécutée.

Tests

Pour tester le comportement de votre application, vous pouvez activer le remplacement de certaines optimisations de quota de tâches tant que l'application s'exécute sur un appareil Android 16.

Pour désactiver l'application de l'option "L'état supérieur respectera le quota de durée d'exécution des tâches", exécutez la commande adb suivante :

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

Pour désactiver l'application de la règle "Les jobs qui s'exécutent simultanément avec un service de premier plan doivent respecter le quota de temps d'exécution des jobs", exécutez la commande adb suivante :

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

Pour tester certains comportements des buckets de mise en veille des applications, vous pouvez définir le bucket de mise en veille de votre application à l'aide de la commande adb suivante :

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

Pour connaître le bucket de mise en veille dans lequel se trouve votre application, vous pouvez obtenir le bucket de mise en veille de votre application à l'aide de la commande adb suivante :

adb shell am get-standby-bucket APP_PACKAGE_NAME

Motif d'arrêt des jobs vides abandonnés

如果与作业关联的 JobParameters 对象已被垃圾回收,但尚未调用 JobService#jobFinished(JobParameters, boolean) 来指示作业已完成,则会发生作业被废弃的情况。这表示作业可能会在应用不知情的情况下运行和重新调度。

依赖于 JobScheduler 的应用不会维护对 JobParameters 对象的强引用,并且超时现在将获得新的作业停止原因 STOP_REASON_TIMEOUT_ABANDONED,而不是 STOP_REASON_TIMEOUT

如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。

应用应使用新的停止原因来检测和减少被废弃的作业。

如果您使用的是 WorkManager、AsyncTask 或 DownloadManager,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。

Abandon complet de JobInfo#setImportantWhileForeground

JobInfo.Builder#setImportantWhileForeground(boolean) 方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。

自 Android 12(API 级别 31)起,此方法已废弃。从 Android 16 开始,它不再有效,系统会忽略调用此方法。

此功能移除也适用于 JobInfo#isImportantWhileForeground()。从 Android 16 开始,如果调用该方法,该方法会返回 false

L'ordre de priorité des diffusions ne s'applique plus globalement

Les applications Android sont autorisées à définir des priorités sur les broadcast receivers pour contrôler l'ordre dans lequel les broadcast receivers reçoivent et traitent la diffusion. Pour les récepteurs déclarés dans le fichier manifeste, les applications peuvent utiliser l'attribut android:priority pour définir la priorité. Pour les récepteurs enregistrés dans le contexte, les applications peuvent utiliser l'API IntentFilter#setPriority() pour définir la priorité. Lorsqu'une annonce est envoyée, le système la transmet aux destinataires par ordre de priorité, de la plus élevée à la plus basse.

Dans Android 16, l'ordre de diffusion des diffusions à l'aide de l'attribut android:priority ou IntentFilter#setPriority() dans différents processus n'est pas garanti. Les priorités de diffusion ne seront respectées que dans le même processus d'application, et non dans tous les processus.

De plus, les priorités de diffusion seront automatiquement limitées à la plage (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1). Seuls les composants système seront autorisés à définir SYSTEM_LOW_PRIORITY et SYSTEM_HIGH_PRIORITY comme priorité de diffusion.

Votre application peut être affectée si elle:

  1. Votre application a déclaré plusieurs processus avec le même intent de diffusion et a des attentes concernant la réception de ces intents dans un certain ordre en fonction de la priorité.
  2. Votre processus d'application interagit avec d'autres processus et a des attentes concernant la réception d'un intent de diffusion dans un certain ordre.

Si les processus doivent se coordonner entre eux, ils doivent communiquer via d'autres canaux de coordination.

Modifications internes de l'ART

Android 16 包含 Android 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。

发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。

依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要,因为 ART 更改与设备所运行的平台版本无关,并且会通过 Google Play 系统更新推送到超过 10 亿部设备。

所有开发者都应在 Android 16 上对其应用进行全面测试,以检查其应用是否受到影响。此外,请查看已知问题,了解您的应用是否依赖于我们发现的任何依赖于内部 ART 结构的库。如果您的应用代码或库依赖项受到影响,请尽可能寻找公共 API 替代方案,并在问题跟踪器中创建功能请求,为新用例请求公共 API。

Mode de compatibilité de taille de page de 16 ko

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 对齐的情况下可以更高效地运行时,系统会显示此对话框。

Expérience utilisateur et UI du système

Android 16 (niveau d'API 36) inclut les modifications suivantes, qui visent à créer une expérience utilisateur plus cohérente et intuitive.

Obsolescence des annonces d'accessibilité intrusives

Android 16 abandonne les annonces d'accessibilité, caractérisées par l'utilisation de announceForAccessibility ou l'envoi d'événements d'accessibilité TYPE_ANNOUNCEMENT. Cela peut créer des expériences utilisateur incohérentes pour les utilisateurs de TalkBack et du lecteur d'écran d'Android. Les alternatives répondent mieux à un plus large éventail de besoins des utilisateurs dans diverses technologies d'assistance d'Android.

Exemples d'alternatives:

La documentation de référence de l'API announceForAccessibility obsolète inclut plus de détails sur les alternatives suggérées.

Prise en charge de la navigation à trois boutons

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

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

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

Icônes d'applications à thème automatique

À partir d'Android 16 QPR2, Android applique automatiquement des thèmes aux icônes d'application pour créer une expérience cohérente sur l'écran d'accueil. Cela se produit si une application ne fournit pas sa propre icône d'application à thème. Les applications peuvent contrôler la conception de leur icône d'application à thème en incluant un calque monochrome dans leur icône adaptative et en prévisualisant l'apparence de leur icône d'application dans Android Studio.

Facteurs de forme des appareils

Android 16 (niveau d'API 36) inclut les modifications suivantes pour les applications lorsqu'elles sont projetées sur des écrans par les propriétaires d'appareils virtuels.

Remplacements du propriétaire de l'appareil virtuel

Un propriétaire d'appareil virtuel est une application de confiance ou privilégiée qui crée et gère un appareil virtuel. Les propriétaires d'appareils virtuels exécutent des applications sur un appareil virtuel, puis les projettent sur l'écran d'un appareil distant, tel qu'un ordinateur personnel, un appareil de réalité virtuelle ou un système d'info-divertissement automobile. Le propriétaire de l'appareil virtuel se trouve sur un appareil local, comme un téléphone mobile.

Le propriétaire de l'appareil virtuel sur le téléphone crée un appareil virtuel qui projette l'application sur un écran distant.

Forçages par application

Sur les appareils exécutant Android 16 (niveau d'API 36), les propriétaires d'appareils virtuels peuvent remplacer les paramètres d'application sur certains appareils virtuels qu'ils gèrent. Par exemple, pour améliorer la mise en page d'une application, le propriétaire d'un appareil virtuel peut ignorer les restrictions d'orientation, de format et de redimensionnement lors de la projection d'applications sur un écran externe.

Modifications destructives courantes

Le comportement d'Android 16 peut avoir un impact sur l'UI de votre application sur les grands écrans tels que les écrans de voiture ou les Chromebooks, en particulier sur les mises en page conçues pour les petits écrans en mode Portrait. Pour découvrir comment rendre votre application adaptative à tous les facteurs de forme des appareils, consultez À propos des mises en page adaptatives.

Références

Streaming d'application associée

Sécurité

Android 16 (niveau d'API 36) inclut des modifications qui renforcent la sécurité du système pour protéger les applications et les utilisateurs contre les applications malveillantes.

Amélioration de la sécurité contre les attaques par redirection d'intent

Android 16 offre une protection par défaut contre les attaques générales par redirection d'Intent, avec une compatibilité minimale et des modifications pour les développeurs.

Nous introduisons des solutions de renforcement de la sécurité par défaut pour les failles de redirection d'Intent. Dans la plupart des cas, les applications qui utilisent des intents normalement ne rencontrent aucun problème de compatibilité. Nous avons collecté des métriques tout au long de notre processus de développement pour surveiller les applications susceptibles de rencontrer des problèmes.

La redirection d'intent sur Android se produit lorsqu'un pirate informatique parvient à contrôler partiellement ou entièrement le contenu d'un intent utilisé pour lancer un nouveau composant dans le contexte d'une application vulnérable, tandis que l'application victime lance un intent de sous-niveau non approuvé dans un champ supplémentaire d'un intent ("de niveau supérieur"). Cela peut entraîner le lancement de composants privés par l'application pirate dans le contexte de l'application victime, le déclenchement d'actions privilégiées ou l'obtention d'un accès URI à des données sensibles, ce qui peut entraîner le vol de données et l'exécution de code arbitraire.

Désactiver la gestion de la redirection d'intent

Android 16 introduit une nouvelle API qui permet aux applications de désactiver les protections de sécurité au lancement. Cela peut être nécessaire dans des cas spécifiques où le comportement de sécurité par défaut interfère avec des cas d'utilisation légitimes de l'application.

Pour les applications compilées avec le SDK Android 16 (niveau d'API 36) ou version ultérieure

Vous pouvez utiliser directement la méthode removeLaunchSecurityProtection() sur l'objet Intent.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
Pour les applications compilées avec Android 15 (niveau d'API 35) ou version antérieure

Bien que cela ne soit pas recommandé, vous pouvez utiliser la réflexion pour accéder à la méthode 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) }

Les applications associées ne reçoivent plus de notification en cas de délai d'expiration de la découverte

Android 16 在配套设备配对流程期间引入了一种新行为,以防恶意应用侵犯用户的位置信息隐私。在 Android 16 上运行的所有配套应用都不再直接通过 RESULT_DISCOVERY_TIMEOUT 收到发现超时通知。而是通过可视对话框通知用户超时事件。当用户关闭对话框时,系统会通过 RESULT_USER_REJECTED 提醒应用关联失败。

搜索时长也从原来的 20 秒延长到了 30 秒,并且用户可以在搜索期间的任何时间停止设备发现。如果在开始搜索的前 20 秒内发现了至少 1 部设备,CDM 会停止搜索其他设备。

Connectivité

Android 16 (niveau d'API 36) inclut les modifications suivantes dans la pile Bluetooth pour améliorer la connectivité avec les périphériques.

Amélioration de la gestion des pertes d'obligations

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

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