Android 9 (API-Level 28) bietet großartige neue Funktionen für Nutzer und Entwickler. In diesem Dokument wird erläutert, was es für Entwickler Neues gibt.
Informationen zu den neuen APIs finden Sie im Bericht „API-Unterschiede“ oder in der Android API-Referenz. Du solltest dir außerdem die Verhaltensänderungen bei Android 9 ansehen, um zu erfahren, in welchen Bereichen sich Plattformänderungen auf deine Apps auswirken können.
Positionierung im Innenbereich mit WLAN-RTT
Android 9 unterstützt das Wi-Fi-Protokoll IEEE 802.11-2016, das auch als Wi-Fi Round-Trip-Time (RTT) bezeichnet wird. Damit können Sie in Ihren Apps von der Positionierung in Innenräumen profitieren.
Auf Geräten mit Android 9 und Hardwareunterstützung können deine Apps die RTT APIs verwenden, um die Entfernung zu RTT-fähigen WLAN-Zugangspunkten in der Nähe zu messen. Auf dem Gerät müssen die Standortdienste und die WLAN-Suche aktiviert sein (unter Einstellungen > Standort) und Ihre App die Berechtigung ACCESS_FINE_LOCATION
haben. Das Gerät muss keine Verbindung zu den Zugangspunkten herstellen, um RTT zu verwenden.
Aus Datenschutzgründen kann nur das Smartphone die Entfernung zum Zugangspunkt ermitteln. Die Zugangspunkte haben diese Informationen nicht.
Wenn Ihr Gerät die Entfernung zu drei oder mehr Zugangspunkten misst, können Sie mit einem Multilaterationsalgorithmus die Geräteposition schätzen, die am besten zu diesen Messungen passt. Das Ergebnis ist normalerweise auf 1 bis 2 Meter genau.
Mit dieser Genauigkeit können Sie neue Umgebungen schaffen, z. B. eine integrierte Navigation und detailgenaue standortbezogene Dienste wie die eindeutige Sprachsteuerung (z. B. „Schalte dieses Licht einschalten“) und standortbasierte Informationen (z. B. „Gibt es für dieses Produkt Sonderangebote?“).
Sehen Sie sich die verwendete WLAN RTT API in der Demo-App für Android WifiRttScan an.
Weitere Informationen finden Sie unter WLAN-Standort: Entfernung mit RTT.
Unterstützung für Display-Aussparungen
Android 9 unterstützt die neuesten randlosen Displays, die Display-Aussparungen für Kameras und Lautsprecher enthalten. Mit der Klasse DisplayCutout
können Sie Position und Form der nicht funktionsfähigen Bereiche ermitteln, in denen keine Inhalte angezeigt werden sollen. Mit der Methode getDisplayCutout()
können Sie feststellen, ob diese Ausschnitte vorhanden und platziert sind.
Mit dem neuen Attribut layoutInDisplayCutoutMode
für das Fensterlayout kann der Inhalt Ihrer App um die Ausschnitte eines Geräts angeordnet werden. Sie können für dieses Attribut einen der folgenden Werte festlegen:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
So können Sie einen Bildschirmausschnitt auf jedem Gerät oder Emulator mit Android 9 simulieren:
- Aktivieren Sie Entwickleroptionen.
- Scrollen Sie auf dem Bildschirm Entwickleroptionen nach unten zum Abschnitt Zeichnung und wählen Sie Anzeige mit Ausschnitt simulieren aus.
- Wählen Sie die Größe des Ausschnitts aus.
Benachrichtigungen
In Android 9 wurden mehrere Verbesserungen für Benachrichtigungen eingeführt, die alle für Entwickler mit API-Level 28 oder höher verfügbar sind.
Beispielcode, der Benachrichtigungen verwendet, einschließlich Funktionen von Android 9, finden Sie im People Beispiel.
Verbesserte Nachrichtenfunktion
Ab Android 7.0 (API-Level 24) konnten Sie eine Aktion hinzufügen, mit der Sie auf Nachrichten antworten oder anderen Text direkt aus einer Benachrichtigung eingeben können. Unter Android 9 wurde diese Funktion um folgende Verbesserungen erweitert:
Vereinfachte Unterstützung für Teilnehmer von Unterhaltungen: Mit der Klasse
Person
werden an einer Unterhaltung beteiligte Personen, einschließlich ihrer Avatare und URIs, identifiziert. Viele andere APIs wieaddMessage()
nutzen jetzt diePerson
-Klasse anstelle vonCharSequence
. Die KlassePerson
unterstützt auch das Builder-Designmuster.Unterstützung von Bildern: Unter Android 9 werden jetzt in den Nachrichtenbenachrichtigungen auf Smartphones Bilder angezeigt. Sie können
setData()
für die Nachricht verwenden, um ein Bild anzuzeigen. Das folgende Code-Snippet zeigt, wie einPerson
und eine Nachricht mit einem Bild erstellt werden.
Kotlin
// Create new Person. val sender = Person() .setName(name) .setUri(uri) .setIcon(null) .build() // Create image message. val message = Message("Picture", time, sender) .setData("image/", imageUri) val style = Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message)
Java
// Create new Person. Person sender = new Person() .setName(name) .setUri(uri) .setIcon(null) .build(); // Create image message. Message message = new Message("Picture", time, sender) .setData("image/", imageUri); Notification.MessagingStyle style = new Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message);
Antworten als Entwurf speichern: Deine App kann die vom System gesendeten
EXTRA_REMOTE_INPUT_DRAFT
abrufen, wenn ein Nutzer versehentlich eine Benachrichtigung schließt. Mit diesem Extra kannst du Textfelder in der App im Voraus ausfüllen, damit Nutzer ihre Antwort fertigstellen können.Erkennen, ob eine Unterhaltung eine Gruppenunterhaltung ist: Mit
setGroupConversation()
können Sie eine Unterhaltung gezielt als Gruppenunterhaltung oder Nicht-Gruppenunterhaltung identifizieren.Semantische Aktion für einen Intent festlegen: Mit der Methode
setSemanticAction()
können Sie einer Aktion eine semantische Bedeutung zuweisen, z. B. „Als gelesen markieren“, „Löschen“, „Antworten“ usw.Intelligente Antwort: Android 9 unterstützt dieselben vorgeschlagenen Antworten wie in der Nachrichten-App. Mit
RemoteInput.setChoices()
kannst du dem Nutzer verschiedene Standardantworten zur Verfügung stellen.
Kanaleinstellungen, Nachrichten an alle und „Bitte nicht stören“
Mit Android 8.0 wurden Benachrichtigungskanäle eingeführt, mit denen Sie einen benutzerdefinierbaren Kanal für jeden anzuzeigenden Benachrichtigungstyp erstellen können. Unter Android 9 werden die Einstellungen für Benachrichtigungskanäle durch diese Änderungen vereinfacht:
Channelgruppen blockieren: Nutzer können jetzt ganze Gruppen von Kanälen in den Benachrichtigungseinstellungen für eine App blockieren. Mit der Methode
isBlocked()
können Sie feststellen, wann eine Gruppe blockiert ist, und folglich keine Benachrichtigungen für Kanäle in dieser Gruppe senden.Außerdem kann Ihre App mit der neuen Methode
getNotificationChannelGroup()
die aktuellen Einstellungen für Channelgruppen abfragen.Neue Broadcast-Intent-Typen: Das Android-System sendet jetzt Broadcast-Intents, wenn sich der Blockierungsstatus von Benachrichtigungskanälen und Channelgruppen ändert. Die App, die Inhaber des blockierten Kanals oder der blockierten Gruppe ist, kann diese Intents überwachen und entsprechend reagieren. Weitere Informationen zu diesen Intent-Aktionen und -Extras finden Sie in der Liste der aktualisierten Konstanten in der Referenz zu
NotificationManager
. Informationen zum Reagieren auf Broadcast-Intents finden Sie unter Broadcasts.Für
NotificationManager.Policy
gibt es drei neue „Bitte nicht stören“-Prioritätskategorien:PRIORITY_CATEGORY_ALARMS
priorisiert Alarme.PRIORITY_CATEGORY_MEDIA
priorisiert Geräusche aus Medienquellen wie Medien und Sprachnavigation.PRIORITY_CATEGORY_SYSTEM
priorisiert Systemtöne.
NotificationManager.Policy
hat außerdem sieben neue „Nicht stören“-Konstanten, mit denen visuelle Unterbrechungen unterdrückt werden können:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
verhindert, dass die Benachrichtigung im Vollbildmodus gestartet wird.SUPPRESSED_EFFECT_LIGHTS
blockiert Benachrichtigungsleuchten.SUPPRESSED_EFFECT_PEEK
verhindert, dass Benachrichtigungen kurzzeitig zu sehen sind.SUPPRESSED_EFFECT_STATUS_BAR
verhindert, dass Benachrichtigungen in der Statusleiste auf Geräten angezeigt werden, die Statusleisten unterstützen.SUPPRESSED_EFFECT_BADGE
blockiert Badges auf Geräten, die die Kennzeichnung unterstützen. Weitere Informationen finden Sie unter Benachrichtigungskennzeichen ändern.SUPPRESSED_EFFECT_AMBIENT
blockiert Benachrichtigungen auf Geräten, die Bildschirmschoner unterstützen.SUPPRESSED_EFFECT_NOTIFICATION_LIST
verhindert, dass Benachrichtigungen in der Listenansicht auf Geräten angezeigt werden, die eine Listenansicht unterstützen, z. B. die Benachrichtigungsleiste oder den Sperrbildschirm.
Unterstützung für mehrere Kameras und Updates für Kameras
Auf Geräten mit Android 9 können Sie von zwei oder mehr physischen Kameras gleichzeitig auf Streams zugreifen. Auf Geräten mit zwei Front- oder Dual-Back-Kameras können Sie innovative Funktionen schaffen, die mit nur einer Kamera nicht möglich sind, z. B. nahtloses Zoomen, Bokeh und Stereovision. Mit der API können Sie auch einen logischen oder fusionierten Kamerastream aufrufen, der automatisch zwischen zwei oder mehr Kameras wechselt.
Zu den weiteren Verbesserungen für die Kamera gehören zusätzliche Sitzungsparameter, mit denen Verzögerungen bei der ersten Aufnahme reduziert werden können, sowie die Freigabe der Oberfläche, mit der Kameraclients verschiedene Anwendungsfälle bearbeiten können, ohne das Kamerastreaming zu stoppen und zu starten. Außerdem wurden APIs für die displaybasierte Flash-Unterstützung und den Zugriff auf OIS-Zeitstempel für die Bildstabilisierung und Spezialeffekte auf App-Ebene hinzugefügt.
In Android 9 unterstützt die API mit mehreren Kameras einfarbige Kameras für Geräte mit der Funktion FULL
oder LIMITED
.
Die monochrome Ausgabe erfolgt über das YUV_420_888
-Format mit Y als Graustufe, U (Cb) als 128 und V (Cr) als 128.
Mit Android 9 wird auch die Unterstützung für externe USB/UVC-Kameras auf unterstützten Geräten ermöglicht.
ImageDecoder für Drawables und Bitmaps
In Android 9 wird die Klasse ImageDecoder
eingeführt, die einen modernisierten Ansatz zum Decodieren von Bildern bietet. Verwenden Sie diese Klasse anstelle der BitmapFactory
und BitmapFactory.Options
APIs.
Mit ImageDecoder
können Sie einen Drawable
oder einen Bitmap
aus einem Bytezwischenspeicher, einer Datei oder einem URI erstellen. Um ein Bild zu decodieren, müssen Sie zuerst createSource()
mit der Quelle des codierten Bilds aufrufen. Rufen Sie dann decodeDrawable()
oder decodeBitmap()
auf, indem Sie das Objekt ImageDecoder.Source
übergeben, um ein Drawable
oder Bitmap
zu erstellen. Übergeben Sie OnHeaderDecodedListener
an decodeDrawable()
oder decodeBitmap()
, um die Standardeinstellungen zu ändern. ImageDecoder
ruft onHeaderDecoded()
mit der Standardbreite und -höhe des Bildes auf, sobald diese bekannt sind.
Wenn das codierte Bild ein animiertes GIF oder WebP ist, gibt decodeDrawable()
einen Drawable
zurück, der eine Instanz der AnimatedImageDrawable
-Klasse ist.
Es gibt verschiedene Methoden, um Bildeigenschaften festzulegen:
- Wenn Sie das decodierte Bild auf eine genaue Größe skalieren möchten, übergeben Sie die Zielabmessungen in
setTargetSize()
. Sie können Bilder auch anhand einer Stichprobengröße skalieren. Übergeben Sie die Stichprobengröße direkt ansetTargetSampleSize()
. - Wenn Sie ein Bild innerhalb des Bereichs des skalierten Bildes zuschneiden möchten, rufen Sie
setCrop()
auf. - Übergeben Sie
true
ansetMutableRequired()
, um eine änderbare Bitmap zu erstellen.
Mit ImageDecoder
können Sie einem Bild auch angepasste und komplizierte Effekte hinzufügen, z. B. abgerundete Ecken oder kreisförmige Masken. Verwenden Sie setPostProcessor()
mit einer Instanz der PostProcessor
-Klasse, um beliebige Zeichenbefehle auszuführen.
Animation
In Android 9 wird die Klasse AnimatedImageDrawable
zum Zeichnen und Anzeigen von animierten GIF- und WebP-Bildern eingeführt.
AnimatedImageDrawable
funktioniert ähnlich wie AnimatedVectorDrawable
, da der Rendering-Thread die Animationen von AnimatedImageDrawable
steuert.
Der Rendering-Thread verwendet auch einen Worker-Thread zum Decodieren, damit er andere Vorgänge im Renderingthread nicht beeinträchtigt. Mit dieser Implementierung kann Ihre App ein animiertes Bild anzeigen, ohne ihre Updates zu verwalten oder andere Ereignisse im UI-Thread der App zu beeinträchtigen.
Ein AnimatedImageDrawable
kann mithilfe einer Instanz von ImageDecoder
decodiert werden. Das folgende Code-Snippet zeigt, wie Sie mit ImageDecoder
Ihr AnimatedImageDrawable
-Element decodieren:
Kotlin
@Throws(IOException::class) private fun decodeImage() { val decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(resources, R.drawable.my_drawable)) // Prior to start(), the first frame is displayed. (decodedAnimation as? AnimatedImageDrawable)?.start() }
Java
private void decodeImage() throws IOException { Drawable decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(getResources(), R.drawable.my_drawable)); if (decodedAnimation instanceof AnimatedImageDrawable) { // Prior to start(), the first frame is displayed. ((AnimatedImageDrawable) decodedAnimation).start(); } }
ImageDecoder
bietet mehrere Methoden, mit denen Sie das Image weiter verändern können.
Mit der Methode setPostProcessor()
können Sie beispielsweise das Aussehen des Bildes ändern, z. B. mit einer Kreismaske oder abgerundeten Ecken.
HDR VP9 Video, HEIF-Bildkomprimierung und Medien-APIs
Android 9 bietet integrierte Unterstützung für High Dynamic Range (HDR) VP9 Profil 2, sodass du deinen Nutzern HDR-fähige Filme über YouTube, Play Filme und andere Quellen auf HDR-fähigen Geräten zur Verfügung stellen kannst.
Android 9 unterstützt außerdem die Codierung von Bildern im High Efficiency Image File Format (HEIF oder HEIC), das die Komprimierung verbessert und Speicherplatz und Netzwerkdatennutzung reduziert. Beispiele für HEIF-Standbilder werden in den Klassen MediaMuxer
und MediaExtractor
unterstützt. Dank der Plattformunterstützung auf Android 9-Geräten können Sie HEIF-Bilder ganz einfach von Ihrem Back-End-Server senden und verwenden. Nachdem Sie sich vergewissert haben, dass Ihre App mit diesem Datenformat für die Freigabe und Anzeige kompatibel ist, probieren Sie HEIF als Bildspeicherformat in Ihrer App aus. Sie können eine JPEG-zu-Heic-Konvertierung mit ImageDecoder
oder BitmapFactory
durchführen, bei der eine Bitmap aus einer JPEG-Datei abgerufen wird. Sie können dann HeifWriter
verwenden, um HEIF-Standbilder aus YUV-Bytezwischenspeichern oder Instanzen von Surface
oder Bitmap
zu schreiben.
Medienmesswerte sind auch in den Klassen AudioTrack
, AudioRecord
und MediaDrm
verfügbar.
In Android 9 werden Methoden für die MediaDRM
-Klasse eingeführt, um Messwerte, HDCP-Ebenen, Sicherheitsstufen und die Anzahl der Sitzungen zu erhalten und mehr Kontrolle über Sicherheitsebenen und sichere Stopps zu bieten. Weitere Informationen finden Sie im Bericht „API-Unterschiede“.
In Android 9 unterstützt die AAudio API mehrere zusätzliche AAudioStream-Attribute, darunter Nutzung, Inhaltstyp und Eingabevoreinstellung. Mit diesen Attributen können Sie Streams erstellen, die für VoIP- oder Camcorder-Anwendungen optimiert sind. Sie können die Sitzungs-ID auch festlegen, um einen AAudio-Stream mit einem Submix zu verknüpfen, der Effekte enthalten kann. Mit der AudioEffect
API können Sie die Auswirkungen steuern.
In Android 9 wird die AudioEffect
API für die Dynamikverarbeitung eingeführt.
Mit dieser Klasse können Sie kanalbasierte Audioeffekte – einschließlich Entzerrung, Multiband-Komprimierung und Limiter – über mehrere Stufen hinweg erstellen. Die Anzahl der Bänder und aktiven Phasen ist konfigurierbar und die meisten Parameter können in Echtzeit gesteuert werden.
Vertraulichkeit der Datenkosten in JobScheduler
Ab Android 9 kann JobScheduler
von Mobilfunkanbietern bereitgestellte Netzwerkstatussignale verwenden, um die Verarbeitung netzwerkbezogener Aufträge zu verbessern.
Jobs können die geschätzte Datengröße und den Signal-Vorabruf sowie detaillierte Netzwerkanforderungen angeben. JobScheduler
verwaltet dann die Arbeit entsprechend dem Netzwerkstatus. Wenn beispielsweise das Netzwerk signalisiert, dass es überlastet ist, kann JobScheduler
große Netzwerkanfragen verschieben. In einem kostenlosen Netzwerk kann JobScheduler
Prefetch-Jobs ausführen, um die Nutzerfreundlichkeit zu verbessern, z. B. indem Anzeigentitel vorab abgerufen werden.
Verwenden Sie beim Hinzufügen von Jobs gegebenenfalls setEstimatedNetworkBytes()
, setPrefetch()
und setRequiredNetwork()
, damit JobScheduler
die Arbeit ordnungsgemäß ausführen kann. Verwenden Sie für die Ausführung des Jobs das von JobParameters.getNetwork()
zurückgegebene Objekt Network
.
Andernfalls verwenden Sie implizit das Standardnetzwerk des Geräts, das Ihre Anforderungen möglicherweise nicht erfüllt, was zu unbeabsichtigter Datennutzung führt.
Neural Networks API 1.1
Die Neural Networks API wurde in Android 8.1 (API-Level 27) eingeführt, um das maschinelle Lernen auf dem Gerät zu beschleunigen. Android 9 erweitert und verbessert die API und unterstützt neun neue Vorgänge:
- Elementweise mathematische Operationen:
- Array-Vorgänge:
Bekanntes Problem:Wenn Sie ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
-Tensoren an den Vorgang ANEURALNETWORKS_PAD
übergeben, der unter Android 9 und höher verfügbar ist, stimmt die Ausgabe von NNAPI möglicherweise nicht mit der Ausgabe von übergeordneten ML-Frameworks wie TensorFlow Lite überein. Übergeben Sie stattdessen nur
ANEURALNETWORKS_TENSOR_FLOAT32
, bis das Problem behoben ist.
Außerdem wird mit der API die neue Funktion ANeuralNetworksModel_relaxComputationFloat32toFloat16()
eingeführt, mit der Sie angeben können, ob ANEURALNETWORKS_TENSOR_FLOAT32
mit einem Bereich und einer Genauigkeit berechnet werden soll, die bzw. die im 16-Bit-Gleitkommaformat von IEEE 754 gering sind.
AutoFill-Framework
Android 9 bietet mehrere Verbesserungen, die Autofill-Dienste implementieren können, um die Nutzerfreundlichkeit beim Ausfüllen von Formularen weiter zu verbessern. Weitere Informationen zur Verwendung von Autofill-Funktionen in Ihrer App finden Sie im Leitfaden Autofill-Framework.
Erhöhte Sicherheit
Android 9 bietet eine Reihe von Sicherheitsfunktionen, die in den folgenden Abschnitten zusammengefasst werden:
Android geschützte Bestätigung
Bei unterstützten Geräten mit Android 9 oder höher können Sie die geschützte Bestätigung von Android verwenden. Bei Verwendung dieses Workflows wird der Nutzer in Ihrer App aufgefordert, eine kurze Erklärung zu genehmigen. Mit dieser Anweisung kann die App noch einmal bestätigen, dass der Nutzer eine vertrauliche Transaktion ausführen möchte, z. B. eine Zahlung.
Wenn der Nutzer die Anweisung akzeptiert, empfängt und speichert Android Keystore eine kryptografische Signatur, die durch einen Keyed-Hash Message Authentication Code (HMAC) geschützt ist. Nachdem der Android Keystore die Gültigkeit der Nachricht bestätigt hat, kann deine Anwendung den von trustedConfirmationRequired
in der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) generierten Schlüssel zum Signieren der Nachricht verwenden, die der Nutzer akzeptiert hat. Die Signatur zeigt mit sehr hoher Sicherheit an, dass der Nutzer die Anweisung gesehen und ihr zugestimmt hat.
Achtung : Die geschützte Bestätigung von Android bietet keinen sicheren Informationskanal für den Nutzer. Ihre App darf keine Vertraulichkeitsgarantien übernehmen, die über die von der Android-Plattform angebotenen Gewährleistung hinausgehen. Verwende diesen Workflow insbesondere nicht, um vertrauliche Informationen anzuzeigen, die normalerweise nicht auf dem Gerät des Nutzers angezeigt werden würden.
Eine Anleitung zum Hinzufügen der Unterstützung für die geschützte Android-Bestätigung finden Sie im Leitfaden zu Android Protected Bestätigung.
Dialogfeld für einheitliche biometrische Authentifizierung
In Android 9 bietet das System im Namen deiner App Dialogfelder zur biometrischen Authentifizierung. Diese Funktion sorgt für ein standardisiertes Erscheinungsbild und die Platzierung des Dialogfelds, sodass Nutzer sich sicherer fühlen können, dass sie sich über ein vertrauenswürdiges biometrisches Tool zur Prüfung von Anmeldedaten authentifizieren.
Wenn Ihre Anwendung FingerprintManager
verwendet, um Nutzern ein Dialogfeld zur Fingerabdruckauthentifizierung anzuzeigen, wechseln Sie zu BiometricPrompt
. BiometricPrompt
benötigt das System, um das Authentifizierungsdialogfeld anzuzeigen. Außerdem wird das Verhalten an die Art der biometrischen Authentifizierung angepasst, die der Nutzer ausgewählt hat.
Hardware-Sicherheitsmodul
Unterstützte Geräte, auf denen Android 9 oder höher installiert ist, können einen StrongBox Keymaster haben. Das ist eine Implementierung des Keymaster-HAL, die sich in einem Hardware-Sicherheitsmodul befindet. Das Modul enthält Folgendes:
- Seine eigene CPU.
- Sicherer Speicher
- Ein echter Zufallszahlengenerator.
- Zusätzliche Mechanismen zum Schutz vor Paketmanipulation und nicht autorisiertem Sideloading von Apps.
Beim Prüfen von Schlüsseln, die im StrongBox-Keymaster gespeichert sind, bestätigt das System die Integrität eines Schlüssels mit der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE).
Weitere Informationen zur Verwendung von Strongbox Keymaster finden Sie unter Hardware-Sicherheitsmodul.
Import von sicherem Schlüssel in den Schlüsselspeicher
Android 9 bietet zusätzliche Sicherheit bei der Schlüsselentschlüsselung, da verschlüsselte Schlüssel mithilfe eines ASN.1-codierten Schlüsselformats sicher in den Schlüsselspeicher importiert werden können. Der Keymaster entschlüsselt die Schlüssel dann im Schlüsselspeicher, sodass der Inhalt der Schlüssel im Hostspeicher des Geräts nie als Klartext angezeigt wird.
Weitere Informationen zum sicheren Importieren von verschlüsselten Schlüsseln
APK-Signaturschema mit Schlüsselrotation
Android 9 unterstützt jetzt das APK-Signaturschema v3. Bei diesem Schema kann für jedes Signaturzertifikat ein Rotationsnachweis im Signaturblock eingefügt werden. Mit dieser Funktion kann Ihre App mit einem neuen Signaturzertifikat signiert werden, indem die früheren Signaturzertifikate der APK-Datei mit demjenigen verknüpft werden, mit dem sie jetzt signiert ist.
Weitere Informationen zum Rotieren von Schlüsseln mit apksigner
.
Option, die Entschlüsselung des Schlüssels nur auf entsperrten Geräten zuzulassen
In Android 9 wird das Flag unlockedDeviceRequired
eingeführt. Mit dieser Option wird festgelegt, ob für den Schlüsselspeicher der Bildschirm entsperrt werden muss, bevor die Entschlüsselung aktiver oder gespeicherter Daten mit dem angegebenen Schlüssel zugelassen wird. Diese Schlüsseltypen eignen sich gut zum Verschlüsseln sensibler Daten wie Gesundheits- oder Unternehmensdaten, die auf einem Laufwerk gespeichert werden sollen. Das Flag bietet Nutzern eine höhere Sicherheit, dass die Daten nicht entschlüsselt werden können, während das Gerät gesperrt ist, falls ihr Smartphone verloren geht oder gestohlen wird.
Damit ein Schlüssel bei gesperrtem Gerät nicht entschlüsselt werden kann, aktivieren Sie das Flag. Dazu übergeben Sie true
an die Methode setUnlockedDeviceRequired()
. Nach Abschluss dieses Schritts schlagen alle Versuche fehl, Daten mit diesem Schlüssel zu entschlüsseln oder zu signieren, wenn der Bildschirm des Nutzers gesperrt ist. Ein gesperrtes Gerät erfordert eine PIN, ein Passwort, einen Fingerabdruck oder einen anderen vertrauenswürdigen Faktor, bevor auf das Gerät zugegriffen werden kann.
Unterstützung für Legacy-Verschlüsselung
Android 9-Geräte, die mit Keymaster 4 ausgeliefert werden, unterstützen den Triple-Data-Encryption-Algorithmus, auch Triple DES. Wenn Ihre Anwendung mit Legacy-Systemen zusammenarbeitet, die Triple DES erfordern, sollten Sie diese Art der Chiffre zum Verschlüsseln vertraulicher Anmeldedaten verwenden.
Weitere Informationen dazu, wie Sie Ihre App sicherer machen, finden Sie unter Sicherheit für Android-Entwickler.
Einstellung von WPS
Die Funktion „Wi-Fi Protected Setup“ (WPS) wurde aus Sicherheitsgründen eingestellt.
Android-Sicherungen
Android 9 bietet neue Funktionen und Entwickleroptionen für die Sicherung und Wiederherstellung. Details zu diesen Änderungen finden Sie in den folgenden Abschnitten.
Back-ups der clientseitigen Verschlüsselung
Android 9 unterstützt jetzt die Verschlüsselung von Android-Sicherungen mit einem clientseitigen Secret. Diese Unterstützung ist automatisch aktiviert, wenn die folgenden Bedingungen erfüllt sind:
- Der Nutzer hat die Sicherung aktiviert und Android 9 oder höher verwendet.
- Der Nutzer hat für sein Gerät eine Displaysperre eingerichtet, die zum Entsperren eine PIN, ein Muster oder ein Passwort erfordert.
Wenn diese Datenschutzmaßnahme aktiviert ist, ist die PIN, das Muster oder das Passwort des Geräts erforderlich, um Daten aus den vom Nutzergerät erstellten Sicherungen wiederherzustellen. Weitere Informationen zur Technologie hinter dieser Funktion finden Sie im Whitepaper Google Cloud Key Vault Service.
Gerätebedingungen festlegen, die für die Sicherung erforderlich sind
Wenn Ihre App-Daten vertrauliche Informationen oder Einstellungen enthalten, können Sie mit Android 9 die Gerätebedingungen definieren, unter denen die Daten Ihrer App in die Sicherung des Nutzers aufgenommen werden, z. B. wenn die clientseitige Verschlüsselung aktiviert ist oder eine lokale Übertragung von Gerät zu Gerät stattfindet.
Weitere Informationen zum Sichern von Daten auf Android-Geräten finden Sie unter Datensicherung – Übersicht.
Bedienungshilfen
Android 9 umfasst Verbesserungen des Frameworks für Barrierefreiheit, mit denen du den Nutzern deiner App noch einfacher eine noch bessere Nutzererfahrung bieten kannst.
Navigationssemantik
Mit Attributen, die in Android 9 hinzugefügt wurden, lässt sich einfacher festlegen, wie Bedienungshilfen, insbesondere Screenreader, von einem Bildschirmbereich zum anderen wechseln. Mithilfe dieser Attribute können sehbehinderte Nutzer schnell Text auf der Benutzeroberfläche Ihrer App durchgehen und eine Auswahl treffen.
In einer Shopping-App kann ein Screenreader Nutzern beispielsweise dabei helfen, direkt von einer Angebotskategorie zur nächsten zu wechseln, ohne dass der Screenreader alle Elemente einer Kategorie lesen muss, bevor er zur nächsten übergeht.
Titel des Bereichs „Bedienungshilfen“
In Android 8.1 (API-Level 27) und niedriger können Bedienungshilfen nicht immer feststellen, wann ein bestimmter Bildschirmbereich aktualisiert wurde, z. B. wann eine Aktivität ein Fragment durch ein anderes ersetzt. Bereiche bestehen aus logisch gruppierten, visuell zusammenhängenden UI-Elementen, die in der Regel ein Fragment zusammensetzen.
Unter Android 9 kannst du für diese Bereiche Titel für die Bedienungshilfen oder individuell identifizierbare Titel angeben. Hat ein Bereich einen Titel, erhalten Bedienungshilfen detailliertere Informationen, wenn sich der Bereich ändert. Mit dieser Funktion können Dienste dem Nutzer detailliertere Informationen zu Änderungen in der UI zur Verfügung stellen.
Den Titel eines Bereichs können Sie mit dem Attribut android:accessibilityPaneTitle
angeben. Sie können auch den Titel eines UI-Bereichs aktualisieren, der zur Laufzeit ersetzt wird. Verwenden Sie dazu setAccessibilityPaneTitle()
.
Du kannst beispielsweise einen Titel für den Inhaltsbereich eines Fragment
-Objekts angeben.
Überschriftenbasierte Navigation
Wenn in Ihrer App Textinhalte mit logischen Überschriften angezeigt werden, setzen Sie das Attribut android:accessibilityHeading
für die Instanzen von View
, die diese Überschriften darstellen, auf true
. Durch das Hinzufügen dieser Überschriften erlauben Sie Bedienungshilfen, Nutzern dabei zu helfen, direkt von einer Überschrift zur nächsten zu wechseln. Jede Bedienungshilfe kann diese Funktion nutzen, um die UI-Navigation für Nutzer zu verbessern.
Gruppennavigation und -ausgabe
In Screenreadern wurde bisher das Attribut android:focusable
verwendet, um zu bestimmen, wann ein ViewGroup
oder eine Sammlung von View
-Objekten als eine Einheit gelesen werden soll. Auf diese Weise konnten die Nutzenden verstehen, dass die Ansichten logisch zusammengehören.
Unter Android 8.1 und niedriger müssen Sie jedes View
-Objekt in einer ViewGroup
als nicht fokussierbar und das ViewGroup
selbst als fokussierbar markieren. Durch diese Anordnung wurden einige Instanzen von View
auf eine Weise als fokussierbar markiert, die die Tastaturnavigation umständlicher machte.
Ab Android 9 kannst du das Attribut android:screenReaderFocusable
anstelle des Attributs android:focusable
in Situationen verwenden, in denen es unerwünschte Folgen hat, ein fokussierbares View
-Objekt zu erstellen. Screenreader fokussieren auf alle Elemente, für die android:screenReaderFocusable
oder android:focusable
auf true
gesetzt wurde.
Praktische Aktionen
Android 9 unterstützt jetzt praktische Aktionen für Nutzer:
- Interaktion mit Kurzinfos
- Mit zusätzlichen Funktionen im Framework für Barrierefreiheit erhalten Sie Zugriff auf Kurzinfos in der Benutzeroberfläche einer App. Verwenden Sie
getTooltipText()
, um den Text einer Kurzinfo zu lesen, undACTION_SHOW_TOOLTIP
undACTION_HIDE_TOOLTIP
, um Instanzen vonView
anzuweisen, ihre Kurzinfos ein- oder auszublenden. - Globale Aktionen hinzugefügt
- Mit Android 9 werden zwei zusätzliche Geräteaktionen in der Klasse
AccessibilityService
unterstützt. Ihr Dienst kann Nutzern mit den AktionenGLOBAL_ACTION_LOCK_SCREEN
bzw.GLOBAL_ACTION_TAKE_SCREENSHOT
helfen, ihre Geräte zu sperren und Screenshots zu erstellen.
Details zur Fensteränderung
Mit Android 9 ist es einfacher, Aktualisierungen der Fenster einer App zu verfolgen, wenn eine App mehrere Fenster gleichzeitig neu erstellt. Wenn ein TYPE_WINDOWS_CHANGED
-Ereignis eintritt, verwenden Sie die getWindowChanges()
API, um festzustellen, wie sich die Fenster geändert haben. Während einer Mehrfensteraktualisierung erzeugt jedes Fenster eine eigene Reihe von Ereignissen.
Die Methode getSource()
gibt die Stammansicht des Fensters zurück, das jedem Ereignis zugeordnet ist.
Wenn für eine App die Titel des Bedienungshilfenbereichs für ihre View
-Objekte definiert wurden, kann der Dienst erkennen, wenn die UI der App aktualisiert wird. Wenn ein TYPE_WINDOW_STATE_CHANGED
-Ereignis eintritt, verwenden Sie die von getContentChangeTypes()
zurückgegebenen Typen, um festzustellen, wie sich das Fenster geändert hat. Das Framework kann beispielsweise erkennen, wenn ein Bereich einen neuen Titel hat oder ein Bereich verschwunden ist.
Drehung
Um unbeabsichtigte Drehungen zu vermeiden, haben wir einen Modus hinzugefügt, der die aktuelle Ausrichtung auch dann fixiert, wenn sich die Geräteposition ändert. Nutzer können die Rotation bei Bedarf manuell auslösen, indem sie eine Schaltfläche in der Systemleiste drücken.
In den meisten Fällen sind die Auswirkungen auf die Kompatibilität von Apps minimal. Wenn Ihre App jedoch ein benutzerdefiniertes Rotationsverhalten hat oder ungewöhnliche Einstellungen für die Bildschirmausrichtung verwendet, können Probleme auftreten, die zuvor unbemerkt geblieben wären, da die Einstellung für die Nutzerrotation immer auf das Hochformat festgelegt war. Wir empfehlen Ihnen, sich das Rotationsverhalten bei allen wichtigen Aktivitäten Ihrer App anzusehen und dafür zu sorgen, dass alle Einstellungen für die Bildschirmausrichtung weiterhin optimal funktionieren.
Weitere Informationen finden Sie in den zugehörigen Verhaltensänderungen.
Text
Android 9 bietet die folgenden textbezogenen Funktionen auf der Plattform:
Vorberechneter Text: Die Klasse
PrecomputedText
verbessert die Text-Rendering-Leistung, da Sie die erforderlichen Informationen im Voraus berechnen und im Cache speichern können. Außerdem kann Ihre Anwendung damit ein Textlayout außerhalb des Hauptthreads ausführen.Lupe: Die Klasse
Magnifier
ist ein Plattform-Widget, das eine Lupe API bietet, die in allen Apps eine einheitliche Verwendung der Lupe ermöglicht.Smart Linkify: Android 9 verbessert die
TextClassifier
-Klasse, die maschinelles Lernen nutzt, um einige Entitäten im ausgewählten Text zu identifizieren und Aktionen vorzuschlagen. MitTextClassifier
kann Ihre Anwendung beispielsweise erkennen, dass der Nutzer eine Telefonnummer ausgewählt hat. Ihre App könnte dem Nutzer dann vorschlagen, über diese Nummer zu telefonieren. Die Features inTextClassifier
ersetzen die Funktionalität derLinkify
-Klasse.Textlayout: Es gibt mehrere praktische Methoden und Attribute, die die Implementierung Ihres UI-Designs erleichtern. Weitere Informationen finden Sie in der Referenzdokumentation zu
TextView
.
Vorzeitige ART-Konvertierung von DEX-Dateien
Auf Geräten mit Android 9 oder höher optimiert der Voraus-of-Time-Compiler der Android-Laufzeit (ART) komprimierte Dalvik Executable-Format-Dateien (DEX) weiter, indem die DEX-Dateien in einem App-Paket in eine kompaktere Darstellung konvertiert werden. Durch diese Änderung wird Ihre Anwendung schneller gestartet und verbraucht weniger Speicherplatz und RAM.
Von dieser Verbesserung kommen vor allem Low-End-Geräte mit niedrigeren E/A-Geschwindigkeiten des Laufwerks.
System-Tracing auf dem Gerät
Mit Android 9 können Sie System-Traces auf Ihrem Gerät aufzeichnen und einen Bericht dieser Aufzeichnungen mit Ihrem Entwicklungsteam teilen. Dieser Bericht unterstützt mehrere Formate, einschließlich HTML.
Durch das Erfassen dieser Traces können Sie Zeitdaten zu den Prozessen und Threads Ihrer App erfassen und andere Arten global signifikanter Gerätestatus ansehen.
Weitere Informationen zu diesem Tool finden Sie unter System-Tracing auf dem Gerät durchführen.