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 des quotas JobScheduler

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

  • Dans quel bucket de veille de l'application 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 la tâche commence l'exécution alors que l'application est en haut de l'écran: sous Android 16, les tâches démarrées alors que l'application est visible par l'utilisateur et qui se poursuivent après que l'application est devenue invisible respectent le quota d'exécution de la tâche.
  • Si la tâche s'exécute pendant l'exécution d'un service de premier plan: dans Android 16, les tâches qui s'exécutent simultanément avec un service de premier plan respectent le quota d'exécution de la tâche. Si vous utilisez des tâches pour le transfert de données déclenché par l'utilisateur, envisagez d'utiliser plutôt des tâches de transfert de données déclenchées par l'utilisateur.

Ce changement affecte les tâches planifiées à l'aide de WorkManager, JobScheduler et DownloadManager. Pour déboguer la raison pour laquelle une tâche a été arrêtée, nous vous recommandons de consigner la raison pour laquelle votre tâche a été arrêtée 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 la section 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'exploiter la nouvelle API JobScheduler#getPendingJobReasonsHistory introduite dans Android 16 pour comprendre pourquoi une tâche n'a pas été exécutée.

Tests

Pour tester le comportement de votre application, vous pouvez activer le forçage 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 la règle "L'état supérieur respectera le quota d'exécution de la tâche", 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 tâches exécutées simultanément avec un service de premier plan respectent le quota d'exécution des tâches", exécutez la commande adb suivante:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

Pour tester certains comportements de bucket de mise en veille de l'application, 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 comprendre le bucket de mise en veille de 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 tâches vides abandonnées

An abandoned job occurs when the JobParameters object associated with the job has been garbage collected, but JobService#jobFinished(JobParameters, boolean) has not been called to signal job completion. This indicates that the job may be running and being rescheduled without the app's awareness.

Apps that rely on JobScheduler, don't maintain a strong reference to the JobParameters object, and timeout will now be granted the new job stop reason STOP_REASON_TIMEOUT_ABANDONED, instead of STOP_REASON_TIMEOUT.

If there are frequent occurrences of the new abandoned stop reason, the system will take mitigation steps to reduce job frequency.

Apps should use the new stop reason to detect and reduce abandoned jobs.

If you're using WorkManager, AsyncTask, or DownloadManager, you aren't impacted because these APIs manage the job lifecycle on your app's behalf.

Abandon complet de JobInfo#setImportantWhileForeground

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

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

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

Champ d'application de la priorité de diffusion ordonnée n'est plus global

Android 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 android:priority 属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority() API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。

在 Android 16 中,无法保证使用 android:priority 属性或 IntentFilter#setPriority() 在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。

此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITYSYSTEM_HIGH_PRIORITY 设置为广播优先级。

如果您的应用执行以下任一操作,可能会受到影响:

  1. 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
  2. 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。

如果进程需要相互协调,则应使用其他协调渠道进行通信。

Modifications internes d'ART

Android 16 inclut les dernières mises à jour d'Android Runtime (ART) qui améliorent les performances d'Android Runtime (ART) et prennent en charge des fonctionnalités Java supplémentaires. Grâce aux mises à jour du système Google Play, ces améliorations sont également disponibles pour plus d'un milliard d'appareils équipés d'Android 12 (niveau d'API 31) ou version ultérieure.

Lorsque ces modifications seront publiées, les bibliothèques et le code d'application qui s'appuient sur les structures internes d'ART risquent de ne pas fonctionner correctement sur les appareils équipés d'Android 16, ainsi que sur les versions antérieures d'Android qui mettent à jour le module ART via les mises à jour du système Google Play.

S'appuyer sur des structures internes (telles que les interfaces autres que le SDK) peut toujours entraîner des problèmes de compatibilité, mais il est particulièrement important d'éviter de s'appuyer sur du code (ou des bibliothèques contenant du code) qui exploite des structures ART internes, car les modifications ART ne sont pas liées à la version de la plate-forme sur laquelle l'appareil s'exécute et elles sont diffusées auprès de plus d'un milliard d'appareils via les mises à jour du système Google Play.

Tous les développeurs doivent vérifier si leur application est affectée en effectuant des tests approfondis sur Android 16. En outre, consultez les problèmes connus pour voir si votre application dépend de bibliothèques que nous avons identifiées comme s'appuyant sur des structures ART internes. Si vous avez des dépendances de code d'application ou de bibliothèque qui sont concernées, recherchez des alternatives d'API publiques dans la mesure du possible et demandez des API publiques pour de nouveaux cas d'utilisation en créant une demande de fonctionnalité dans notre outil Issue Tracker.

Mode de compatibilité de taille de page de 16 ko

Android 15 a introduit la prise en charge des pages de mémoire de 16 ko pour optimiser les performances de la plate-forme. Android 16 ajoute un mode de compatibilité, qui permet à certaines applications conçues pour des pages de mémoire de 4 ko d'être exécutées sur un appareil configuré pour des pages de mémoire de 16 ko.

Lorsque votre application s'exécute sur un appareil équipé d'Android 16 ou version ultérieure, si Android détecte que votre application comporte des pages de mémoire alignées sur 4 ko, elle utilise automatiquement le mode de compatibilité et affiche une boîte de dialogue de notification à l'utilisateur. Définir la propriété android:pageSizeCompat dans AndroidManifest.xml pour activer le mode de compatibilité ascendante empêche l'affichage de la boîte de dialogue lorsque votre application démarre. Pour utiliser la propriété android:pageSizeCompat, compilez votre application à l'aide du SDK Android 16.

Pour des performances, une fiabilité et une stabilité optimales, votre application doit toujours être alignée sur 16 ko. Pour en savoir plus, consultez notre article de blog récent sur la mise à jour de vos applications pour qu'elles soient compatibles avec les pages de mémoire de 16 ko.

Boîte de dialogue du mode de compatibilité qui s'affiche lorsque le système détecte qu'une application alignée sur 4 ko pourrait s'exécuter de manière plus optimale si elle était alignée sur 16 ko.

Expérience utilisateur et interface utilisateur 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.

Abandon des annonces d'accessibilité intrusives

Android 16 deprecates accessibility announcements, characterized by the use of announceForAccessibility or the dispatch of TYPE_ANNOUNCEMENT accessibility events. These can create inconsistent user experiences for users of TalkBack and Android's screen reader, and alternatives better serve a broader range of user needs across a variety of Android's assistive technologies.

Examples of alternatives:

The reference documentation for the deprecated announceForAccessibility API includes more details about suggested alternatives.

Prise en charge de la navigation à trois boutons

Android 16 prend en charge la prévisualisation du Retour dans la navigation à trois boutons pour les applications qui ont correctement migré vers la prévisualisation du Retour. Appuyer de manière prolongée sur le bouton Retour déclenche une animation de prévisualisation du Retour, qui vous permet de prévisualiser la page vers laquelle le geste Retour vous redirige.

Ce comportement s'applique à toutes les zones du système compatibles avec les animations de prévisualisation du Retour, y compris les animations système (retour à l'écran d'accueil, multitâche et multi-activité).

Animations de prévisualisation du Retour en mode navigation à trois boutons.

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

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

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

按应用替换项

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

常见的破坏性更改

Android 16 中的此行为可能会影响应用在汽车显示屏或 Chromebook 等大屏幕设备上的界面,尤其是针对纵向小屏幕设计的布局。如需了解如何让应用适应所有设备类型,请参阅自适应布局简介

参考文档

配套应用串流

Sécurité

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

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

Android 16 提供了针对常规 Intent 重定向攻击的默认安全防护,并且所需的兼容性和开发者更改最少。

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

当攻击者部分或完全控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,就会出现 Android 中的 intent 重定向,而受害应用会在 intent(“顶级”intent)的 extras 字段中启动不可信的子级 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) }

Les applications associées ne reçoivent plus de notification de délai avant 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 de titres

Starting in Android 16, the Bluetooth stack has been updated to improve security and user experience when a remote bond loss is detected. Previously, the system would automatically remove the bond and initiate a new pairing process, which could lead to unintentional re-pairing. We have seen in many instances apps not taking care of the bond loss event in a consistent way.

To unify the experience, Android 16 improved the bond loss handling to the system. If a previously bonded Bluetooth device could not be authenticated upon reconnection, the system will disconnect the link, retain local bond information, and display a system dialog informing users of the bond loss and directing them to re-pair.