Changements de comportement: applications ciblant le niveau d'API 28 ou supérieur

Android 9 (niveau d'API 28) introduit un certain nombre de modifications dans le système Android. Les modifications de comportement suivantes s'appliquent exclusivement aux applications qui ciblent le niveau d'API 28 ou supérieur. Les applications qui définissent targetSdkVersion sur le niveau d'API 28 ou supérieur doivent être modifiées pour prendre en charge correctement ces comportements, le cas échéant.

Pour connaître les modifications qui affectent toutes les applications exécutées sur Android 9, quel que soit le niveau d'API qu'elles ciblent, consultez Changements de comportement : toutes les applications.

Services de premier plan

Les applications qui ciblent Android 9 ou version ultérieure et qui utilisent des services de premier plan doivent demander l'autorisation FOREGROUND_SERVICE. Il s'agit d'une autorisation normale. Le système l'accorde donc automatiquement à l'application qui en fait la demande.

Si une application ciblant Android 9 ou version ultérieure tente de créer un service de premier plan sans demander FOREGROUND_SERVICE, le système génère une SecurityException.

Modifications concernant la confidentialité

Si votre application cible Android 9, vous devez tenir compte des changements de comportement suivants. Ces modifications apportées aux informations sur le numéro de série et le DNS de l'appareil renforcent la confidentialité des utilisateurs.

Obsolescence du numéro de série de compilation

Dans Android 9, Build.SERIAL est toujours défini sur "UNKNOWN" pour protéger la confidentialité des utilisateurs.

Si votre application a besoin d'accéder au numéro de série du matériel d'un appareil, vous devez plutôt demander l'autorisation READ_PHONE_STATE, puis appeler getSerial().

Confidentialité DNS

Les applications ciblant Android 9 doivent respecter les API DNS privées. En particulier, les applications doivent s'assurer que, si le résolveur système utilise DNS-over-TLS, tout client DNS intégré utilise le DNS chiffré pour le même nom d'hôte que le système ou est désactivé au profit du résolveur système.

Modifications apportées à la sécurité du framework

Android 9 inclut plusieurs modifications de comportement qui améliorent la sécurité de votre application, mais ces modifications ne prennent effet que si votre application cible le niveau d'API 28 ou supérieur.

TLS réseau activé par défaut

Si votre application cible Android 9 ou version ultérieure, la méthode isCleartextTrafficPermitted() renvoie false par défaut. Si votre application doit activer le texte en clair pour des domaines spécifiques, vous devez définir explicitement cleartextTrafficPermitted sur true pour ces domaines dans la configuration de la sécurité réseau de votre application.

Répertoires de données Web séparés par processus

Afin d'améliorer la stabilité des applications et l'intégrité des données dans Android 9, les applications ne peuvent pas partager un seul répertoire de données WebView entre plusieurs processus. En règle générale, ces répertoires de données stockent les cookies, les caches HTTP et d'autres éléments de stockage persistant et temporaire liés à la navigation Web.

Dans la plupart des cas, votre application ne doit utiliser les classes du package android.webkit, telles que WebView et CookieManager, que dans un seul processus. Par exemple, vous devez déplacer tous les objets Activity qui utilisent un WebView dans le même processus. Vous pouvez appliquer plus strictement la règle "un seul processus" en appelant disableWebView() dans les autres processus de votre application. Cet appel empêche l'initialisation de WebView par erreur dans ces autres processus, même s'il est appelé à partir d'une bibliothèque dépendante.

Si votre application doit utiliser des instances de WebView dans plusieurs processus, vous devez attribuer un suffixe de répertoire de données unique à chaque processus à l'aide de la méthode WebView.setDataDirectorySuffix() avant d'utiliser une instance donnée de WebView dans ce processus. Cette méthode place les données Web de chaque processus dans son propre répertoire au sein du répertoire de données de votre application.

Domaines SELinux par application

Les applications ciblant Android 9 ou version ultérieure ne peuvent pas partager de données avec d'autres applications à l'aide d'autorisations Unix accessibles à tous. Cette modification améliore l'intégrité de la sandbox d'application Android, en particulier l'exigence selon laquelle les données privées d'une application ne sont accessibles que par cette application.

Pour partager des fichiers avec d'autres applications, utilisez un fournisseur de contenu.

Modifications de la connectivité

Comptabilisation des données de connectivité et multipath

Dans les applications ciblant Android 9 ou version ultérieure, le système comptabilise le trafic réseau sur les réseaux qui ne sont pas ceux par défaut (par exemple, le trafic cellulaire lorsque l'appareil est connecté au Wi-Fi) et fournit des méthodes dans la classe NetworkStatsManager pour interroger ce trafic.

En particulier, getMultipathPreference() renvoie désormais une valeur basée sur le trafic réseau susmentionné. À partir d'Android 9, la méthode renvoie true pour les données mobiles, mais lorsqu'une certaine quantité de trafic s'accumule en une journée, elle commence à renvoyer false. Les applications exécutées sur Android 9 doivent appeler la méthode et respecter cette indication.

La classe ConnectivityManager.NetworkCallback envoie désormais des informations sur les VPN aux applications. Ce changement permet aux applications d'écouter beaucoup plus facilement les événements de connectivité sans avoir à mélanger les appels synchrones et asynchrones, ni à utiliser des API limitées. Cela signifie également que le transfert d'informations fonctionne comme prévu lorsqu'un appareil est connecté simultanément à plusieurs réseaux Wi-Fi ou cellulaires.

Obsolescence du client HTTP Apache

Avec Android 6.0, nous avons supprimé la compatibilité avec le client HTTP Apache. À partir d'Android 9, cette bibliothèque est supprimée du bootclasspath et n'est pas disponible pour les applications par défaut.

Pour continuer à utiliser le client HTTP Apache, les applications ciblant Android 9 et versions ultérieures peuvent ajouter les éléments suivants à leur AndroidManifest.xml :

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Au lieu d'utiliser la bibliothèque Apache d'exécution, les applications peuvent regrouper leur propre version de la bibliothèque org.apache.http dans leur APK. Si vous le faites, vous devez reconditionner la bibliothèque (avec un utilitaire tel que Jar Jar) pour éviter les problèmes de compatibilité des classes avec celles fournies dans l'environnement d'exécution.

modifications de l'interface utilisateur

Afficher la mise au point

Les vues dont la zone est nulle (la largeur ou la hauteur est égale à 0) ne sont plus sélectionnables.

De plus, les activités n'attribuent plus implicitement le focus initial en mode tactile. Au lieu de cela, il vous appartient de demander explicitement la mise au point initiale, si vous le souhaitez.

Gestion des valeurs hexadécimales RGBA CSS

Les applications qui ciblent Android 9 ou version ultérieure doivent activer le comportement CSS Color Module Level 4 provisoire pour gérer les couleurs CSS à 4 et 8 chiffres hexadécimaux.

Le module de couleur CSS de niveau 4 est pris en charge par Chrome depuis la version 52, mais WebView désactive actuellement la fonctionnalité, car des applications Android existantes contenaient des couleurs hexadécimales de 32 bits dans l'ordre Android (ARGB), ce qui entraînait des erreurs de rendu.

Par exemple, la couleur #80ff8080 est actuellement affichée dans WebView en rouge clair opaque (#ff8080) pour les applications ciblant le niveau d'API 27 ou inférieur. Le composant principal (qui serait interprété par Android comme le composant alpha) est actuellement ignoré. Si une application cible le niveau d'API 28 ou supérieur, #80ff8080 est interprété comme un vert clair transparent à 50 % (#80ff80).

Détection du type MIME pour les URI de fichier

Les versions d'Android antérieures à Android 9 pouvaient déduire les types MIME à partir du contenu des fichiers. À partir d'Android 9 (niveau d'API 28), les applications doivent utiliser la bonne extension de fichier lors du chargement des URI file: dans un WebView.

L'utilisation du contenu du fichier pour déduire les types MIME peut être une source de failles de sécurité, et cela n'est généralement pas autorisé par les navigateurs modernes.

Si un fichier possède une extension reconnue, telle que .html, .txt, .js ou .css, le type MIME sera déterminé par l'extension. Si un fichier n'a pas d'extension ou en a une qui n'est pas reconnue, le type MIME sera du texte brut.

Par exemple, un URI tel que file:///sdcard/test.html sera affiché en HTML, mais un URI tel que file:///sdcard/test sera affiché en texte brut, même si le fichier contient des données HTML.

Élément de défilement du document

Android 9 gère correctement le cas où l'élément racine d'un document est l'élément de défilement. Dans les versions antérieures, la position de défilement était définie sur l'élément body, et l'élément racine avait des valeurs de défilement nulles. Android 9 permet un comportement conforme aux normes, où l'élément de défilement est l'élément racine.

De plus, l'accès direct à document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop ou document.documentElement.scrollLeft se comportera différemment selon le SDK cible. Pour accéder aux valeurs de défilement de la fenêtre d'affichage, utilisez document.scrollingElement, si disponible.

Notifications des applications suspendues

Avant Android 9, les notifications des applications suspendues étaient annulées. À partir d'Android 9, les notifications des applications suspendues sont masquées jusqu'à ce que l'application soit réactivée.