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

Android 9 (niveau d'API 28) apporte un certain nombre de modifications au 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 modifier leurs applications pour prendre en charge 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 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 à l'origine de la demande.

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

Modifications concernant la confidentialité

Si votre application cible Android 9, tenez compte des changements de comportement suivants. Ces mises à jour des informations sur la série de l'appareil et le DNS renforcent la confidentialité des utilisateurs.

Abandon du numéro de série de build

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

Si votre application doit accéder au numéro de série du matériel d'un appareil, vous devez 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 du système utilise DNS sur TLS, tout client DNS intégré utilise un DNS chiffré vers le même nom d'hôte que le système, ou est désactivé en faveur du résolveur du système.

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

Android 9 apporte 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 une version ultérieure, la méthode isCleartextTrafficPermitted() renvoie false par défaut. Si votre application doit activer le texte clair pour des domaines spécifiques, vous devez définir explicitement cleartextTrafficPermitted sur true pour ces domaines dans la configuration de sécurité réseau de votre application.

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

Afin d'améliorer la stabilité 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 des cookies, des caches HTTP, ainsi que d'autres types de stockage persistant et temporaire liés à la navigation Web.

Dans la plupart des cas, votre application doit utiliser les classes du package android.webkit, telles que WebView et CookieManager, 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 la règle "Un seul processus" de manière plus stricte en appelant disableWebView() dans les autres processus de votre application. Cet appel empêche WebView d'être initialisé dans ces autres processus par erreur, 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 qui ciblent Android 9 ou une version ultérieure ne peuvent pas partager de données avec d'autres applications à l'aide d'autorisations Unix accessibles à tous. Ce changement améliore l'intégrité du bac à sable 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.

Changements de connectivité

Comptabilisation des données de connectivité et multi-chemin

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

Plus spécifiquement, getMultipathPreference() renvoie désormais une valeur basée sur le trafic réseau mentionné ci-dessus. À partir d'Android 9, la méthode renvoie true pour les données des cellules, 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 cet indice.

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 à combiner des appels synchrones et asynchrones, ni à utiliser des API limitées. En outre, cela signifie que le transfert d'informations fonctionne comme prévu lorsqu'un appareil est connecté simultanément à plusieurs réseaux Wi-Fi ou à plusieurs réseaux mobiles.

Abandon du client HTTP Apache

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

Pour continuer à utiliser le client HTTP Apache, les applications qui ciblent Android 9 ou une version ultérieure 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 d'exécution Apache, les applications peuvent regrouper leur propre version de la bibliothèque org.apache.http dans leur APK. Dans ce cas, vous devez réempaqueter la bibliothèque (avec un utilitaire tel que Jar Jar) pour éviter les problèmes de compatibilité entre les classes fournies dans l'environnement d'exécution.

Modifications apportées à l'interface utilisateur

Afficher l'objectif

Les vues avec 0 zone (dont la largeur ou la hauteur est de 0) ne sont plus sélectionnables.

De plus, les activités n'attribuent plus implicitement de ciblage initial en mode tactile. C'est à vous de demander explicitement la sélection initiale, si vous le souhaitez.

Gestion des valeurs hexadécimales RVBA CSS

Les applications qui ciblent Android 9 ou une version ultérieure doivent activer le comportement brouillon du module de couleur CSS niveau 4 pour gérer les couleurs CSS à quatre et huit chiffres hexadécimaux.

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

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 initial (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 50% de vert clair transparent (#80ff80).

Détection du type MIME pour le fichier: URI

Les versions d'Android antérieures à Android 9 peuvent déduire des 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 une WebView.

L'utilisation du contenu des fichiers pour déduire les types MIME peut constituer une source de bugs de sécurité, ce qui n'est généralement pas autorisé par les navigateurs récents.

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 n'en possède pas une, le type MIME est en texte brut.

Par exemple, un URI tel que file:///sdcard/test.html s'affiche au format HTML, tandis qu'un URI tel que file:///sdcard/test s'affiche 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 les cas où l'élément racine d'un document est l'élément à défilement. Dans les versions précédentes, la position de défilement était définie sur l'élément du corps et l'élément racine n'avait aucune valeur de défilement. 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.