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 version ultérieure doivent modifier leurs applications pour qu'elles prennent 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 la section 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, afin que le système l'accorde 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 SecurityException.

Modifications apportées à la confidentialité

Si votre application cible Android 9, vous devez conserver les éléments suivants les changements de comportement à l’esprit. Ces mises à jour des informations DNS et série sur l'appareil pour améliorer la confidentialité des utilisateurs.

Abandon 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 doit accéder au numéro de série 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 du système utilise DNS-over-TLS, le client DNS intégré utilise soit un DNS chiffré vers le même nom d'hôte que le ou est désactivé au profit du résolveur 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. Toutefois, ces modifications ne prennent effet que si votre application cible le niveau d'API 28 ou une version ultérieure.

TLS réseau activé par défaut

Si votre application cible Android 9 ou une version ultérieure, le 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 la sécurité réseau de votre application.

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

Pour améliorer la stabilité des applications et l'intégrité des données sous Android 9, les applications ne peuvent pas partager des données WebView uniques répertoire parmi plusieurs processus. En règle générale, ces répertoires de données stockent des cookies, des caches HTTP et d'autres espaces de stockage persistants et temporaires liés à la navigation sur le Web.

Dans la plupart des cas, votre application doit utiliser des classes issues de Package android.webkit, tel que en tant que WebView et CookieManager, en un seul processus. Par exemple, vous devez tout déplacer Objets Activity qui utilisent un WebView dans le même processus. Vous pouvez appliquer le principe d'une "seule procédure" de façon plus stricte règle en appelant disableWebView() po les autres processus de votre application. Cet appel empêche l'initialisation de WebView. dans ces autres processus, même s'il est appelé par erreur bibliothèque.

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 des données de votre application .

Domaines SELinux par application

Les applications qui ciblent Android 9 ou version ultérieure ne peuvent pas partager de données avec d'autres applications à l'aide d'autorisations Unix accessibles au public. Cette modification améliore l'intégrité Bac à sable d'application Android en particulier l'exigence que l'utilisateur vos données privées sont accessibles uniquement par cette application.

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

Modifications de connectivité

Comptage des données de connectivité et multichemin

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 le paramètre par défaut actuel (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 mentionné ci-dessus. À 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. Applications exécutées sur Android 9 doit appeler la méthode et respecter cette indication.

La classe ConnectivityManager.NetworkCallback envoie désormais des informations sur les VPN aux applications. Avec ce changement, il est beaucoup plus facile pour que les applications écoutent les événements de connectivité sans avoir à combiner des les appels asynchrones et l'utilisation d'API limitées. De plus, 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 pas 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 Apache d'exécution, les applications peuvent regrouper leurs propre version de la bibliothèque org.apache.http dans son APK. Dans ce cas, vous devez réempaqueter la bibliothèque (avec un utilitaire comme Jar Jar) pour éviter les problèmes de compatibilité de classe avec les classes fournies dans l'environnement d'exécution.

Modifications apportées à l'interface utilisateur

Afficher le focus

Les vues dont la surface 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 mode tactile. À la place, il vous appartient de demander explicitement la mise au point initiale, si vous le souhaitez.

Gestion des valeurs hexadécimales RVBA CSS

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

Le niveau 4 du module de couleurs CSS est compatible avec Chrome depuis la version 52, mais WebView désactive actuellement cette fonctionnalité, car des applications Android existantes ont été détectées comme contenant des couleurs hexadécimales 32 bits dans l'ordre Android (ARGB), ce qui entraînerait des erreurs de rendu.

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

Détection du type MIME pour le fichier: URI

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 l'extension de fichier correcte lors du chargement d'URI file: dans un WebView :

L'utilisation du contenu du fichier pour inférer des types MIME peut être source de bugs de sécurité, et cela n'est généralement pas autorisé par les navigateurs modernes.

Si l'extension d'un fichier est reconnue comme .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 non reconnue, le type MIME est du texte brut.

Par exemple, un URI tel que file:///sdcard/test.html sera affiché au format 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 de document

Android 9 gère correctement le cas où la racine d'un document est l'élément défilant. Dans les versions antérieures, la position de défilement était définie sur l'élément body, et l'élément racine n'avait aucune valeur de défilement. Android 9 active le 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, le cas échéant.

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'à l'application est réactivée.