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

从 Android 16 开始,我们将根据以下因素调整常规作业和加急作业的执行运行时配额:

  • 应用所处的应用待机存储分区:在 Android 16 中,活跃待机存储分区将开始通过宽松的运行时配额强制执行。
  • 如果作业在应用处于前台状态时开始执行:在 Android 16 中,如果作业在应用对用户可见时开始执行,并在应用变为不可见后继续执行,则会遵守作业运行时配额。
  • 如果作业在运行前台服务时执行:在 Android 16 中,与前台服务同时执行的作业将遵守作业运行时配额。如果您利用作业进行用户发起的数据传输,请考虑改用用户发起的数据传输作业

此变更会影响使用 WorkManager、JobScheduler 和 DownloadManager 调度的任务。如需调试作业停止的原因,我们建议您通过调用 WorkInfo.getStopReason()(对于 JobScheduler 作业,请调用 JobParameters.getStopReason())来记录作业停止的原因。

如需了解应用的状态如何影响其可使用的资源,请参阅电源管理资源限制。 如需详细了解电池优化方面的最佳实践,请参阅有关针对任务调度 API 优化电池使用的指南。

我们还建议利用 Android 16 中引入的新 JobScheduler#getPendingJobReasonsHistory API 来了解作业未执行的原因。

测试

如需测试应用的行为,只要应用在 Android 16 设备上运行,您就可以启用对某些作业配额优化功能的替换。

如需停用“顶级状态将遵守作业运行时配额”的强制执行,请运行以下 adb 命令:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

如需停用“在与前台服务同时执行时,作业将遵守作业运行时配额”的强制执行,请运行以下 adb 命令:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

如需测试特定应用待机分桶行为,您可以使用以下 adb 命令设置应用的应用待机分桶:

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

如需了解应用所在的待机分桶,您可以使用以下 adb 命令获取应用的待机分桶:

adb shell am get-standby-bucket APP_PACKAGE_NAME

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

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.

Le 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 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 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.

Icônes d'applications à thème automatiques

À 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 favorisent la sécurité du système pour protéger les applications et les utilisateurs contre les applications malveillantes.

Sécurité renforcée contre les attaques par redirection d'intentions

Android 16 offre une protection par défaut contre les attaques de redirection Intentgénérales, avec un minimum de modifications requises en termes de compatibilité et de développement.

Nous introduisons des solutions de renforcement de la sécurité par défaut pour les failles d'exploitation de la 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 malveillante 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 sont plus averties des délais 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 périphériques.

Amélioration de la gestion des pertes d'obligations

À 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.