Verhaltensänderungen: Apps, die auf API-Level 28 oder höher ausgerichtet sind

Mit Android 9 (API-Level 28) werden eine Reihe von Änderungen am Android-System vorgenommen. Die folgenden Änderungen im Verhalten gelten nur für Apps, die auf API-Level 28 oder höher ausgerichtet sind. Bei Anwendungen, für die targetSdkVersion auf API-Level 28 oder höher festgelegt ist, müssen die Apps gegebenenfalls so geändert werden, dass dieses Verhalten ordnungsgemäß unterstützt wird.

Informationen zu Änderungen, die alle Apps unter Android 9 betreffen, unabhängig davon, auf welche API-Level sie ausgerichtet sind, finden Sie unter Verhaltensänderungen: alle Apps.

Dienste im Vordergrund

Apps, die auf Android 9 oder höher ausgerichtet sind und Dienste im Vordergrund verwenden, müssen die Berechtigung FOREGROUND_SERVICE anfordern. Das ist eine normale Berechtigung, die vom System automatisch der anfragenden App erteilt wird.

Wenn eine App für Android 9 oder höher versucht, einen Dienst im Vordergrund zu erstellen, ohne FOREGROUND_SERVICE anzufordern, gibt das System eine SecurityException aus.

Änderungen beim Datenschutz

Wenn deine App auf Android 9 ausgerichtet ist, solltest du die folgenden Änderungen am Verhalten berücksichtigen. Diese Aktualisierungen der seriellen Geräteinformationen und der DNS-Informationen verbessern den Datenschutz für Nutzer.

Einstellung der Build-Seriennummer

In Android 9 ist Build.SERIAL immer auf "UNKNOWN" gesetzt, um die Privatsphäre der Nutzer zu schützen.

Wenn Ihre App auf die Seriennummer eines Geräts zugreifen muss, sollten Sie stattdessen die Berechtigung READ_PHONE_STATE anfordern und dann getSerial() aufrufen.

DNS-Datenschutz

Apps, die auf Android 9 ausgerichtet sind, sollten die privaten DNS-APIs berücksichtigen. Anwendungen sollten insbesondere dafür sorgen, dass bei Verwendung des System-Resolvers DNS-over-TLS von jedem integrierten DNS-Client entweder ein verschlüsseltes DNS für denselben Hostnamen wie das System verwendet oder der System-Resolver durch den System-Resolver ersetzt wird.

Änderungen der Framework-Sicherheit

Unter Android 9 werden verschiedene Verhaltensänderungen vorgenommen, die die Sicherheit deiner App verbessern. Diese Änderungen werden jedoch nur wirksam, wenn deine App auf API-Level 28 oder höher ausgerichtet ist.

Netzwerk-TLS standardmäßig aktiviert

Wenn Ihre App auf Android 9 oder höher ausgerichtet ist, gibt die Methode isCleartextTrafficPermitted() standardmäßig false zurück. Wenn Ihre Anwendung Klartext für bestimmte Domains aktivieren muss, müssen Sie cleartextTrafficPermitted für diese Domains in der Netzwerksicherheitskonfiguration Ihrer Anwendung explizit auf true setzen.

Webbasierte Datenverzeichnisse, die nach Prozessen getrennt sind

Zur Verbesserung der App-Stabilität und Datenintegrität unter Android 9 dürfen Apps ein einzelnes WebView-Datenverzeichnis nicht für mehrere Prozesse freigeben. In der Regel speichern solche Datenverzeichnisse Cookies, HTTP-Caches und anderen nichtflüchtigen und temporären Speicher für das Surfen im Web.

In den meisten Fällen sollte Ihre Anwendung Klassen aus dem android.webkit-Paket, z. B. WebView und CookieManager, in nur einem Prozess verwenden. Beispielsweise sollten Sie alle Activity-Objekte, die eine WebView verwenden, in denselben Prozess verschieben. Sie können die Regel "Nur einen Prozess" strenger erzwingen, wenn Sie disableWebView() in den anderen Prozessen Ihrer Anwendung aufrufen. Dieser Aufruf verhindert, dass WebView versehentlich in diesen anderen Prozessen initialisiert wird, selbst wenn er von einer abhängigen Bibliothek aufgerufen wird.

Wenn Ihre Anwendung Instanzen von WebView in mehreren Prozessen verwenden muss, müssen Sie jedem Prozess mit der Methode WebView.setDataDirectorySuffix() ein eindeutiges Datenverzeichnissuffix zuweisen, bevor Sie eine bestimmte Instanz von WebView in diesem Prozess verwenden. Bei dieser Methode werden Webdaten aus jedem Prozess in einem eigenen Verzeichnis im Datenverzeichnis Ihrer Anwendung gespeichert.

App-spezifische SELinux-Domains

Apps, die auf Android 9 oder höher ausgerichtet sind, können keine Daten mit anderen Apps teilen, die weltweit zugängliche Unix-Berechtigungen verwenden. Diese Änderung verbessert die Integrität der Android-Anwendungs-Sandbox, insbesondere die Anforderung, dass private Daten nur über diese App zugänglich sind.

Wenn Sie Dateien für andere Apps freigeben möchten, verwenden Sie einen Contentanbieter.

Verbindungsänderungen

Zählen und Multipath-Daten für Konnektivitätsdaten

In Apps, die auf Android 9 oder höher ausgerichtet sind, zählt das System den Netzwerkverkehr in Netzwerken, die nicht die aktuelle Standardeinstellung sind, z. B. der Mobilfunkverkehr, wenn das Gerät über WLAN ist. Außerdem stellt das System Methoden in der NetworkStatsManager-Klasse zur Abfrage dieses Traffics bereit.

getMultipathPreference() gibt jetzt einen Wert zurück, der auf dem oben genannten Netzwerktraffic basiert. Ab Android 9 gibt die Methode true für Zellendaten zurück. Wenn sich jedoch mehr als eine bestimmte Trafficmenge an einem Tag ansammelt, wird false zurückgegeben. Apps, die unter Android 9 ausgeführt werden, müssen die Methode aufrufen und diesen Hinweis berücksichtigen.

Die Klasse ConnectivityManager.NetworkCallback sendet jetzt Informationen zu VPNs an Anwendungen. Diese Änderung erleichtert es Anwendungen, auf Verbindungsereignisse zu warten, ohne synchrone und asynchrone Aufrufe mischen und APIs verwenden zu müssen. Außerdem bedeutet dies, dass die Informationsübertragung wie erwartet funktioniert, wenn ein Gerät gleichzeitig mit mehreren WLANs oder mehreren Mobilfunknetzen verbunden ist.

Einstellung des Apache HTTP-Clients

Mit Android 6.0 haben wir die Unterstützung für den Apache HTTP-Client eingestellt. Ab Android 9 wird diese Bibliothek aus dem Bootclasspath entfernt und ist nicht standardmäßig für Anwendungen verfügbar.

Wenn Sie den Apache HTTP-Client weiterhin verwenden möchten, können Apps, die auf Android 9 und höher ausgerichtet sind, dem AndroidManifest.xml Folgendes hinzufügen:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Als Alternative zur Apache-Laufzeitbibliothek können Apps ihre eigene Version der org.apache.http-Bibliothek in ihrem APK bündeln. In diesem Fall müssen Sie die Bibliothek neu packen (mit einem Dienstprogramm wie Jar Jar), um Kompatibilitätsprobleme mit Klassen mit den in der Laufzeit bereitgestellten Klassen zu vermeiden.

Änderungen an der Benutzeroberfläche

Fokus anzeigen

Ansichten mit 0 Bereichen, d. h. entweder mit einer Breite oder Höhe von 0, können nicht mehr fokussiert werden.

Außerdem wird bei Aktivitäten im Touch-Modus nicht mehr implizit der erste Fokus zugewiesen. Stattdessen liegt es an Ihnen, den anfänglichen Fokus gegebenenfalls explizit anzufordern.

CSS-RGBA-Wert mit hexadezimalem Wert verarbeiten

Apps, die auf Android 9 oder höher ausgerichtet sind, müssen das Entwurfsverhalten für CSS-Farbmodul Stufe 4 für die Verarbeitung von vier- und achtstelligen CSS-Farben aktivieren.

CSS-Farbmodulstufe 4 wird seit Version 52 von Chrome unterstützt. WebView deaktiviert die Funktion derzeit jedoch, da vorhandene Android-Anwendungen in der Android-Reihenfolge (ARGB) hexadezimal 32-Bit-Farben enthalten, was zu Renderingfehlern führen kann.

Beispielsweise wird die Farbe #80ff8080 derzeit in WebView für Apps, die auf API-Level 27 oder niedriger ausgerichtet sind, als deckend hellrot (#ff8080) gerendert. Die führende Komponente, die von Android als Alpha-Komponente interpretiert würde, wird derzeit ignoriert. Wenn eine App auf API-Level 28 oder höher ausgerichtet ist, wird #80ff8080 als 50% transparentes Hellgrün (#80ff80) interpretiert.

MIME-Typ-Sniffing für Datei: URIs

Android-Versionen vor Android 9 konnten MIME-Typen aus dem Dateiinhalt ableiten. Ab Android 9 (API-Level 28) müssen Apps beim Laden von file:-URIs in einem WebView die richtige Dateiendung verwenden.

Die Verwendung der Dateiinhalte zur Ableitung von MIME-Typen kann eine Ursache für Sicherheitslücken sein, die von modernen Browsern nicht zulässig sind.

Wenn eine Datei eine erkannte Dateiendung wie .html, .txt, .js oder .css hat, wird der MIME-Typ durch die Endung bestimmt. Wenn eine Datei keine Endung hat oder eine unbekannte Erweiterung hat, ist der MIME-Typ „Nur Text“.

Ein URI wie file:///sdcard/test.html wird beispielsweise als HTML gerendert, aber ein URI wie file:///sdcard/test wird als Nur-Text gerendert, auch wenn die Datei HTML-Daten enthält.

Scrollelement des Dokuments

Android 9 behandelt den Fall, dass das Stammelement eines Dokuments das Scrollelement ist. In früheren Versionen wurde die Scrollposition für das body-Element festgelegt und das Stammelement hatte keine Scrollwerte. Android 9 aktiviert das standardkonforme Verhalten, wenn das Scrollelement das Stammelement ist.

Außerdem verhält sich der direkte Zugriff auf document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop oder document.documentElement.scrollLeft je nach Ziel-SDK unterschiedlich. Verwenden Sie document.scrollingElement, falls verfügbar, um auf Werte für das Scrollen des Darstellungsbereichs zuzugreifen.

Benachrichtigungen von gesperrten Apps

Vor Android 9 wurden Benachrichtigungen von gesperrten Apps deaktiviert. Ab Android 9 werden Benachrichtigungen von gesperrten Apps ausgeblendet, bis die App fortgesetzt wird.