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
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
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.
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:
- 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é.
- 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 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 introduced support for 16 KB memory pages to optimize performance of the platform. Android 16 adds a compatibility mode, allowing some apps built for 4 KB memory pages to run on a device configured for 16 KB memory pages.
When your app is running on a device with Android 16 or higher, if Android
detects that your app has 4 KB aligned memory pages, it automatically uses
compatibility mode and display a notification dialog to the user. Setting the
android:pageSizeCompat property in the AndroidManifest.xml to enable the
backwards compatibility mode will prevent the display of the dialog when your
app launches. To use the android:pageSizeCompat property, compile your app
using the Android 16 SDK.
For best performance, reliability, and stability, your app should still be 16 KB aligned. Check out our recent blog post on updating your apps to support 16 KB memory pages for more details.
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:
- 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
AccessibilityEventde typeAccessibilityEvent#CONTENT_CHANGE_TYPE_ERRORet 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 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).
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 privilégiée ou de confiance 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.
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 lorsqu'il projette des 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'applications associées
Sécurité
Android 16 (niveau d'API 36) inclut des modifications qui favorisent 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 de redirection Intent générales, avec un minimum de modifications de compatibilité et de développement requises.
Nous introduisons des solutions de renforcement de la sécurité par défaut pour les failles de redirection Intent. Dans la plupart des cas, les applications qui utilisent des intents ne rencontrent aucun problème de compatibilité. Nous avons collecté des métriques tout au long de notre processus de développement pour identifier les applications susceptibles de rencontrer des problèmes.
La redirection d'intent dans 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 fiable dans un champ "Extras" d'un intent ("de premier niveau"). Cela peut permettre à l'application du pirate informatique de lancer des composants privés dans le contexte de l'application victime, de déclencher des actions privilégiées ou d'obtenir un accès URI à des données sensibles, ce qui peut potentiellement entraîner un vol de données et une 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 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 appareils périphériques.
Amélioration de la gestion des pertes d'obligations
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.