Neben den neuen Funktionen bietet Android 8.0 (API-Level 26) umfasst eine Vielzahl von System- und API-Verhaltensänderungen. Dieses Dokument hebt einige der wichtigsten Änderungen hervor, die Sie verstehen und berücksichtigen sollten in deinen Apps.
Die meisten dieser Änderungen betreffen alle Apps, unabhängig von der Android, auf das sie ausgerichtet sind. Einige Änderungen wirken sich jedoch nur auf das App-Targeting aus. Android 8.0 Um für mehr Klarheit zu sorgen, ist in zwei Abschnitte unterteilt: Änderungen für alle Apps und Änderungen beim App-Targeting Android 8.0
Änderungen für alle Apps
Diese Verhaltensänderungen gelten für
Ausführungslimits im Hintergrund
Eine der Änderungen, die mit Android 8.0 (API-Level 26) um die Akkulaufzeit zu verlängern, im Cache gespeichert Status, ohne aktive Komponenten, gibt das System alle in der App gespeicherten Wakelocks frei.
Um die Geräteleistung zu verbessern, schränkt das System außerdem bestimmte von Apps, die nicht im Vordergrund ausgeführt werden. Im Detail:
- Für Apps, die im Hintergrund ausgeführt werden, gibt es jetzt Einschränkungen können sie auf Hintergrunddienste zugreifen.
- Apps können ihre Manifeste nicht verwenden, um sich für die meisten impliziten Broadcasts zu registrieren (d. h. Broadcasts, die nicht speziell auf die App ausgerichtet sind).
Standardmäßig gelten diese Einschränkungen nur für Apps, die auf das Betriebssystem O ausgerichtet sind. Sie können jedoch Nutzer können diese Einschränkungen für jede App auf dem Bildschirm Einstellungen aktivieren. auch wenn die App nicht auf O ausgerichtet ist.
Unter Android 8.0 (API-Level 26) wurden außerdem bestimmte Methoden geändert:
- Die Methode
startService()
gibt jetztIllegalStateException
, wenn eine App auf Android 8.0 ausgerichtet ist, wird diese Methode wenn es nicht erlaubt ist, Hintergrunddienste zu erstellen. - Die neue Methode
Context.startForegroundService()
startet eine Dienst im Vordergrund. Das System lässt Apps zu, umContext.startForegroundService()
aufzurufen, auch wenn die App im Hintergrund. Die App muss jedoch die MethodestartForeground()
dieses Dienstes innerhalb von fünf Sekunden nach der Diensterstellung.
Weitere Informationen finden Sie unter Beschränkungen der Hintergrundausführung.
Einschränkungen für die Standortermittlung im Hintergrund unter Android
Zur Schonung des Akkus, der Nutzererfahrung und des Systemzustands Hintergrund-Apps erhalten Standortupdates seltener, wenn sie auf einem Gerät verwendet werden mit Android 8.0. Diese Verhaltensänderung betrifft alle Apps die Standortaktualisierungen erhalten, z. B. Google Play-Dienste.
Diese Änderungen betreffen die folgenden APIs:
- Anbieter für kombinierte Standortbestimmung (Fused Location Provider, FLP)
- Geofencing
- GNSS-Messungen
- Standortverwaltung
- WLAN-Manager
Führen Sie die folgenden Schritte aus, damit Ihre App wie erwartet ausgeführt wird:
- Prüfen Sie die Logik Ihrer App und achten Sie darauf, dass Sie den neuesten Standort verwenden. APIs
- Testen, ob Ihre App das Verhalten aufweist, das Sie bei jeder Verwendung erwarten Fall.
- Erwägen Sie die Verwendung des Kombiniert Location Provider (FLP) oder Geofencing, um die Anwendungsfälle zu bewältigen, die von dem aktuellen Standort des Nutzers.
Weitere Informationen zu diesen Änderungen finden Sie unter Hintergrundstandort Limits.
App-Verknüpfungen
Unter Android 8.0 (API-Level 26) wurden die folgenden Änderungen an App-Verknüpfungen vorgenommen:
- Die
com.android.launcher.action.INSTALL_SHORTCUT
-Übertragungsnr. Auswirkungen auf Ihre App hat, da sie jetzt eine private, implizite Nachricht an alle. Stattdessen solltest du eine App-Verknüpfung erstellen, indem du dierequestPinShortcut()
aus der KlasseShortcutManager
. - Das
ACTION_CREATE_SHORTCUT
kann Intent jetzt App-Verknüpfungen erstellen, die du über die KlasseShortcutManager
. Dieser Intent kann auch alten Launcher-Tastenkombinationen, die nicht mitShortcutManager
Bisher konnte dieser Intent nur Legacy-Launcher-Verknüpfungen erstellen. - Verknüpfungen erstellt mit
requestPinShortcut()
und Verknüpfungen, die in einer Aktivität erstellt wurden,ACTION_CREATE_SHORTCUT
Intents sind jetzt vollwertige App-Verknüpfungen. Dadurch können sie von Apps jetzt aktualisiert werden. mithilfe der Methoden inShortcutManager
. - Ältere Tastenkombinationen haben ihre Funktionalität aus früheren Versionen von Android, du musst sie aber in deiner App manuell in App-Verknüpfungen konvertieren.
Weitere Informationen zu Änderungen an App-Verknüpfungen findest du in der Durch Anpinnen von Verknüpfungen und Funktionsübersicht für Widgets.
Lokalisierung und Internationalisierung
Mit Android 7.0 (API-Level 24) wurde das Konzept eingeführt,
ein standardmäßiges Gebietsschema für die Kategorie angeben. Einige APIs verwenden jedoch weiterhin die Methode
Allgemein Locale.getDefault()
ohne Argumente, obwohl stattdessen die Standardeinstellung der Kategorie DISPLAY
verwendet werden sollte. In Android 8.0 (API-Level 26)
folgende Methoden verwenden jetzt Locale.getDefault(Category.DISPLAY)
statt Locale.getDefault()
:
Locale.getDisplayScript(Locale)
wird auf Locale.getDefault()
zurückgesetzt, wenn der
displayScript-Wert für Locale
angegeben
Argument ist nicht verfügbar.
Weitere Änderungen im Zusammenhang mit der Region und der Internationalisierung sind wie folgt: folgt:
- Der Aufruf von
Currency.getDisplayName(null)
löst eineNullPointerException
aus, dem dokumentierten Verhalten entsprechen. - Das Parsen des Zeitzonennamens hat sich geändert. Bisher
Android-Geräte haben den beim Booten erfassten Systemuhrwert verwendet
Zeit zum Zwischenspeichern der Zeitzonennamen, die zum Parsen des Datums verwendet werden
Mal. Infolgedessen könnte das Parsing negativ beeinflusst werden, wenn das System
oder in seltenen Fällen, dass die Uhrzeit beim Starten falsch war.
Häufig verwendet die Parsing-Logik ICU und die Aktuellen Wert der Systemuhr beim Parsen von Zeitzonennamen. Dieses Änderung liefert korrektere Ergebnisse, die sich von den vorherigen unterscheiden können. Android-Versionen, wenn Ihre App Klassen wie
SimpleDateFormat
- Mit Android 8.0 (API-Level 26) wird die ITS-Version auf Version 58 aktualisiert.
Benachrichtigungsfenster
Wenn eine App das SYSTEM_ALERT_WINDOW
und versucht einen der folgenden Fenstertypen,
Warnfenster über anderen Apps und Systemfenstern:
...dann erscheinen diese Fenster immer unter den Fenstern, die die Funktion
TYPE_APPLICATION_OVERLAY
Fenster
Typ. Wenn eine App auf Android 8.0 (API-Level 26) ausgerichtet ist, verwendet sie die
TYPE_APPLICATION_OVERLAY
Fenstertyp, um Warnfenster anzuzeigen.
Weitere Informationen finden Sie unter Gängige Fenstertypen für Benachrichtigungsfenster in den Verhaltensänderungen für Apps auf Android 8.0 ausgerichtet.
Eingabe und Navigation
Mit der Einführung von Android-Apps unter ChromeOS und anderen großen Formfaktoren wie Tablets eingesetzt werden, setzen wir die Tastaturnavigation in Android-Apps. Unter Android 8.0 (API-Level 26) haben wir mithilfe von die Tastatur als Navigationseingabegerät nutzen, was zu einer zuverlässigeren, vorhersehbares Modell für Pfeil- und Tab-basierte Navigation.
Insbesondere folgende Änderungen am Elementfokus Verhalten:
-
Wenn Sie keine Farben für den Fokusstatus für eine
View
-Objekt (Vor- oder Hintergrund) Drawable-Element), legt das Framework jetzt eine standardmäßige Fokushervorhebungsfarbe für dasView
. Diese Hervorhebung ist ein Wellen-Drawable, das basierend auf dem Thema der Aktivität.Wenn ein
View
-Objekt diese Standardeinstellung nicht verwenden soll hervorheben, wenn der Fokus darauf liegt, Attribut „android:defaultFocusHighlightEnabled
“ fürfalse
in der Layout-XML-Datei mit denView
oderfalse
übergeben ansetDefaultFocusHighlightEnabled()
in der UI-Logik deiner App fest. - Um zu testen, wie sich die Tastatureingabe auf den Fokus von UI-Elementen auswirkt, können Sie die Funktion Zeichnung > Entwickleroption „Layoutgrenzen anzeigen“. In Android 8.0 enthält, wird bei dieser Option ein "X" über dem Element, das derzeit fokussiert.
Außerdem werden in Android 8.0 alle Symbolleistenelemente Tastaturnavigations-Cluster was es Nutzenden erleichtert, als als Ganzes.
Weitere Informationen zur Verbesserung der Unterstützung der Tastaturnavigation in finden Sie im Abschnitt Unterstützende Leitfaden zur Tastaturnavigation.
Autofill für Webformulare
Da die Android-Funktion Autofill
bietet integrierte Unterstützung für die Funktion zum automatischen Ausfüllen, die
folgende Methoden im Zusammenhang mit WebView
-Objekten wurden geändert
für Apps, die auf Geräten mit Android 8.0 (API-Level 26) installiert sind:
WebSettings
-
- Die
getSaveFormData()
gibt jetztfalse
zurück. Bisher hat diese Methode Stattdessentrue
. - Anrufen
setSaveFormData()
Absage(n) keine Wirkung mehr hat.
- Die
WebViewDatabase
-
- Anrufen
clearFormData()
Absage(n) keine Wirkung mehr hat. - Die
hasFormData()
-Methode gibt jetztfalse
zurück. Bisher hat diese Methodetrue
, wenn das Formular Daten enthielt.
- Anrufen
Bedienungshilfen
Unter Android 8.0 (API-Level 26) wurden die folgenden Änderungen bei der Barrierefreiheit vorgenommen:
-
Das Bedienungshilfen-Framework konvertiert jetzt alle Doppeltipp-Gesten in
ACTION_CLICK
Aktionen. Durch diese Änderung funktioniert TalkBack nun ähnlich wie andere Bedienungshilfen.Wenn die
View
-Objekte deiner App die benutzerdefinierte Touch-Option verwenden sollten Sie überprüfen, ob sie weiterhin mit TalkBack funktionieren. Möglicherweise Sie müssen nur den Klick-Handler registrieren, mit dem IhrView
verwenden. Wenn TalkBack immer noch keine Gesten erkennt, die auf diesen Geräten ausgeführt werdenView
Objekte, überschreibenperformAccessibilityAction()
. - Bedienungshilfen kennen jetzt alle
ClickableSpan
Instanzen innerhalb derTextView
-Objekte.
Weitere Informationen zur Verbesserung der Barrierefreiheit deiner App findest du unter Bedienungshilfen:
Netzwerk und HTTP(S)-Konnektivität
Unter Android 8.0 (API-Level 26) gibt es die folgenden Verhaltensänderungen für Netzwerk- und HTTP(S)-Konnektivität:
- OPTIONS-Anfragen ohne Text haben einen
Content-Length: 0
Header. Bisher hatten sie keinenContent-Length
-Header. - HttpURLConnection normalisiert URLs mit leeren Pfaden durch Anfügen von
den Namen des Hosts oder der Zertifizierungsstelle gefolgt von einem Schrägstrich. Zum Beispiel
konvertiert
http://example.com
inhttp://example.com/
. - Einen benutzerdefinierten Proxy-Selektor, der über ProxySelector.setDefault() festgelegt wurde Die Ausrichtung erfolgt nur auf die Adresse (Schema, Host und Port) einer angeforderten URL. Daher basiert die Proxy-Auswahl möglicherweise nur auf diesen Werten. Eine URL an einen benutzerdefinierten Proxy-Selektor übergebene URL nicht Pfad, Abfrageparameter oder Fragmente.
- URIs dürfen keine leeren Labels enthalten.
Bisher hat die Plattform eine Problemumgehung unterstützt, um leere Labels in Hostnamen. Dies ist eine unzulässige Verwendung von URIs. Diese Problemumgehung bezog sich auf Kompatibilität mit älteren Libcore-Releases. Entwickler, die die API verwenden würde fälschlicherweise die ADB-Meldung angezeigt: „URI example.com has empty labels in den Hostnamen. Dieses Format ist fehlerhaft und wird in Zukunft unter Android nicht mehr akzeptiert. Veröffentlichungen.“ Unter Android 8.0 wird diese Behelfslösung entfernt: gibt das System null für fehlerhafte URIs.
- Implementierung von HttpsURLConnection in Android 8.0 kein Fallback auf unsichere Versionen des TLS/SSL-Protokolls durchführt.
- Die Verarbeitung von Tunneling-HTTP(S)-Verbindungen wurde wie folgt geändert:
<ph type="x-smartling-placeholder">
- </ph>
- Beim Tunneling einer HTTPS-Verbindung über eine Verbindung setzt die Portnummer (:443) beim Senden von Nachrichten an die an einen zwischengeschalteten Server senden. Bisher wurde der Port -Nummer nur in der CONNECT-Zeile vor.
- Das System sendet keine User-Agent- und Proxy-Autorisierung mehr.
von einer getunnelten Anfrage an den Proxyserver zu senden.
Das System sendet keinen Proxy-Autorisierungs-Header mehr an eine getunnelte Http(s)URLConnection zum Proxy beim Einrichten der Tunnel. Stattdessen generiert das System einen Proxy-Autorisierungs-Header, und sendet sie an den Proxy, wenn dieser HTTP 407-Fehler als Antwort auf die ursprüngliche Anfrage.
Ebenso wird der User-Agent-Header nicht mehr vom System kopiert. von der getunnelten Anfrage zur Proxy-Anfrage, Tunnel. Stattdessen generiert die Bibliothek einen User-Agent-Header für diesen
- Das
send(java.net.DatagramPacket)
löst eine SocketException aus, wenn die zuvor ausgeführte Connect()-Methode konnte nicht ausgeführt werden.- DatagramSocket.connect() legt eine pendingSocketException fest, wenn eine interner Fehler. Vor Android 8.0 wurde eine nachfolgende recv()-Anweisung -Aufruf löste eine SocketException aus, obwohl ein send()-Aufruf erfolgreich gewesen wäre. Aus Konsistenzgründen lösen beide Aufrufe jetzt eine SocketException aus.
- InetAddress.isReachable() versucht ICMP, bevor auf TCP Echo zurückgegriffen wird
Protokoll.
- Einige Hosts, die Port 7 (TCP Echo) blockieren, wie google.com, sind jetzt erreichbar, wenn sie das ICMP Echo-Protokoll akzeptieren.
- Für wirklich nicht erreichbare Hosts bedeutet diese Änderung, Zeit aufgewendet wird, bevor der Aufruf zurückkehrt.
Bluetooth
Unter Android 8.0 (API-Level 26) werden folgende Änderungen an der Länge des
die Daten, die ScanRecord.getBytes()
abgerufen:
- Für die Methode
getBytes()
werden keine Annahmen in Bezug auf Anzahl der empfangenen Bytes. Daher sollten Anwendungen nicht auf Mindest- oder Höchstanzahl zurückgegebener Byte. Stattdessen sollten sie Länge des resultierenden Arrays. - Daten, die mit Bluetooth 5 kompatibel sind, können Daten zurückgeben, die die vorheriges Maximum von ~60 Byte.
- Wenn ein Remote-Gerät keine Scanantwort zurückgibt, sind weniger als 60 Byte groß ebenfalls zurückgegeben werden.
Nahtlose Konnektivität
Unter Android 8.0 (API-Level 26) wurden einige Verbesserungen an den WLAN-Einstellungen vorgenommen, um die Auswahl der WLAN-Einstellungen zu erleichtern das WLAN aus, das die beste Nutzererfahrung bietet. Zu den Änderungen gehören:
- Verbesserte Stabilität und Zuverlässigkeit
- Eine intuitivere Benutzeroberfläche.
- Ein einzelnes, konsolidiertes WLAN-Einstellungsmenü.
- Auf kompatiblen Geräten: automatische Aktivierung des WLANs bei einem gespeicherten Netzwerk mit hoher Qualität ist in der Nähe.
Sicherheit
Android 8.0 umfasst die folgenden sicherheitsbezogenen Änderungen:
- SSLv3 wird von dieser Plattform nicht mehr unterstützt.
- Beim Herstellen einer HTTPS-Verbindung zu einem Server, der falsch
die Verhandlung der TLS-Protokollversion implementiert,
HttpsURLConnection
versucht nicht mehr, die Problemumgehung zu verwenden auf frühere Versionen des TLS-Protokolls zurückzugreifen und es erneut zu versuchen. - Android 8.0 (API-Level 26) wendet ein Secure Computing (SECCOMP) an nach allen Apps filtern. Die Liste der zulässigen Systemaufrufe ist beschränkt auf durch Bionik ausgesetzt. Es gibt zwar mehrere andere Systemaufrufe, aus Gründen der Abwärtskompatibilität.
- Die
WebView
-Objekte Ihrer App werden jetzt in Multiprozess ausgeführt . Webinhalte werden in einem separaten, isolierten Prozess vom die den Prozess für erhöhte Sicherheit enthält. -
Du kannst nicht mehr davon ausgehen, dass sich APKs in Verzeichnissen befinden, deren Namen enden
in -1 oder -2. Apps sollten
sourceDir
, um die und verlassen sich nicht direkt auf das Verzeichnisformat. - Informationen zu Sicherheitsverbesserungen bei der Verwendung von nativen Anzeigen Native Libraries.
Außerdem werden mit Android 8.0 (API-Level 26) die folgenden Änderungen an der Installation vorgenommen unbekannten Apps aus unbekannten Quellen:
- Der Wert der alten Einstellung
INSTALL_NON_MARKET_APPS
ist jetzt immer 1. Um zu ermitteln, ob eine unbekannte Quelle Apps installieren kann, verwenden Sie die installiert haben, sollten Sie stattdessen den Rückgabewert voncanRequestPackageInstalls()
- Wenn Sie versuchen, den Wert
INSTALL_NON_MARKET_APPS
verwendensetSecureSetting()
,UnsupportedOperationException
geworfen wird. So verhindern Sie, dass Nutzer unbekannte Apps mit unbekannten sollten Sie stattdessen die MethodeDISALLOW_INSTALL_UNKNOWN_SOURCES
Nutzer Einschränkung. -
Verwaltete Profile, die auf Geräten mit Android 8.0 (API-Level 26) erstellt wurden, haben automatisch die
DISALLOW_INSTALL_UNKNOWN_SOURCES
Nutzer Einschränkung aktiviert. Für vorhandene verwaltete Profile auf Geräten, auf Android 8.0 aktualisiert hat,DISALLOW_INSTALL_UNKNOWN_SOURCES
Nutzer wird die Einschränkung automatisch aktiviert, es sei denn, der Profilinhaber hat diese Einschränkung (vor dem Upgrade) durch folgende Einstellung deaktiviert:INSTALL_NON_MARKET_APPS
auf 1.
Weitere Informationen zur Installation unbekannter Apps findest du in der Unbekannte App Installationsberechtigungen.
Weitere Richtlinien zur Erhöhung der Sicherheit Ihrer App finden Sie unter Sicherheit für Android-Entwickler
Datenschutz
Unter Android 8.0 (API-Level 26) werden die folgenden Änderungen an der Plattform.
- Die Plattform behandelt Kennungen jetzt anders.
-
Für Apps, die vor einem OTA-Update oder einer Version von
Android 8.0 (API-Level 26)
(API-Ebene 26), wird der Wert von
ANDROID_ID
bleibt gleich es sei denn, die App wurde deinstalliert und nach dem OTA-Update neu installiert. Um die Werte in der Deinstallationen nach dem OTA-Update möglich, können Entwickler die alten und neuen Werte <ph type="x-smartling-placeholder"></ph> Schlüssel/Wert-Sicherung. - Bei Apps, die auf einem Gerät mit Android 8.0 installiert sind, wird der Wert
ANDROID_ID
ist jetzt zugeordnet pro App-Signaturschlüssel und Nutzer. Der Wert vonANDROID_ID
ist eindeutig für jede Kombination aus App-Signaturschlüssel, Nutzer und Gerät. Dadurch werden Apps mit unterschiedlichen Signaturschlüsseln auf demselben Gerät ausgeführt nicht mehr dieselbe Android-ID sehen (auch nicht für denselben Nutzer). - Wert von
ANDROID_ID
ändert sich bei der Deinstallation oder Neuinstallation des Pakets nicht, der Signaturschlüssel identisch ist (und die App wurde nicht vor einem OTA-Update Version von Android 8.0). - Wert von
ANDROID_ID
ändert sich auch dann nicht, wenn ein Systemupdate dazu führt, dass sich der Paketsignaturschlüssel ändert. - Auf Geräten, die mit Google Play-Diensten und der Werbe-ID ausgeliefert werden,
müssen Sie
<ph type="x-smartling-placeholder"></ph>
Werbe-ID. Ein einfaches Standardsystem
zur Monetarisierung von Apps,
Die Werbe-ID ist eine eindeutige ID für Werbezwecke, die vom Nutzer zurückgesetzt werden kann. Wird bereitgestellt
von Google Play-Diensten.
Andere Gerätehersteller sollten fortfahren um
ANDROID_ID
bereitzustellen.
-
Für Apps, die vor einem OTA-Update oder einer Version von
Android 8.0 (API-Level 26)
(API-Ebene 26), wird der Wert von
- Das Abfragen der Systemeigenschaft
net.hostname
erzeugt einen NULL-Wert. Ergebnis.
Logging von nicht abgefangenen Ausnahmen
Wenn eine App ein Thread.UncaughtExceptionHandler
installiert,
nicht zum standardmäßigen Thread.UncaughtExceptionHandler
,
macht das System
Die App wird nicht beendet, wenn eine nicht abgefangene Ausnahme auftritt. Ab
Unter Android 8.0 (API-Level 26) protokolliert das System den Ausnahme-Stacktrace
Situation; in früheren Versionen der Plattform hätte das System
den Ausnahme-Stacktrace protokolliert.
Wir empfehlen, benutzerdefinierte Thread.UncaughtExceptionHandler
Implementierungen immer an
den Standard-Handler; Apps, die dieser Empfehlung folgen, sind vom
über die Änderung bei Android 8.0.
findViewById()-Signaturänderung
Alle Instanzen der Methode findViewById()
geben jetzt
<T extends View> T
anstelle von View
zurück. Diese Änderung
hat folgende Auswirkungen:
- Dies kann dazu führen, dass vorhandener Code
jetzt einen mehrdeutigen Rückgabetyp hat,
Wenn z. B. sowohl
someMethod(View)
als auchsomeMethod(TextView)
, die das Ergebnis eines Aufrufs vonfindViewById()
- Bei Verwendung der Java 8-Quellsprache ist eine explizite Umwandlung in
View
, wenn der Rückgabetyp nicht eingeschränkt ist (z. B.assertNotNull(findViewById(...)).someViewMethod())
. - Überschreibungen nicht finaler
findViewById()
-Methoden (für Beispiel:Activity.findViewById()
) eine Rückgabe Typ aktualisiert.
Änderung der Nutzungsstatistiken des Anbieters für Kontakte
In früheren Versionen von Android war die Komponente „Contact Provider“
ermöglicht es Entwicklern, Nutzungsdaten für jeden Kontakt abzurufen. Diese Nutzungsdaten
enthält Informationen zu jeder E-Mail-Adresse und jeder verknüpften Telefonnummer
mit einem Kontakt, einschließlich der Häufigkeit, mit der dieser Kontakt kontaktiert wurde
und wann der Kontakt zuletzt kontaktiert wurde. Apps, die den
READ_CONTACTS
Berechtigung kann diese Daten lesen.
Apps können diese Daten weiterhin lesen, wenn sie dies anfordern
READ_CONTACTS
Berechtigung. Ab Android 8.0 (API-Level 26) werden bei Abfragen nach Nutzungsdaten
und nicht um exakte Werte. Das Android-System verwaltet
exakte Werte intern. Diese Änderung wirkt sich also nicht auf die
Auto-complete API.
Diese Verhaltensänderung betrifft die folgenden Abfrageparameter:
Handhabung der Abholung
AbstractCollection.removeAll()
und AbstractCollection.retainAll()
geben jetzt immer NullPointerException
aus. zuvor die Funktion
NullPointerException
wurde nicht ausgegeben, als die Sammlung erstellt wurde.
leer. Durch diese Änderung wird das Verhalten an die Dokumentation angepasst.
Android Enterprise
Android 8.0 (API-Level 26) ändert die Verhalten einiger APIs und Funktionen für Unternehmens-Apps, einschließlich des Geräts, Policy Controller (DPCs). Zu den Änderungen gehören:
- Neue Verhaltensweisen, damit Apps Arbeitsprofile auf vollständig verwalteten Geräten unterstützen.
- Änderungen an der Verarbeitung von Systemupdates, der App-Überprüfung und der Authentifizierung die Geräte- und Systemintegrität erhöhen.
- Verbesserungen bei der Nutzerverwaltung, bei Benachrichtigungen, beim „Letzte“ und durchgehend aktives VPN.
Hier findest du alle Änderungen für Unternehmen in Android 8.0 (API-Level 26) und erfährst, wie sie sich auf Ihre App auswirkt, lesen Sie Android im Unternehmen
Apps für Android 8.0
Diese Verhaltensänderungen gelten ausschließlich für Apps, die auf
Android 8.0 (API-Level 26) oder höher Apps, die für Android 8.0 kompiliert sind,
oder targetSdkVersion
auf Android 8.0 oder höher festlegen,
Apps so, dass diese Verhaltensweisen ordnungsgemäß unterstützt werden, sofern dies für die App erforderlich ist.
Benachrichtigungsfenster
Apps, die SYSTEM_ALERT_WINDOW
verwenden
Berechtigung darf die folgenden Fenstertypen nicht mehr zum Anzeigen von Benachrichtigungsfenstern verwenden
über anderen Apps und Systemfenstern befindet:
Stattdessen müssen Apps einen neuen Fenstertyp namens
TYPE_APPLICATION_OVERLAY
Bei Verwendung des
TYPE_APPLICATION_OVERLAY
Fenster
eingeben, um Benachrichtigungsfenster für Ihre App anzuzeigen, behalten Sie die folgenden Eigenschaften bei
des neuen Fenstertyps bedenken:
- Die Warnfenster einer App werden immer unter kritischen Systemfenstern angezeigt, z. B. als Statusleiste und IMEs.
- Das System kann Fenster verschieben oder ihre Größe anpassen,
TYPE_APPLICATION_OVERLAY
Fenstertyp, um die Bildschirmpräsentation zu verbessern. - Durch Öffnen der Benachrichtigungsleiste können Nutzer auf Einstellungen zugreifen, um
die über die Funktion
TYPE_APPLICATION_OVERLAY
Fenstertyp.
Benachrichtigungen zu Inhaltsänderungen
Unter Android 8.0 (API-Level 26) ändert sich
ContentResolver.notifyChange()
und registerContentObserver(Uri, boolean, ContentObserver)
verhalten sich bei Apps für Android 8.0.
Für diese APIs ist jetzt ein gültiger ContentProvider
erforderlich
für die Autorität in allen URIs definiert. Das Definieren eines gültigen ContentProvider
mit relevanten Berechtigungen
deine App vor Inhaltsänderungen durch schädliche Apps schützen und dich
potenziell private Daten an schädliche Apps übertragen.
Fokus ansehen
Anklickbare View
-Objekte können jetzt auch von
Standardeinstellung. Wenn ein View
-Objekt anklickbar sein soll,
fokussierbar, legen Sie
<ph type="x-smartling-placeholder"></ph>
android:focusable
-Attribut im Layout auf false
XML-Datei mit View
oder übergeben Sie false
in der Benutzeroberfläche deiner App an setFocusable()
Logik.
User-Agent-Abgleich bei der Browsererkennung
Android 8.0 (API-Level 26) und höher enthalten die
Build-ID-String OPR
. Einige Musterübereinstimmungen können
können dazu führen, dass die Browsererkennungslogik einen Nicht-Opera-Browser fälschlicherweise als Opera identifiziert.
Hier ist ein Beispiel für eine solche Musterübereinstimmung:
if(p.match(/OPR/)){k="Opera";c=p.match(/OPR\/(\d+.\d+)/);n=new Ext.Version(c[1])}
Um Probleme aufgrund einer solchen Fehlidentifizierung zu vermeiden, verwenden Sie eine andere Zeichenfolge als
OPR
als Musterabgleich für den Opera-Browser.
Sicherheit
Die folgenden Änderungen wirken sich auf die Sicherheit unter Android 8.0 (API-Level 26) aus:
- Wenn die Netzwerksicherheitskonfiguration Ihrer App
Opt-ins
Klartextzugriffe erzielen,
WebView
-Objekte können nicht über HTTP auf Websites zugreifen. Jedes Für dasWebView
-Objekt muss stattdessen HTTPS verwendet werden. - Die Systemeinstellung Unbekannte Quellen zulassen wurde entfernt. in seiner werden über die Berechtigung Unbekannte Apps installieren unbekannte App-Installationen verwaltet. aus unbekannten Quellen stammen. Weitere Informationen zu dieser neuen Berechtigung findest du in der Unbekannte App Installationsberechtigungen.
Weitere Richtlinien zur Erhöhung der Sicherheit Ihrer App finden Sie unter Sicherheit für Android-Entwickler
Kontozugriff und Sichtbarkeit
Unter Android 8.0 (API-Level 26) können Apps keinen Zugriff mehr erhalten
es sei denn, der Authenticator ist Inhaber der Konten oder der
-Nutzer gewährt diesen Zugriff. Die
Berechtigung „GET_ACCOUNTS
“
ist nicht mehr ausreichend. Damit Apps Zugriff auf ein Konto erhalten, müssen sie
entweder AccountManager.newChooseAccountIntent()
verwenden
oder ein Authenticator-spezifisches
. Nachdem eine App Zugriff auf Konten erhalten hat, kann sie
AccountManager.getAccounts()
um darauf zuzugreifen.
Einstellung von Android 8.0
LOGIN_ACCOUNTS_CHANGED_ACTION
Apps
sollten Sie stattdessen
addOnAccountsUpdatedListener()
, um während der Laufzeit Updates zu Konten zu erhalten.
Informationen zu neuen APIs und Methoden für den Kontozugriff und finden Sie unter Kontozugriff und Sichtbarkeit im Abschnitt „Neue APIs“ dieses Dokuments.
Datenschutz
Die folgenden Änderungen wirken sich auf den Datenschutz in Android 8.0 (API-Level 26) aus.
-
Die Systemattribute
net.dns1
,net.dns2
net.dns3
undnet.dns4
wurden entfernt eine Änderung zur Verbesserung des Datenschutzes auf der Plattform. -
Um Netzwerkinformationen wie DNS-Server zu erhalten, werden Anwendungen mit
ACCESS_NETWORK_STATE
Berechtigung könnenNetworkRequest
oderNetworkCallback
-Objekt. Diese Klassen sind ab Android 5.0 (API-Level 21) verfügbar. -
Build.SERIAL wurde eingestellt.
Apps, die die Seriennummer der Hardware kennen müssen, sollten stattdessen
verwenden Sie die neue Methode
Build.getSerial()
, erfordert dieREAD_PHONE_STATE
Berechtigung. -
Die
LauncherApps
API lässt kein Arbeitsprofil mehr zu Apps, um Informationen zum primären Profil abzurufen. Wenn Nutzende in einem Profil verwenden, verhält sich dieLauncherApps
API so, als gäbe es keine Apps, werden in anderen Profilen derselben Profilgruppe installiert. Wie zuvor versucht, auf nicht verwandte Profile zuzugreifen, führt zu SecurityExceptions.
Berechtigungen
Vor Android 8.0 (API-Level 26), wenn eine App eine Berechtigung angefordert hat und die Berechtigung erteilt wurde, hat das System fälschlicherweise hat der App die restlichen Berechtigungen zugewiesen, die zur selben und im Manifest registriert wurden.
Bei Apps, die auf Android 8.0 ausgerichtet sind, ist dieses Verhalten korrigiert. Der App werden nur die Berechtigungen gewährt, die sie explizit hat angefordert. Sobald der Nutzer der App eine Berechtigung erteilt hat, werden jedoch alle Nachfolgende Berechtigungsanfragen in dieser Berechtigungsgruppe sind automatisch gewährt.
Beispiel: In einer App werden sowohl READ_EXTERNAL_STORAGE
als auch
WRITE_EXTERNAL_STORAGE
.
Die Anwendung fordert READ_EXTERNAL_STORAGE
und
vom Nutzer gewährt wird. Wenn die App auf API-Level 25 oder niedriger ausgerichtet ist,
gewährt WRITE_EXTERNAL_STORAGE
gleichzeitig
da es zur selben STORAGE
-Berechtigungsgruppe gehört
die im Manifest registriert sind. Wenn die App auf Android 8.0 (API-Level 26) ausgerichtet ist, gewährt das System
zu diesem Zeitpunkt nur READ_EXTERNAL_STORAGE
;
Fordert die App jedoch später WRITE_EXTERNAL_STORAGE
an, wird das System sofort
gewährt diese Berechtigung, ohne dass der Nutzer dazu aufgefordert wird.
Medien
- Das Framework kann
automatisches Audio-Ducking
für sich allein. Wenn eine andere Anwendung den Fokus auf
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
, die Anwendung mit Fokus das Volumen reduziert, normalerweise aber keineonAudioFocusChange()
zurückgerufen und keine Audiofokus verlieren. Es sind neue APIs verfügbar, um dieses Verhalten für die pausieren müssen. - Nimmt der Nutzer einen Anruf entgegen, werden aktive Medienstreams für die Dauer des aufrufen.
- Für alle audiobezogenen APIs sollte
AudioAttributes
verwendet werden. anstelle von Audiostreamtypen, um den Anwendungsfall der Audiowiedergabe zu beschreiben. Audiostreamtypen sollten weiterhin nur für die Lautstärkeregelung verwendet werden. Andere Verwendungen von Streamtypen funktionieren weiterhin (z. B. das ArgumentstreamType
für das verworfeneAudioTrack
-Konstruktor) aber das System protokolliert dies als Fehler. - Wenn
AudioTrack
verwendet wird und die Anwendung einen ausreichend großen Audiopuffer anfordert, verwendet das Framework, falls verfügbar, die Zwischenspeicherausgabe zu verwenden. - In Android 8.0 (API-Level 26) werden Medienschaltflächenereignisse anders verarbeitet:
<ph type="x-smartling-placeholder">
- </ph>
- Umgang mit Medienschaltflächen in einer UI-Aktivität hat sich nicht geändert: Vordergrundaktivitäten haben bei der Verarbeitung weiterhin Priorität. Medienschaltflächenereignisse.
- Wenn das Medienschaltflächenereignis bei der Vordergrundaktivität nicht verarbeitet wird, leitet das System das Ereignis weiter. mit der App verknüpfen, die zuletzt lokal Audioinhalte wiedergegeben hat. Status „Aktiv“, Markierungen und Wiedergabe Der Status einer Mediensitzung wird bei der Bestimmung, welche App Medien empfängt, nicht berücksichtigt. Button-Ereignissen.
- Wenn die Mediensitzung der App veröffentlicht wurde,
sendet das System das Medienschaltflächenereignis an den
MediaButtonReceiver
, falls vorhanden. - In allen anderen Fällen verwirft das System das Medienschaltflächenereignis.
Native Bibliotheken
In Apps, die auf Android 8.0 (API-Level 26) ausgerichtet sind, sind native Bibliotheken nicht länger, wenn sie ein Ladesegment enthalten, das sowohl beschreibbar ausführbar sein. Einige Apps funktionieren aufgrund dieser Änderung möglicherweise nicht mehr, wenn sie native Bibliotheken mit falschen Ladesegmenten. Dies ist ein sicherheitshärtende Maßnahme.
Weitere Informationen finden Sie unter Beschreibbare und ausführbare Segmente.
Änderungen an der Verknüpfung sind an das API-Level gebunden, auf das eine App abzielt. Wenn es ist eine Verknüpfungsänderung Ziel-API-Level ist, kann die App die Bibliothek nicht laden. Wenn Sie eine Ausrichtung auf eine niedrigere API-Ebene als die API-Ebene, Logcat zeigt eine Warnung an.
Handhabung der Abholung
Unter Android 8.0 (API-Level 26)
Collections.sort()
ist implementiert am
List.sort()
. Umgekehrt
trifft auf Android 7.x (API-Level 24 und 25) zu:
Die Standardimplementierung von List.sort()
namens Collections.sort()
.
Durch diese Änderung kann Collections.sort()
um die Vorteile der optimierten List.sort()
Implementierungen, es gelten jedoch folgende Einschränkungen:
Implementierungen von
List.sort()
darfCollections.sort()
nicht aufrufen, da dies zu einem Stacküberlauf aufgrund unendlicher Rekursion. Wenn Sie das Standardverhalten in IhrerList
-Implementierung sollten Sie das Überschreibensort()
.Wenn eine übergeordnete Klasse
sort()
auf unangemessene Weise implementiert, in der Regel in Ordnung,List.sort()
mit einer Implementierung, die aufList.toArray()
,Arrays.sort()
undListIterator.set()
Beispiel:@Override public void sort(Comparator<? super E> c) { Object[] elements = toArray(); Arrays.sort(elements, c); ListIterator<E> iterator = (ListIterator<Object>) listIterator(); for (Object element : elements) { iterator.next(); iterator.set((E) element); } }
In den meisten Fällen können Sie auch
List.sort()
mit einem Implementierung, bei der verschiedene Standard- Implementierung abhängig vom API-Level. Beispiel:@Override public void sort(Comparator<? super E> comparator) { if (Build.VERSION.SDK_INT <= 25) { Collections.sort(this); } else { super.sort(comparator); } }
Wenn Sie Letzteres nur tun, weil Sie eine
sort()
haben möchten, auf allen API-Ebenen verfügbar ist, sollten Sie ihr einen eindeutigen Namen geben, wiesortCompat()
, anstattsort()
-
Collections.sort()
zählt jetzt als eine strukturelle Änderung Listen Sie Implementierungen auf, diesort()
aufrufen. In Versionen von der Plattform vor Android 8.0 (API-Level 26),ArrayList
und ruftsort()
darauf auf nach der Hälfte der Iteration hätteConcurrentModificationException
geworfen ob die Sortierung bereits erfolgt ist, indem duList.sort()
anrufst.Collections.sort()
keine Ausnahme ausgelöst.Durch diese Änderung wird das Plattformverhalten einheitlicher: Entweder führt jetzt zu einem
ConcurrentModificationException
.
Verhalten beim Laden von Klassen
Unter Android 8.0 (API-Level 26) wird geprüft, ob Klassenladeprogramme
die Annahmen der Laufzeit beim Laden
neuer Klassen außer Acht lassen. Diese Prüfungen sind
wird ausgeführt, ob in Java auf die Klasse (von
forName()
)
Dalvik-Bytecode oder JNI. Die Plattform fängt keine direkten Aufrufe von Java an den
loadClass()
und wird auch nicht geprüft
die Ergebnisse solcher Anrufe. Dieses Verhalten sollte sich nicht auf die Funktionsweise
Klassenladeprogrammen.
Die Plattform prüft, ob der Deskriptor der Klasse, die vom Klassenladeprogramm zurückgegeben wird, zurückgegeben wird.
entspricht dem erwarteten Deskriptor. Wenn der zurückgegebene Deskriptor nicht übereinstimmt,
gibt die Plattform den Fehler NoClassDefFoundError
aus und speichert
für die Ausnahme eine detaillierte Meldung, in der die Diskrepanz angegeben ist.
Die Plattform prüft auch, ob die Deskriptoren der angeforderten Klassen gültig sind. Dieses
check fängt JNI-Aufrufe ab, die Klassen wie GetFieldID()
,
ungültige Deskriptoren an diese Klassen übergeben. Ein Feld mit einer Signatur
java/lang/String
wurde nicht gefunden, da diese Signatur ungültig ist.
sollte Ljava/lang/String;
lauten.
Dies unterscheidet sich von einem JNI-Aufruf an FindClass()
.
Dabei ist java/lang/String
ein gültiger, voll qualifizierter Name.
Android 8.0 (API-Level 26) unterstützt nicht, dass mehrere Klassenladeprogramme versuchen, Klassen zu definieren
mit demselben DexFile-Objekt. Bei einem entsprechenden Versuch löst die Android-Laufzeit
InternalError
Fehlermeldung "Versuch, DEX-Datei <filename>
zu registrieren"
mit mehreren Klassenladern“.
Die DexFile API wurde eingestellt. Wir empfehlen Ihnen dringend, die DexFile API zu verwenden.
einem der Plattform-Classloader, einschließlich PathClassLoader
oder
BaseDexClassLoader
.
Hinweis: Sie können mehrere Klassenladeprogramme erstellen, die auf die
denselben APK- oder JAR-Datei-Container aus dem Dateisystem. Dies führt normalerweise nicht dazu,
zu viel Arbeitsspeicher-Overhead führen: Wenn DEX-Dateien im Container
komprimiert kann die Plattform einen mmap
-Vorgang an ihnen ausführen, anstatt
bei der die Daten direkt extrahiert werden. Wenn die Plattform jedoch die DEX-Datei aus dem Container extrahieren muss,
auf eine solche Weise
auf eine DEX-Datei verweisen.
In Android gelten alle Klassenladeprogramme als parallel-fähig. Wenn mehrere Threads dieselbe Klasse mit derselben Klasse laden Der erste Thread zum Abschließen des Vorgangs gewinnt und das Ergebnis wird für den anderen Threads. Dieses Verhalten tritt unabhängig davon auf, ob das Klassenladeprogramm dieselbe Klasse zurückgegeben, eine andere Klasse zurückgegeben oder eine Ausnahme ausgelöst hat. Solche Ausnahmen werden von der Plattform ignoriert.
Achtung : In Versionen der Plattform als Android 8.0 (API-Level 26). Wenn diese Annahmen nicht erfüllt sind, kann das dazu führen, und Heap-Beschädigungen durch Klassenverwirrungen, und andere unerwünschte Effekte.