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
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 apps are allowed to define priorities on broadcast receivers to control
the order in which the receivers receive and process the broadcast. For
manifest-declared receivers, apps can use the
android:priority
attribute to define the priority and for
context-registered receivers, apps can use the
IntentFilter#setPriority()
API to define the priority. When
a broadcast is sent, the system delivers it to receivers in order of their
priority, from highest to lowest.
In Android 16, broadcast delivery order using the android:priority
attribute
or IntentFilter#setPriority()
across different processes will not be
guaranteed. Broadcast priorities will only be respected within the same
application process rather than across all processes.
Also, broadcast priorities will be automatically confined to the range
(SYSTEM_LOW_PRIORITY
+ 1,
SYSTEM_HIGH_PRIORITY
- 1). Only system components will be
allowed to set SYSTEM_LOW_PRIORITY
, SYSTEM_HIGH_PRIORITY
as broadcast
priority.
Your app might be impacted if it does either of the following:
- Your application has declared multiple processes with the same broadcast intent, and has expectations around receiving those intents in a certain order based on the priority.
- Your application process interacts with other processes and has expectations around receiving a broadcast intent in a certain order.
If the processes need to coordinate with each other, they should communicate using other coordination channels.
Modifications internes d'ART
Android 16 includes the latest updates to the Android Runtime (ART) that improve the Android Runtime's (ART's) performance and provide support for additional Java features. Through Google Play System updates, these improvements are also available to over a billion devices running Android 12 (API level 31) and higher.
As these changes are released, libraries and app code that rely on internal structures of ART might not work correctly on devices running Android 16, along with earlier Android versions that update the ART module through Google Play system updates.
Relying on internal structures (such as non-SDK interfaces) can always lead to compatibility problems, but it's particularly important to avoid relying on code (or libraries containing code) that leverages internal ART structures, since ART changes aren't tied to the platform version the device is running on and they go out to over a billion devices through Google Play system updates.
All developers should check whether their app is impacted by testing their apps thoroughly on Android 16. In addition, check the known issues to see if your app depends on any libraries that we've identified that rely on internal ART structures. If you do have app code or library dependencies that are affected, seek public API alternatives whenever possible and request public APIs for new use cases by creating a feature request in our 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.

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
A virtual device owner is a trusted or privileged app that creates and manages a virtual device. Virtual device owners run apps on a virtual device and then project the apps to the display of a remote device, such as a personal computer, virtual reality device, or car infotainment system. The virtual device owner is on a local device, such as a mobile phone.

Per-app overrides
On devices running Android 16 (API level 36), virtual device owners can override app settings on select virtual devices that the virtual device owners manage. For example, to improve app layout, a virtual device owner can ignore orientation, aspect ratio, and resizability restrictions when projecting apps onto an external display.
Common breaking changes
The Android 16 behavior might impact your app's UI on large screen form factors such as car displays or Chromebooks, especially layouts that were designed for small displays in portrait orientation. To learn how to make your app adaptive for all device form factors, see About adaptive layouts.
References
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 offre une sécurité par défaut contre les attaques de redirection Intent
générales, avec une compatibilité et des modifications minimales requises pour les développeurs.
Nous introduisons des solutions de renforcement de la sécurité par défaut pour les exploits de redirection Intent
. Dans la plupart des cas, les applications qui utilisent des intents ne rencontrent généralement pas de problèmes 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 erreurs.
La redirection d'intent dans Android se produit lorsqu'un pirate informatique peut 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 "extras" d'un intent ("de niveau supérieur"). Cela peut entraîner le lancement de composants privés dans le contexte de l'application victime, le déclenchement d'actions privilégiées ou l'accès par 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 démarrage. Cela peut être nécessaire dans des cas spécifiques où le comportement de sécurité par défaut interfère avec les 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 de délai avant expiration de la découverte
Android 16 introduit un nouveau comportement lors du flux d'association d'appareils compagnons pour protéger la confidentialité de la position de l'utilisateur contre les applications malveillantes. Toutes les applications compagnons exécutées sur Android 16 ne sont plus directement informées du délai avant expiration de la découverte à l'aide de RESULT_DISCOVERY_TIMEOUT
. À la place, l'utilisateur est averti des événements de délai avant expiration à l'aide d'une boîte de dialogue visuelle. Lorsque l'utilisateur ferme la boîte de dialogue, l'application est avertie de l'échec de l'association avec RESULT_USER_REJECTED
.
La durée de la recherche a également été prolongée par rapport aux 20 secondes d'origine, et l'utilisateur peut arrêter la découverte des appareils à tout moment pendant la recherche. Si au moins un appareil a été détecté dans les 20 premières secondes de la recherche, le CDM cesse de rechercher d'autres appareils.
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
À partir d'Android 16, la pile Bluetooth a été mise à jour pour améliorer la sécurité et l'expérience utilisateur lorsqu'une perte de liaison à distance est détectée. Auparavant, le système supprimait automatiquement l'association et lançait un nouveau processus d'association, ce qui pouvait entraîner une nouvelle association involontaire. Dans de nombreux cas, nous avons constaté que les applications ne géraient pas de manière cohérente l'événement de perte de liaison.
Pour unifier l'expérience, Android 16 a amélioré la gestion de la perte de liaison dans le système. Si un appareil Bluetooth associé précédemment ne peut pas être authentifié lors de la reconnexion, le système interrompt la liaison, conserve les informations d'association locales et affiche une boîte de dialogue système informant les utilisateurs de la perte d'association et les invitant à s'associer à nouveau.