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 ne s'appliquent qu'aux applications qui ciblent Niveau d'API 28 ou supérieur. Applications qui définissent targetSdkVersion sur le niveau d'API 28 ou plus élevé doit modifier leurs applications afin de prendre en charge ces comportements correctement, le cas échéant.

Pour les modifications qui affectent toutes les applications exécutées sous Android 9, quelle que soit l'API niveau ciblé, voir 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 le FOREGROUND_SERVICE l'autorisation. Il s'agit d'une autorisation normale, afin que le système l'accorde automatiquement à l'application à l'origine de la demande.

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

Modifications concernant 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 du build

Sous Android 9, Build.SERIAL correspond à toujours défini sur "UNKNOWN" pour protéger les données confidentialité.

Si votre application a besoin d'accéder au numéro de série matériel d'un appareil, vous devez demandez plutôt READ_PHONE_STATE l'autorisation, puis appelez 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 de 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 un niveau d'API. 28 ou 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 domaines spécifiques, vous devez définir explicitement cleartextTrafficPermitted sur true pour ces domaines, dans la section Sécurité du réseau Configuration.

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. Généralement, ces répertoires de données stockent des cookies, des caches HTTP ainsi que d'autres stockage temporaire lié à 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 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 utilisant d’autorisations Unix accessibles à travers le monde. 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 contenu d'un fournisseur de services.

Modifications de la connectivité

Comptage des données de connectivité et multi-chemins

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 définies par défaut, comme le trafic cellulaire lorsque l'appareil est allumé Wi-Fi, et fournit des méthodes dans le NetworkStatsManager pour interroger ce trafic.

En particulier, getMultipathPreference() renvoie désormais une valeur basée sur le trafic réseau mentionné ci-dessus. En commençant par Android 9, la méthode renvoie true pour les données cellulaires, mais lorsque leur nombre dépasse un certain seuil que le trafic s'accumule en une journée, il commence à renvoyer false. Applications exécutées sur Android 9 doit appeler la méthode et respecter cette indication.

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é à plusieurs de réseaux Wi-Fi ou de plusieurs réseaux mobiles simultanément.

Abandon 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 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 avec une surface nulle (soit une largeur, soit une hauteur de 0) ne sont plus sélectionnables.

De plus, les activités n'attribuent plus implicitement le focus initial mode tactile. À la place, c'est à vous de demander explicitement la priorité initiale, si comme vous le souhaitez.

Gestion des valeurs hexadécimales RVBA CSS

Les applications qui ciblent Android 9 ou version ultérieure doivent activer le brouillon Module de couleur CSS niveau 4 pour le traitement des couleurs CSS à 4 et 8 chiffres hexadécimaux.

Module de couleur CSS niveau 4 est compatible avec Chrome depuis la version 52, mais WebView désactive actuellement la fonctionnalité parce que les applications Android existantes contiennent des couleurs hexadécimales 32 bits dans l'ordre Android (ARVB), ce qui entraînerait des erreurs de rendu.

Par exemple, la couleur #80ff8080 est actuellement affichée en WebView en tant qu'opaque rouge clair (#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 fichier contenus. À 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 déduire les types MIME peut être une source de bugs de sécurité, et cela n'est généralement pas autorisé par les navigateurs récents.

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 si elle n'est pas reconnue, le type MIME sera brut du texte.

Par exemple, un URI tel que file:///sdcard/test.html sera affiché sous la forme HTML, mais un URI comme file:///sdcard/test s'affichera 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ù 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 du corps. l'élément racine n'avait aucune valeur de défilement. Android 9 permet conforme aux normes, où l'élément de défilement est la racine .

De plus, l'accès direct à document.body.scrollTop, document.body.scrollLeft document.documentElement.scrollTop ou document.documentElement.scrollLeft se comporteront différemment selon le SDK cible. Pour accéder à la fenêtre d'affichage, faites défiler 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.