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 premier plan: 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 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 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
Une tâche abandonnée se produit lorsque l'objet JobParameters
associé à la tâche a été éliminé par la récupération de mémoire, mais que JobService#jobFinished(JobParameters,
boolean)
n'a pas été appelé pour signaler la fin de la tâche. Cela indique que la tâche peut être en cours d'exécution et être reprogrammée sans que l'application en soit informée.
Les applications qui s'appuient sur JobScheduler ne conservent pas de référence forte à l'objet JobParameters
. Le délai avant expiration est désormais accordé avec la nouvelle raison d'arrêt de la tâche STOP_REASON_TIMEOUT_ABANDONED
, au lieu de STOP_REASON_TIMEOUT
.
Si la nouvelle raison d'abandon de la tâche se produit fréquemment, le système prendra des mesures d'atténuation pour réduire la fréquence des tâches.
Les applications doivent utiliser la nouvelle raison d'arrêt pour détecter et réduire les tâches abandonnées.
Si vous utilisez WorkManager, AsyncTask ou DownloadManager, vous n'êtes pas concerné, car ces API gèrent le cycle de vie des tâches pour le compte de votre application.
Abandon complet de JobInfo#setImportantWhileForeground
La méthode JobInfo.Builder#setImportantWhileForeground(boolean)
indique l'importance d'une tâche lorsque l'application de planification est au premier plan ou lorsqu'elle est temporairement exemptée des restrictions en arrière-plan.
Cette méthode est obsolète depuis Android 12 (niveau d'API 31). À partir d'Android 16, elle ne fonctionne plus efficacement et l'appel de cette méthode sera ignoré.
Cette suppression de fonctionnalité s'applique également à JobInfo#isImportantWhileForeground()
. À partir d'Android 16, si la méthode est appelée, elle renvoie 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_PRIORITY
、SYSTEM_HIGH_PRIORITY
设置为广播优先级。
如果您的应用执行以下任一操作,可能会受到影响:
- 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
- 您的应用进程与其他进程交互,并期望以特定顺序接收广播 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.
Si Android détecte que votre application comporte des pages de mémoire alignées sur 4 ko, il 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 rétrocompatibilité empêche l'affichage de la boîte de dialogue lorsque votre application se lance. 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.

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 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:
- Pour les modifications importantes de l'UI, comme les modifications de fenêtre, utilisez
Activity.setTitle(CharSequence)
etsetAccessibilityPaneTitle(java.lang.CharSequence)
. Dans Compose, utilisezModifier.semantics { paneTitle = "paneTitle" }
. - Pour informer l'utilisateur des modifications apportées à l'UI critique, utilisez
setAccessibilityLiveRegion(int)
. Dans Compose, utilisezModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
. Ils doivent être utilisés avec parcimonie, car ils peuvent générer des annonces chaque fois qu'une vue est mise à jour. - Pour avertir les utilisateurs des erreurs, envoyez un
AccessibilityEvent
de typeAccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
et définissezAccessibilityNodeInfo#setError(CharSequence)
, ou utilisezTextView#setError(CharSequence)
.
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 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é).
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 fiable 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'infodivertissement pour voiture. Le propriétaire de l'appareil virtuel se trouve sur un appareil local, tel qu'un téléphone mobile.

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 des applications, un propriétaire d'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'interface utilisateur de votre application sur les facteurs de forme d'écrans de grande taille, tels que les écrans de voiture ou les Chromebooks, en particulier les mises en page conçues pour les petits écrans en mode portrait. Pour savoir comment adapter votre application à tous les facteurs de forme d'appareil, consultez la section À 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 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) }
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
从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。
为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。