Mit Android 9 (API-Level 28) werden eine Reihe von Änderungen am Android-System eingeführt.
Die folgenden Verhaltensänderungen gelten ausschließlich für Apps, die auf API-Ebene 28 oder höher ausgerichtet sind. Apps, die targetSdkVersion auf API-Level 28 oder höher festlegen, müssen ihre Apps entsprechend anpassen, sofern dies für die App zutrifft.
Änderungen, die sich auf alle Apps auswirken, die unter Android 9 ausgeführt werden, unabhängig davon, auf welche API-Ebene 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. Dies ist eine normale Berechtigung, die das System der anfragenden App automatisch gewährt.
Wenn eine App, die auf Android 9 oder höher ausgerichtet ist, versucht, einen Dienst im Vordergrund zu erstellen, ohne FOREGROUND_SERVICE anzufordern, löst das System eine SecurityException aus.
Änderungen beim Datenschutz
Wenn Ihre App auf Android 9 ausgerichtet ist, sollten Sie die folgenden Verhaltensänderungen berücksichtigen. Diese Aktualisierungen der Geräte-Seriennummer und der DNS-Informationen verbessern den Datenschutz für Nutzer.
Einstellung der Build-Seriennummer
In Android 9 ist Build.SERIAL immer auf "UNKNOWN" festgelegt, um die Privatsphäre der Nutzer zu schützen.
Wenn Ihre App auf die Hardware-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 APIs für privates DNS berücksichtigen. Insbesondere sollten Apps dafür sorgen, dass ein integrierter DNS-Client, wenn der System-Resolver DNS-over-TLS verwendet, entweder verschlüsseltes DNS für denselben Hostnamen wie das System verwendet oder zugunsten des System-Resolvers deaktiviert wird.
Änderungen an der Framework-Sicherheit
Android 9 enthält mehrere Verhaltensänderungen, die die Sicherheit Ihrer App verbessern. Diese Änderungen werden jedoch nur wirksam, wenn Ihre 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 App Klartext für bestimmte Domains zulassen muss, müssen Sie cleartextTrafficPermitted für diese Domains in der Netzwerksicherheitskonfiguration Ihrer App explizit auf true festlegen.
Webbasierte Datenverzeichnisse nach Prozess
Um die App-Stabilität und Datenintegrität in Android 9 zu verbessern, können Apps nicht mehrere Prozesse für ein einzelnes WebView-Datenverzeichnis verwenden. In solchen Datenverzeichnissen werden in der Regel Cookies, HTTP-Caches und andere persistente und temporäre Speicher im Zusammenhang mit dem Surfen im Web gespeichert.
In den meisten Fällen sollte Ihre App Klassen aus dem Paket android.webkit, z. B. WebView und CookieManager, nur in einem Prozess verwenden. Sie sollten beispielsweise alle Activity-Objekte, die eine WebView verwenden, in denselben Prozess verschieben. Sie können die Regel „nur ein Prozess“ strenger durchsetzen, indem Sie disableWebView() in den anderen Prozessen Ihrer App aufrufen. Dieser Aufruf verhindert, dass WebView in diesen anderen Prozessen versehentlich initialisiert wird, auch wenn er von einer abhängigen Bibliothek aufgerufen wird.
Wenn Ihre App Instanzen von WebView in mehreren Prozessen verwenden muss, müssen Sie jedem Prozess mit der Methode WebView.setDataDirectorySuffix() ein eindeutiges Datensuffix 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 App abgelegt.
SELinux-Domains pro App
Apps, die auf Android 9 oder höher ausgerichtet sind, dürfen Daten nicht mit anderen Apps teilen, wenn sie weltweit zugängliche Unix-Berechtigungen verwenden. Diese Änderung verbessert die Integrität der Android Application Sandbox, insbesondere die Anforderung, dass die privaten Daten einer App nur von dieser App aufgerufen werden können.
Wenn Sie Dateien mit anderen Apps teilen möchten, verwenden Sie einen Content-Provider.
Änderungen bei der Konnektivität
Zählen von Verbindungsdaten und Multipath
In Apps, die auf Android 9 oder höher ausgerichtet sind, zählt das System den Netzwerk-Traffic in Netzwerken, die nicht das aktuelle Standardnetzwerk sind, z. B. Mobilfunk-Traffic, während das Gerät mit dem WLAN verbunden ist. Außerdem werden Methoden in der Klasse NetworkStatsManager bereitgestellt, mit denen dieser Traffic abgefragt werden kann.
Insbesondere gibt getMultipathPreference() jetzt einen Wert basierend auf dem oben genannten Netzwerk-Traffic zurück. Ab Android 9 gibt die Methode true für Mobilfunkdaten zurück. Wenn jedoch an einem Tag mehr als eine bestimmte Menge an Traffic anfällt, 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 Apps. Diese Änderung macht es für Apps viel einfacher, auf Verbindungsereignisse zu warten, ohne synchrone und asynchrone Aufrufe mischen und eingeschränkte APIs verwenden zu müssen. Außerdem bedeutet das, dass die Datenübertragung wie erwartet funktioniert, wenn ein Gerät gleichzeitig mit mehreren WLANs oder Mobilfunknetzen verbunden ist.
Einstellung des Apache HTTP-Clients
Mit Android 6.0 wurde die Unterstützung für den Apache HTTP-Client entfernt. Ab Android 9 wird diese Bibliothek aus dem Boot-Classpath entfernt und ist standardmäßig nicht für Apps verfügbar.
Wenn Sie den Apache HTTP-Client weiterhin verwenden möchten, können Apps, die auf Android 9 und höher ausgerichtet sind, Folgendes zu ihrer AndroidManifest.xml hinzufügen:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Als Alternative zur Verwendung der Apache-Laufzeitbibliothek können Apps ihre eigene Version der org.apache.http-Bibliothek in ihr APK einbinden. In diesem Fall müssen Sie die Bibliothek mit einem Tool wie Jar Jar neu verpacken, um Probleme mit der Klassenkompatibilität mit den in der Laufzeitumgebung bereitgestellten Klassen zu vermeiden.
Änderungen an der Benutzeroberfläche
Fokus ansehen
Ansichten mit einer Fläche von 0 (entweder Breite oder Höhe ist 0) können nicht mehr fokussiert werden.
Außerdem wird in Aktivitäten im Touch-Modus nicht mehr implizit der anfängliche Fokus zugewiesen. Stattdessen müssen Sie den anfänglichen Fokus explizit anfordern, wenn Sie dies wünschen.
Verarbeitung von RGBA-Hexadezimalwerten für CSS
Apps, die auf Android 9 oder höher ausgerichtet sind, müssen das Verhalten des CSS Color Module Level 4-Entwurfs für die Verarbeitung von CSS-Farben mit 4 und 8 Hexadezimalziffern aktivieren.
Das CSS Color Module Level 4 wird von Chrome seit Version 52 unterstützt, aber in WebView ist die Funktion derzeit deaktiviert, da in bestehenden Android-Anwendungen 32-Bit-Hexadezimalfarben in der Android-Reihenfolge (ARGB) gefunden wurden, die zu Rendering-Fehlern führen würden.
Die Farbe #80ff8080 wird beispielsweise in WebView derzeit als undurchsichtiges Hellrot (#ff8080) für Apps mit Ausrichtung auf API-Ebene 27 oder niedriger 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 file:-URIs
Bei Android-Versionen vor Android 9 konnten MIME-Typen aus dem Dateiinhalt abgeleitet werden. Ab Android 9 (API-Ebene 28) müssen Apps die richtige Dateiendung verwenden, wenn sie file:-URIs in einem WebView laden.
Wenn Sie den Dateiinhalt verwenden, um MIME-Typen abzuleiten, kann dies zu Sicherheitslücken führen. Moderne Browser erlauben dies in der Regel nicht.
Wenn eine Datei eine erkannte Dateiendung wie .html, .txt, .js oder .css hat, wird der MIME-Typ anhand der Endung bestimmt.
Wenn eine Datei keine oder eine unbekannte Erweiterung hat, ist der MIME-Typ „plain text“.
Ein URI wie file:///sdcard/test.html wird beispielsweise als HTML gerendert, ein URI wie file:///sdcard/test als Nur-Text, auch wenn die Datei HTML-Daten enthält.
Dokument-Scrolling-Element
Unter Android 9 wird der Fall, in dem das Stammelement eines Dokuments das scrollelement ist, korrekt behandelt. In früheren Versionen wurde die Scrollposition für das Body-Element festgelegt und das Root-Element hatte keine Scrollwerte. In Android 9 wird das standardkonforme Verhalten aktiviert, bei dem das scollende Element 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 die Werte für das Scrollen im Viewport zuzugreifen.
Benachrichtigungen von gesperrten Apps
Vor Android 9 wurden Benachrichtigungen von gesperrten Apps abgebrochen. Ab Android 9 werden Benachrichtigungen von angehaltenen Apps ausgeblendet, bis die App wieder aktiviert wird.