Changements de comportement: applications ciblant Android 15 ou version ultérieure

Comme dans les versions précédentes, Android 15 apporte des modifications de comportement susceptibles d'affecter votre application. Les modifications de comportement suivantes s'appliquent exclusivement aux applications qui ciblent Android 15 ou version ultérieure. Si votre application cible Android 15 ou une version ultérieure, vous devez la modifier pour qu'elle prenne en charge ces comportements, le cas échéant.

Veillez également à consulter la liste des modifications de comportement qui affectent toutes les applications exécutées sur Android 15, quel que soit le targetSdkVersion de votre application.

Fonctionnalité de base

Android 15 modifie ou étend diverses fonctionnalités de base du système Android.

Modifications apportées aux services de premier plan

Nous apportons les modifications suivantes aux services de premier plan avec Android 15.

Nouveau type de service de premier plan pour le traitement multimédia

Android 15 introduit un nouveau type de service de premier plan, mediaProcessing. Ce type de service est adapté à des opérations telles que le transcodage de fichiers multimédias. Par exemple, une application multimédia peut télécharger un fichier audio et doit le convertir dans un autre format avant de le lire. Vous pouvez utiliser un service de premier plan mediaProcessing pour vous assurer que la conversion se poursuit même lorsque l'application est exécutée en arrière-plan.

Pour en savoir plus sur le type de service mediaProcessing, consultez Modifications apportées aux types de services de premier plan pour Android 15.

Restrictions concernant les broadcast receivers BOOT_COMPLETED qui lancent les services de premier plan

De nouvelles restrictions s'appliquent aux broadcast receivers BOOT_COMPLETED qui lancent les services de premier plan. Les récepteurs BOOT_COMPLETED ne sont pas autorisés à lancer les types de services de premier plan suivants:

Si un récepteur BOOT_COMPLETED tente de lancer l'un de ces types de services de premier plan, le système génère une erreur ForegroundServiceStartNotAllowedException.

Modification des conditions dans lesquelles les applications peuvent modifier l'état général du mode Ne pas déranger

Les applications qui ciblent Android 15 ne peuvent plus modifier l'état ni la règle globaux du mode Ne pas déranger sur un appareil (en modifiant les paramètres utilisateur ou en désactivant le mode Ne pas déranger). À la place, les applications doivent contribuer à un AutomaticZenRule, que le système combine dans une règle globale avec le schéma "most-restrictive-policy-wins" existant. Les appels d'API existantes qui ont précédemment affecté l'état global (setInterruptionFilter, setNotificationPolicy) entraînent la création ou la mise à jour d'un AutomaticZenRule implicite, qui est activé ou désactivé en fonction du cycle d'appel de ces appels d'API.

Notez que cette modification n'affecte le comportement observable que si l'application appelle setInterruptionFilter(INTERRUPTION_FILTER_ALL) et s'attend à ce que cet appel désactive un AutomaticZenRule précédemment activé par ses propriétaires.

Modifications d'OpenJDK 17

Android 15 poursuit le travail d'actualisation des bibliothèques principales d'Android pour s'aligner sur les fonctionnalités des dernières versions d'OpenJDK LTS.

L'un des changements suivants peut affecter la compatibilité des applications ciblant Android 15:

  • Modifications apportées aux API de mise en forme de chaînes: la validation de l'index d'argument, des indicateurs, de la largeur et de la précision est désormais plus stricte lors de l'utilisation des API String.format() et Formatter.format() suivantes:

    Par exemple, l'exception suivante est générée lorsqu'un index d'argument de 0 est utilisé (%0 dans la chaîne de format):

    IllegalFormatArgumentIndexException: Illegal format argument index = 0
    

    Dans ce cas, le problème peut être résolu en utilisant un indice d'argument de 1 (%1 dans la chaîne de format).

  • Modification du traitement du code de langue: lorsque vous utilisez l'API Locale, les codes des langues pour l'hébreu, le yiddish et l'indonésien ne sont plus convertis dans leurs formes obsolètes (hébreu: iw, yiddish: ji et indonésien: in). Lorsque vous spécifiez le code de langue pour l'une de ces langues, utilisez plutôt les codes ISO 639-1 (hébreu: he, indonésien: yi0 et yiddish) :id

  • Modifications apportées aux séquences d'entrée aléatoires: suite aux modifications apportées dans https://bugs.openjdk.org/Browse/JDK-8301574, les méthodes Random.ints() suivantes renvoient désormais une séquence de nombres différente de celle des méthodes Random.nextInt():

    En règle générale, cette modification ne devrait pas entraîner de dysfonctionnement de l'application, mais votre code ne doit pas s'attendre à ce que la séquence générée à partir des méthodes Random.ints() corresponde à Random.nextInt().

Sécurité

Android 15 inclut des modifications qui renforcent la sécurité du système afin de protéger les applications et les utilisateurs contre les applications malveillantes.

Lancement sécurisé des activités en arrière-plan

Android 15 protects users from malicious apps and gives them more control over their devices by adding changes that prevent malicious background apps from bringing other apps to the foreground, elevating their privileges, and abusing user interaction. Background activity launches have been restricted since Android 10 (API level 29).

Block apps that don't match the top UID on the stack from launching activities

Malicious apps can launch another app's activity within the same task, then overlay themselves on top, creating the illusion of being that app. This "task hijacking" attack bypasses current background launch restrictions because it all occurs within the same visible task. To mitigate this risk, Android 15 adds a flag that blocks apps that don't match the top UID on the stack from launching activities. To opt in for all of your app's activities, update the allowCrossUidActivitySwitchFromBelow attribute in your app's AndroidManifest.xml file:

<application android:allowCrossUidActivitySwitchFromBelow="false" >

Other changes

In addition to the restriction for UID matching, these other changes are also included:

  • Change PendingIntent creators to block background activity launches by default. This helps prevent apps from accidentally creating a PendingIntent that could be abused by malicious actors.
  • Don't bring an app to the foreground unless the PendingIntent sender allows it. This change aims to prevent malicious apps from abusing the ability to start activities in the background. By default, apps are not allowed to bring the task stack to the foreground unless the creator allows background activity launch privileges or the sender has background activity launch privileges.
  • Control how the top activity of a task stack can finish its task. If the top activity finishes a task, Android will go back to whichever task was last active. Moreover, if a non-top activity finishes its task, Android will go back to the home screen; it won't block the finish of this non-top activity.
  • Prevent launching arbitrary activities from other apps into your own task. This change prevents malicious apps from phishing users by creating activities that appear to be from other apps.
  • Block non-visible windows from being considered for background activity launches. This helps prevent malicious apps from abusing background activity launches to display unwanted or malicious content to users. No newline at end of left file.

Intents plus sûrs

Android 15 introduces new security measures to make intents safer and more robust. These changes are aimed at preventing potential vulnerabilities and misuse of intents that can be exploited by malicious apps. There are two main improvements to the security of intents in Android 15:

  • Match target intent-filters: Intents that target specific components must accurately match the target's intent-filter specifications. If you send an intent to launch another app's activity, the target intent component needs to align with the receiving activity's declared intent-filters.
  • Intents must have actions: Intents without an action will no longer match any intent-filters. This means that intents used to start activities or services must have a clearly defined action.

Kotlin


fun onCreate() {
    StrictMode.setVmPolicy(VmPolicy.Builder()
        .detectUnsafeIntentLaunch()
        .build()
    )
}

Java


public void onCreate() {
    StrictMode.setVmPolicy(new VmPolicy.Builder()
            .detectUnsafeIntentLaunch()
            .build());
}

Expérience utilisateur et UI du système

Android 15 inclut des modifications destinées à créer une expérience utilisateur plus cohérente et intuitive.

Modifications des encarts de fenêtre

Il existe deux modifications liées aux encarts de fenêtre à venir dans Android 15. Dans la version bêta 1, la technologie bord à bord sera appliquée. La configuration sera également modifiée, y compris la configuration par défaut des barres système.

Application bord à bord

Si elles ciblent Android 15, les applications sont bord à bord par défaut sur les appareils équipés d'Android 15.

Application qui cible Android 14 et n'est pas bord à bord sur un appareil Android 15.


Une application qui cible Android 15 et est bord à bord sur un appareil Android 15. Cette application utilise principalement des composants Compose Material 3 qui appliquent automatiquement des encarts. L'application bord à bord d'Android 15 n'a pas d'impact négatif sur cet écran.

Il s'agit d'une modification destructive qui pourrait avoir un impact négatif sur l'UI de votre application. Voici les modifications apportées:

  • Barre de navigation avec poignée de gestes
    • Transparence par défaut.
    • Le décalage inférieur est désactivé, de sorte que le contenu s'affiche derrière la barre de navigation du système, sauf si des encarts sont appliqués.
    • setNavigationBarColor et R.attr#navigationBarColor sont obsolètes et n'affectent pas la navigation par gestes.
    • setNavigationBarContrastEnforced et R.attr#navigationBarContrastEnforced n'ont toujours aucun effet sur la navigation par gestes.
  • Navigation à trois boutons
    • Opacité définie sur 80% par défaut, la couleur correspondant peut-être à l'arrière-plan de la fenêtre.
    • Le décalage inférieur est désactivé, de sorte que le contenu s'affiche derrière la barre de navigation du système, sauf si des encarts sont appliqués.
    • setNavigationBarColor et R.attr#navigationBarColor sont définis par défaut pour correspondre à l'arrière-plan de la fenêtre. Pour que cette valeur par défaut s'applique, l'arrière-plan de la fenêtre doit être un drawable de couleur. Cette API est obsolète, mais continue d'affecter la navigation à trois boutons.
    • setNavigationBarContrastEnforced et R.attr#navigationBarContrastEnforced sont "true" par défaut, ce qui ajoute un arrière-plan opaque de 80 % pour la navigation à trois boutons.
  • Barre d'état
    • Transparence par défaut.
    • Le décalage supérieur est désactivé, de sorte que le contenu s'affiche derrière la barre d'état, sauf si des encarts sont appliqués.
    • setStatusBarColor et R.attr#statusBarColor sont obsolètes et n'ont aucun effet sur Android 15.
    • setStatusBarContrastEnforced et R.attr#statusBarContrastEnforced sont obsolètes, mais affectent toujours Android 15.
  • Encoche
    • layoutInDisplayCutoutMode des fenêtres non flottantes doit être LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS. Dans la version bêta 1 d'Android 15, les applications planteront avec une exception IllegalArgumentException si vous utilisez SHORT_EDGES, NEVER ou DEFAULT (par exemple, LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT). Dans Android 15 bêta 2, SHORT_EDGES, NEVER et DEFAULT seront interprétés comme ALWAYS afin que les utilisateurs ne voient pas de barre noire causée par l'encoche et s'affichent bord à bord.

L'exemple suivant montre une application avant et après le ciblage d'Android 15, et avant et après l'application d'encarts.

Application qui cible Android 14 et n'est pas bord à bord sur un appareil Android 15.
Une application qui cible Android 15 et est bord à bord sur un appareil Android 15. Cependant, de nombreux éléments sont désormais masqués par la barre d'état, la barre de navigation à trois boutons ou l'encoche en raison des mesures d'application bord à bord d'Android 15. L'interface utilisateur est masquée. Elle inclut la TopAppBar, le bouton d'action flottant et les éléments de liste de Material 2.
Une application qui cible Android 15, est bord à bord sur un appareil Android 15 et applique des encarts afin que l'interface utilisateur ne soit pas masquée.

Si votre application:

  • est déjà bord à bord et applique des encarts, votre compte n'est généralement pas impacté, sauf dans les scénarios suivants. Toutefois, même si vous pensez que cela ne vous concerne pas, nous vous recommandons de tester votre application.
    • Vous disposez d'une fenêtre non flottante, telle qu'une activité qui utilise SHORT_EDGES, NEVER ou DEFAULT au lieu de LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS. Si votre application plante au lancement, cela peut être dû à votre écran de démarrage. Vous pouvez mettre à niveau la dépendance Core splashscreen vers la version 1.2.0-alpha01 ou ultérieure, définir window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always ou effectuer des tests avec la version bêta 2 d'Android 15 au lieu de la version bêta 1.
    • L'interface utilisateur peut être masquée. Vérifiez que l'interface utilisateur n'est pas masquée sur ces écrans moins consultés. Les écrans à faible trafic incluent :
      • Écrans d'intégration ou de connexion
      • Pages de paramètres
  • n'est pas bord à bord, il est très probable que cela vous concerne. En plus des scénarios pour les applications déjà bord à bord, vous devez tenir compte des points suivants :
    • Si votre application utilise des composants Material 3 (androidx.compose.material3 dans Compose, tels que TopAppBar, BottomAppBar et NavigationBar), ces composants ne sont probablement pas affectés, car ils gèrent automatiquement les encarts.
    • Si votre application utilise des composants Material 2 (androidx.compose.material dans Compose, ces composants ne gèrent pas automatiquement les encarts. Toutefois, vous pouvez accéder aux encarts et les appliquer manuellement. Dans androidx.compose.material 1.6.0 et les versions ultérieures, utilisez le paramètre windowInsets pour appliquer manuellement les encarts pour BottomAppBar, TopAppBar, BottomNavigation et NavigationRail. De même, utilisez le paramètre contentWindowInsets pour Scaffold.
    • Si votre application utilise des vues et des composants Material (com.google.android.material, la plupart des composants Material basés sur les vues tels que BottomNavigationView, BottomAppBar, NavigationRailView ou NavigationView) gèrent les encarts et ne nécessitent aucune action supplémentaire. Toutefois, vous devez ajouter android:fitsSystemWindows="true" si vous utilisez AppBarLayout.
    • Pour les composables personnalisés, appliquez les encarts manuellement en tant que marge intérieure. Si votre contenu se trouve dans un échafaudage, vous pouvez utiliser des encarts à l'aide des valeurs de marge intérieure de l'échafaudage. Sinon, appliquez une marge intérieure à l'aide de l'une des options WindowInsets.
    • Si votre application utilise des vues et BottomSheet, SideSheet ou des conteneurs personnalisés, appliquez une marge intérieure à l'aide de ViewCompat.setOnApplyWindowInsetsListener. Pour RecyclerView, appliquez une marge intérieure à l'aide de cet écouteur et ajoutez également clipToPadding="false".
  • doivent offrir une protection personnalisée en arrière-plan pour la navigation à trois boutons ou la barre d'état, votre application doit placer un composable ou une vue derrière la barre système à l'aide de WindowInsets.Type#tappableElement() pour obtenir la hauteur de la barre de navigation à trois boutons ou WindowInsets.Type#statusBars.

Pour en savoir plus sur l'application d'encarts, consultez les guides Vues Edge to Edge et Edge to Edge Compose.

Voici la liste des API obsolètes et désactivées:

  • R.attr#statusBarColor
  • R.attr#navigationBarColor
  • R.attr#navigationBarDividerColor
  • Window#setDecorFitsSystemWindows
  • Fenêtre#setStatusBarColor
  • Fenêtre#setStatusBarContrastEnforced
  • Fenêtre#setNavigationBarColor
  • Fenêtre#setNavigationBarDividerColor
  • Fenêtre#getStatusBarColor
  • Fenêtre#getStatusBarContrastEnforced
  • Fenêtre#getNavigationBarColor
  • Fenêtre#getNavigationBarDividerColor

Configuration stable

Cette modification ne peut pas être testée dans la version bêta 1, mais elle le sera bientôt.

Si votre application cible Android 15 ou une version ultérieure, Configuration n'exclut plus les barres système. Si vous utilisez la taille d'écran dans la classe Configuration pour calculer la mise en page, vous devez la remplacer par de meilleures alternatives, telles que ViewGroup, WindowInsets ou WindowMetricsCalculator, selon vos besoins.

Configuration est disponible depuis l'API 1. Elle est généralement obtenue à partir de Activity.onConfigurationChanged. Elle fournit des informations telles que la densité, l'orientation et les tailles de la fenêtre. Une caractéristique importante des tailles de fenêtre renvoyées par Configuration est qu'elle excluait auparavant les barres système.

La taille de la configuration est généralement utilisée pour sélectionner des ressources, par exemple /res/layout-h500dp, et cela reste un cas d'utilisation valide. Cependant, son utilisation pour calculer la mise en page a toujours été déconseillée. Si vous le faites, vous devez vous en éloigner maintenant. Vous devez remplacer l'utilisation de Configuration par quelque chose de plus adapté à votre cas d'utilisation.

Si vous l'utilisez pour calculer la mise en page, utilisez un ViewGroup approprié tel que CoordinatorLayout ou ConstraintLayout. Si vous l'utilisez pour déterminer la hauteur de la barre de navigation du système, utilisez WindowInsets. Si vous souhaitez connaître la taille actuelle de la fenêtre de votre application, utilisez computeCurrentWindowMetrics.

La liste suivante décrit les champs concernés par cette modification:

  • Les tailles Configuration.screenWidthDp et screenHeightDp n'excluent plus les barres système.
  • Configuration.smallestScreenWidthDp est indirectement affecté par les modifications apportées à screenWidthDp et screenHeightDp.
  • Configuration.orientation est indirectement affecté par les modifications apportées à screenWidthDp et screenHeightDp sur les appareils proches du carré.
  • Display.getSize(Point) est indirectement affecté par les modifications apportées à la configuration. Cette fonctionnalité est obsolète depuis le niveau d'API 30.
  • Display.getMetrics() fonctionne déjà comme ceci depuis le niveau d'API 33.

L'attribut élégantTextHeight est défini par défaut sur "true"

Pour les applications ciblant Android 15, l'attribut elegantTextHeight TextView devient true par défaut, en remplaçant la police compacte utilisée par défaut par certains scripts associés à de grandes métriques verticales par un autre plus lisible. La police compacte a été introduite pour éviter de perturber les mises en page. Android 13 (niveau d'API 33) empêche bon nombre de ces failles en permettant à la mise en page du texte d'étirer la hauteur verticale à l'aide de l'attribut fallbackLineSpacing.

Dans Android 15, la police compacte reste dans le système. Votre application peut donc définir elegantTextHeight sur false pour obtenir le même comportement qu'auparavant, mais elle ne sera probablement pas compatible avec les prochaines versions. Ainsi, si votre application est compatible avec les scripts suivants (arabe, laotien, birman, gujarati, kannada, malayalam, odia, télougou ou thaï), testez-la en définissant elegantTextHeight sur true.

Comportement elegantTextHeight pour les applications ciblant Android 14 (niveau d'API 34) ou version antérieure.
Comportement de elegantTextHeight pour les applications ciblant Android 15.

Modification de la largeur de TextView pour les formes de lettres complexes

Dans les versions précédentes d'Android, certaines polices cursives ou certaines langues présentant une mise en forme complexe peuvent dessiner les lettres dans la zone du caractère précédent ou suivant. Dans certains cas, ces lettres étaient tronquées au début ou à la fin. À partir d'Android 15, un TextView alloue une largeur pour dessiner suffisamment d'espace pour ces lettres et permet aux applications de demander des marges intérieures supplémentaires à gauche pour éviter le rognage.

Étant donné que cette modification affecte la façon dont un TextView détermine la largeur, TextView alloue plus de largeur par défaut si l'application cible Android 15 ou version ultérieure. Vous pouvez activer ou désactiver ce comportement en appelant l'API setUseBoundsForWidth sur TextView.

L'ajout d'une marge intérieure à gauche peut entraîner un désalignement pour les mises en page existantes. C'est pourquoi cette marge intérieure n'est pas ajoutée par défaut, même pour les applications qui ciblent Android 15 ou version ultérieure. Toutefois, vous pouvez ajouter une marge intérieure supplémentaire pour empêcher le rognage en appelant setShiftDrawingOffsetForStartOverhang.

Les exemples suivants montrent comment ces modifications peuvent améliorer la mise en page du texte pour certaines polices et langues.

Mise en page standard pour le texte anglais dans une police cursive. Certaines lettres sont tronquées. Voici le code XML correspondant:

<TextView
    android:fontFamily="cursive"
    android:text="java" />
Mise en page pour le même texte en anglais avec une largeur et une marge intérieure supplémentaires. Voici le code XML correspondant:

<TextView
    android:fontFamily="cursive"
    android:text="java"
    android:useBoundsForWidth="true"
    android:shiftDrawingOffsetForStartOverhan="true" />
Disposition standard pour le texte en thaï. Certaines lettres sont tronquées. Voici le code XML correspondant:

<TextView
    android:text="คอมพิวเตอร์" />
Mise en page pour le même texte thaï avec une largeur et une marge intérieure supplémentaires. Voici le code XML correspondant:

<TextView
    android:text="คอมพิวเตอร์"
    android:useBoundsForWidth="true"
    android:shiftDrawingOffsetForStartOverhan="true" />

Hauteur de ligne par défaut des paramètres régionaux pour EditText

In previous versions of Android, the text layout stretched the height of the text to meet the line height of the font that matched the current locale. For example, if the content was in Japanese, because the line height of the Japanese font is slightly larger than the one of a Latin font, the height of the text became slightly larger. However, despite these differences in line heights, the EditText element was sized uniformly, regardless of the locale being used, as illustrated in the following image:

Three boxes representing EditText elements that can contain text from English (en), Japanese (ja), and Burmese (my). The height of the EditText is the same, even though these languages have different line heights from each other.

For apps targeting Android 15, a minimum line height is now reserved for EditText to match the reference font for the specified Locale, as shown in the following image:

Three boxes representing EditText elements that can contain text from English (en), Japanese (ja), and Burmese (my). The height of the EditText now includes space to accommodate the default line height for these languages' fonts.

If needed, your app can restore the previous behavior by specifying the useLocalePreferredLineHeightForMinimum attribute to false, and your app can set custom minimum vertical metrics using the setMinimumFontMetrics API in Kotlin and Java.

Appareil photo et contenu multimédia

Android 15 apporte les modifications suivantes au comportement de l'appareil photo et des contenus multimédias pour les applications qui ciblent Android 15 ou version ultérieure.

Restrictions concernant les demandes de priorité audio

Les applications qui ciblent Android 15 doivent être la première ou exécutant un service de premier plan audio pour demander la priorité audio. Si une application tente de demander une priorité alors qu'elle ne répond pas à l'une de ces exigences, l'appel renvoie AUDIOFOCUS_REQUEST_FAILED.

Un service de premier plan est considéré comme audio si son type est mediaPlayback, camera, microphone ou phoneCall.

Pour en savoir plus sur la priorité audio, consultez Gérer la priorité audio.

Mise à jour des restrictions non SDK

Android 15 inclut des listes à jour d'interfaces non SDK limitées grâce à la collaboration avec les développeurs Android et aux derniers tests internes. Dans la mesure du possible, nous nous assurons que des alternatives publiques sont disponibles avant de limiter les interfaces non SDK.

Si votre application ne cible pas Android 15, certaines de ces modifications ne vous affecteront peut-être pas immédiatement. Toutefois, bien qu'il soit possible pour votre application d'accéder à certaines interfaces non SDK en fonction du niveau d'API cible de votre application, l'utilisation d'une méthode ou d'un champ non SDK présente toujours un risque élevé d'endommager votre application.

Si vous ne savez pas si votre application utilise des interfaces non SDK, vous pouvez tester votre application pour le savoir. Si votre application repose sur des interfaces non SDK, vous devez commencer à planifier une migration vers des alternatives SDK. Néanmoins, nous comprenons que certaines applications ont des cas d'utilisation valides concernant l'utilisation d'interfaces non SDK. Si vous ne trouvez pas d'alternative à l'utilisation d'une interface non SDK pour une fonctionnalité de votre application, vous devez demander une nouvelle API publique.

Pour en savoir plus sur les modifications apportées à cette version d'Android, consultez Mises à jour des restrictions des interfaces non SDK dans Android 15. Pour en savoir plus sur les interfaces non SDK de manière générale, consultez la section Restrictions concernant les interfaces non SDK.