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.