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.