Android 9 (API-Level 28) bietet viele neue Funktionen für Nutzer und Entwickler. In diesem Dokument wird beschrieben, was für Entwickler neu ist.
Weitere Informationen zu den neuen APIs finden Sie im API-Diff-Bericht oder in der Android-API-Referenz. Sehen Sie sich auch die Verhaltensänderungen in Android 9 an, um zu erfahren, in welchen Bereichen sich Plattformänderungen auf Ihre Apps auswirken können.
Indoor-Positionierung mit WLAN RTT
Mit Android 9 wird die Plattformunterstützung für das IEEE 802.11-2016-WLAN-Protokoll (auch als Wi-Fi Round-Trip-Time, RTT, bezeichnet) eingeführt, damit Sie die Indoor-Positionierung in Ihren Apps nutzen können.
Auf Geräten mit Android 9 und Hardwareunterstützung können Ihre Apps die RTT-APIs verwenden, um die Entfernung zu WLAN-Zugriffspunkten (APs) in der Nähe zu messen, die RTT unterstützen. Auf dem Gerät müssen die Standortdienste aktiviert und die WLAN-Suche aktiviert sein (unter Einstellungen > Standort). Außerdem muss Ihre App die Berechtigung ACCESS_FINE_LOCATION haben. Das Gerät muss sich nicht mit den Zugangspunkten verbinden, 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 mindestens drei Zugriffspunkten misst, können Sie einen Multilaterationsalgorithmus verwenden, um die Geräteposition zu schätzen, die am besten zu diesen Messungen passt. Das Ergebnis ist in der Regel auf 1 bis 2 Meter genau.
Mit dieser Genauigkeit können Sie neue Funktionen wie die Navigation in Gebäuden und standortbezogene Dienste mit hoher Genauigkeit entwickeln, z. B. eindeutige Sprachsteuerung (z. B. Schalte dieses Licht ein) und standortbezogene Informationen (z. B. Gibt es Sonderangebote für dieses Produkt?).
Die Verwendung der WiFi RTT API wird in der Android WifiRttScan-Demo-App veranschaulicht.
Weitere Informationen finden Sie unter WLAN-Standort: Entfernungsmessung mit RTT.
Unterstützung von Display-Aussparungen
Display-Aussparung mit dem Emulator testen
Android 9 bietet Unterstützung für die neuesten Edge-to-Edge-Displays mit Display-Aussparungen für Kameras und Lautsprecher. Mit der Klasse DisplayCutout können Sie den Standort und die Form der nicht funktionalen Bereiche ermitteln, in denen keine Inhalte angezeigt werden sollten. Verwenden Sie die Methode getDisplayCutout(), um die Existenz und Platzierung dieser Ausschnittbereiche zu ermitteln.
Mit dem neuen Fensterlayout-Attribut layoutInDisplayCutoutMode kann Ihre App ihre Inhalte um die Ausschnitte eines Geräts herum anordnen. Sie können dieses Attribut auf einen der folgenden Werte festlegen:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULTLAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGESLAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Sie können einen Ausschnitt auf jedem Gerät oder Emulator mit Android 9 simulieren:
- Aktivieren Sie die Entwickleroptionen.
- Scrollen Sie auf dem Bildschirm Entwickleroptionen zum Bereich Zeichnen und wählen Sie Display mit Ausschnitt simulieren aus.
- Wählen Sie die Größe des Ausschnitts aus.
Benachrichtigungen
In Android 9 wurden mehrere Verbesserungen an Benachrichtigungen eingeführt, die alle für Entwickler verfügbar sind, die auf API-Level 28 und höher ausgerichtet sind.
MessagingStyle mit angehängtem Foto.
MessagingStyle mit Antworten und Unterhaltung.
Beispielcode für die Verwendung von Benachrichtigungen, einschließlich Android 9-Funktionen, finden Sie im People-Beispiel.
Verbesserte Messaging-Funktionen
Ab Android 7.0 (API-Level 24) konnten Sie einer Benachrichtigung eine Aktion hinzufügen, um direkt über die Benachrichtigung auf Nachrichten zu antworten oder anderen Text einzugeben. In Android 9 wurde diese Funktion durch die folgenden Verbesserungen erweitert:
Vereinfachte Unterstützung für Gesprächsteilnehmer: Die Klasse
Personwird verwendet, um Personen zu identifizieren, die an einem Gespräch beteiligt sind, einschließlich ihrer Avatare und URIs. Viele andere APIs, z. B.addMessage(), verwenden jetzt die KlassePersonanstelle vonCharSequence. Die KlassePersonunterstützt auch das Builder-Entwurfsmuster.Unterstützung für Bilder: In Android 9 werden jetzt Bilder in Messaging-Benachrichtigungen auf Smartphones angezeigt. Sie können
setData()in der Nachricht verwenden, um ein Bild anzuzeigen. Das folgende Code-Snippet zeigt, wie Sie einPerson-Objekt und eine Nachricht mit einem Bild erstellen.
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 Entwürfe speichern: Ihre App kann die
EXTRA_REMOTE_INPUT_DRAFTabrufen, die vom System gesendet wird, wenn ein Nutzer versehentlich eine Messaging-Benachrichtigung schließt. Mit diesem Extra können Sie Textfelder in der App vorab ausfüllen, damit Nutzer ihre Antwort fertigstellen können.Gruppenunterhaltung erkennen: Mit
setGroupConversation()können Sie eine Unterhaltung gezielt als Gruppenunterhaltung oder als Unterhaltung mit nur zwei Personen kennzeichnen.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“ oder „Antworten“.SmartReply: Android 9 unterstützt dieselben vorgeschlagenen Antworten, die in Ihrer Messaging-App verfügbar sind. Verwenden Sie
RemoteInput.setChoices(), um dem Nutzer eine Reihe von Standardantworten zur Verfügung zu stellen.
Kanaleinstellungen, Übertragungen und „Bitte nicht stören“
Mit Android 8.0 wurden Benachrichtigungskanäle eingeführt. Damit können Sie für jeden Benachrichtigungstyp, den Sie anzeigen möchten, einen vom Nutzer anpassbaren Kanal erstellen. In Android 9 wurden die Einstellungen für Benachrichtigungskanäle vereinfacht:
Channelgruppen blockieren: Nutzer können jetzt ganze Gruppen von Channels in den Benachrichtigungseinstellungen für eine App blockieren. Mit der Methode
isBlocked()können Sie ermitteln, wann eine Gruppe blockiert wird, und daher keine Benachrichtigungen für Channels 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 ‑kanalgruppen ändert. Die App, die den blockierten Channel oder die blockierte Gruppe besitzt, kann auf diese Intents reagieren. Weitere Informationen zu diesen Intent-Aktionen und Extras finden Sie in der aktualisierten Konstantenliste in der
NotificationManager-Referenz. Informationen zum Reagieren auf Broadcast-Intents finden Sie unter Broadcasts.NotificationManager.Policyhat drei neue Prioritätskategorien für den Nicht stören-Modus:PRIORITY_CATEGORY_ALARMSpriorisiert Wecker.PRIORITY_CATEGORY_MEDIApriorisiert Töne aus Medienquellen wie Medien und Sprachnavigation.PRIORITY_CATEGORY_SYSTEMpriorisiert Systemtöne.
NotificationManager.Policybietet außerdem sieben neue „Bitte nicht stören“-Konstanten, mit denen Sie visuelle Unterbrechungen unterdrücken können:SUPPRESSED_EFFECT_FULL_SCREEN_INTENTverhindert, dass durch die Benachrichtigung eine Vollbildaktivität gestartet wird.SUPPRESSED_EFFECT_LIGHTSblockiert Benachrichtigungs-LEDs.SUPPRESSED_EFFECT_PEEKverhindert, dass Benachrichtigungen kurz eingeblendet werden („Peeking“).SUPPRESSED_EFFECT_STATUS_BARverhindert, dass Benachrichtigungen in der Statusleiste auf Geräten angezeigt werden, die Statusleisten unterstützen.SUPPRESSED_EFFECT_BADGEblockiert Badges auf Geräten, die Badges unterstützen. Weitere Informationen finden Sie unter Benachrichtigungsbadge ändern.SUPPRESSED_EFFECT_AMBIENTblockiert Benachrichtigungen auf Geräten, die Bildschirmschoner unterstützen.SUPPRESSED_EFFECT_NOTIFICATION_LISTverhindert, dass Benachrichtigungen in der Listenansicht auf Geräten angezeigt werden, die eine Listenansicht unterstützen, z. B. in der Benachrichtigungsleiste oder auf dem Sperrbildschirm.
Unterstützung mehrerer Kameras und Kamera-Updates
Auf Geräten mit Android 9 können Sie gleichzeitig auf Streams von zwei oder mehr physischen Kameras zugreifen. Auf Geräten mit zwei Front- oder Rückkameras können Sie innovative Funktionen erstellen, die mit nur einer Kamera nicht möglich sind, z. B. nahtloses Zoomen, Bokeh und Stereosehen. Mit der API können Sie auch einen logischen oder kombinierten Kamerastream aufrufen, der automatisch zwischen zwei oder mehr Kameras wechselt.
Zu den weiteren Verbesserungen bei der Kamera gehören zusätzliche Sitzungsparameter, die dazu beitragen, Verzögerungen bei der ersten Aufnahme zu verringern, und die Oberflächenfreigabe, mit der Kamera-Clients verschiedene Anwendungsfälle ohne Unterbrechung und Neustart des Kamerastreams bewältigen können. Außerdem haben wir APIs für die Blitzunterstützung auf Displaybasis und den Zugriff auf OIS-Zeitstempel für die Bildstabilisierung und Spezialeffekte auf App-Ebene hinzugefügt.
In Android 9 unterstützt die Multi-Camera API Monochromkameras für Geräte mit FULL- oder LIMITED-Funktion.
Die monochrome Ausgabe wird über das Format YUV_420_888 erreicht, wobei Y als Graustufe, U (Cb) als 128 und V (Cr) als 128 verwendet werden.
Android 9 bietet auf unterstützten Geräten auch Unterstützung für externe USB-/UVC-Kameras.
ImageDecoder für Drawables und Bitmaps
Mit Android 9 wird die Klasse ImageDecoder eingeführt, die einen modernen Ansatz zum Decodieren von Bildern bietet. Verwenden Sie diese Klasse anstelle der APIs BitmapFactory und BitmapFactory.Options.
Mit ImageDecoder können Sie ein Drawable oder ein Bitmap aus einem Bytepuffer, einer Datei oder einem URI erstellen. Um ein Bild zu decodieren, rufen Sie zuerst createSource() mit der Quelle des codierten Bildes auf. Rufen Sie dann decodeDrawable() oder decodeBitmap() auf und übergeben Sie das ImageDecoder.Source-Objekt, um ein Drawable- oder ein Bitmap-Objekt zu erstellen. Wenn Sie die Standardeinstellungen ändern möchten, übergeben Sie OnHeaderDecodedListener an decodeDrawable() oder decodeBitmap(). ImageDecoder-Aufrufe
onHeaderDecoded()
mit der Standardbreite und ‑höhe des Bildes, sobald diese bekannt sind.
Wenn das codierte Bild ein animiertes GIF oder WebP ist, gibt decodeDrawable() ein Drawable zurück, das eine Instanz der Klasse AnimatedImageDrawable ist.
Es gibt verschiedene Methoden, um Bildeigenschaften festzulegen:
- Wenn Sie das decodierte Bild auf eine bestimmte Größe skalieren möchten, übergeben Sie die Zieldimensionen an
setTargetSize(). Sie können Bilder auch mit einer Stichprobengröße skalieren. Übergeben Sie den Stichprobenumfang direkt ansetTargetSampleSize(). - Wenn Sie ein Bild innerhalb des Bereichs des skalierten Bilds zuschneiden möchten, rufen Sie
setCrop()auf. - Wenn Sie ein veränderliches Bitmap erstellen möchten, übergeben Sie
trueansetMutableRequired().
Mit ImageDecoder können Sie einem Bild auch benutzerdefinierte und komplizierte Effekte wie abgerundete Ecken oder Kreismuster hinzufügen. Verwenden Sie setPostProcessor() mit einer Instanz der Klasse PostProcessor, 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 Render-Thread die Animationen von AnimatedImageDrawable steuert.
Der Rendering-Thread verwendet auch einen Arbeitsthread zum Decodieren, damit das Decodieren nicht mit anderen Vorgängen im Rendering-Thread in Konflikt gerät. Mit dieser Implementierung kann Ihre App ein animiertes Bild anzeigen, ohne dass Sie die Updates verwalten oder andere Ereignisse im UI-Thread Ihrer App beeinträchtigen müssen.
Ein AnimatedImageDrawable kann mit einer Instanz von ImageDecoder decodiert werden. Das folgende Code-Snippet zeigt, wie Sie ImageDecoder verwenden, um Ihre AnimatedImageDrawable zu 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 Bild weiter bearbeiten können.
Mit der Methode setPostProcessor() können Sie beispielsweise das Erscheinungsbild des Bildes ändern, z. B. eine Kreismaske oder abgerundete Ecken anwenden.
HDR-VP9-Video, HEIF-Bildkomprimierung und Media APIs
Android 9 bietet integrierte Unterstützung für HDR VP9 Profile 2. So können Sie HDR-fähige Filme von YouTube, Google Play Filme & Serien und anderen Quellen auf HDR-fähigen Geräten an Ihre Nutzer streamen.
Android 9 bietet auch Unterstützung für die Codierung von Bildern im HEIF-Format (High Efficiency Image File, HEIC), das die Komprimierung verbessert und den Speicherplatz- und Netzwerkdatenverbrauch reduziert. HEIF-Beispielbilder 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 Backend-Server senden und verwenden. Nachdem Sie dafür gesorgt haben, dass Ihre App mit diesem Datenformat für die Freigabe und Anzeige kompatibel ist, können Sie HEIF als Bildspeicherformat in Ihrer App ausprobieren. Sie können eine JPEG-Datei mit ImageDecoder oder BitmapFactory (die eine Bitmap aus einer JPEG-Datei abruft) in eine HEIC-Datei konvertieren. Anschließend können Sie HeifWriter verwenden, um HEIF-Standbilder aus YUV-Bytepuffern oder Instanzen von Surface oder Bitmap zu schreiben.
Media-Messwerte sind auch über die Klassen AudioTrack, AudioRecord und MediaDrm verfügbar.
In Android 9 werden Methoden für die Klasse MediaDRM eingeführt, mit denen sich unter anderem Metriken, HDCP- und Sicherheitsstufen sowie die Anzahl der Sitzungen abrufen lassen. Außerdem können Sie die Sicherheitsstufen und sicheren Stopps besser steuern. Weitere Informationen finden Sie im API-Diff-Bericht.
In Android 9 werden mit der AAudio API mehrere zusätzliche AAudioStream-Attribute unterstützt, darunter „usage“, „content type“ und „input preset“. Mit diesen Attributen können Sie Streams erstellen, die für VoIP- oder Camcorder-Anwendungen optimiert sind. Sie können auch die Sitzungs-ID festlegen, um einen AAudio-Stream einem Submix zuzuordnen, der Effekte enthalten kann. Verwenden Sie die AudioEffect API, um die Effekte zu steuern.
Mit Android 9 wird die AudioEffect API für die Dynamikverarbeitung eingeführt.
Mit dieser Klasse können Sie kanalbasierte Audioeffekte wie Equalizer, Mehrbandkomprimierung und Limiter in mehreren Phasen erstellen. Die Anzahl der Bänder und aktiven Phasen ist konfigurierbar und die meisten Parameter können in Echtzeit gesteuert werden.
Sensibilität für Datenkosten in JobScheduler
Ab Android 9 kann JobScheduler Netzwerkstatussignale von Mobilfunkanbietern verwenden, um die Verarbeitung von netzwerkbezogenen Jobs zu verbessern.
Jobs können ihre geschätzte Datengröße, das Vorabrufen von Signalen und detaillierte Netzwerkanforderungen deklarieren. JobScheduler verwaltet dann die Arbeit entsprechend dem Netzwerkstatus. Wenn das Netzwerk beispielsweise signalisiert, dass es überlastet ist, kann JobScheduler große Netzwerkanfragen aufschieben. Wenn das Gerät mit einem Netzwerk mit unbegrenztem Datenvolumen verbunden ist, kann JobScheduler Vorabruf-Jobs ausführen, um die Nutzerfreundlichkeit zu verbessern, z. B. durch das Vorabrufen von Schlagzeilen.
Achten Sie beim Hinzufügen von Jobs darauf, dass Sie setEstimatedNetworkBytes(), setPrefetch() und setRequiredNetwork() verwenden, wenn dies angemessen ist, damit JobScheduler die Arbeit richtig ausführen kann. Verwenden Sie bei der Ausführung des Jobs das Network-Objekt, das von JobParameters.getNetwork() zurückgegeben wird.
Andernfalls verwenden Sie implizit das Standardnetzwerk des Geräts, das möglicherweise nicht Ihren Anforderungen entspricht und zu einer unbeabsichtigten Datennutzung führt.
Neural Networks API 1.1
Die Neural Networks API wurde in Android 8.1 (API-Level 27) eingeführt, um das On-Device-Maschinelles Lernen auf Android-Geräten zu beschleunigen. In Android 9 wurde die API erweitert und verbessert. Es werden neun neue Vorgänge unterstützt:
- Elementweise mathematische Operationen:
- Arrayvorgänge:
Bekanntes Problem:Wenn Sie ANEURALNETWORKS_TENSOR_QUANT8_ASYMM-Tensoren an den ANEURALNETWORKS_PAD-Vorgang übergeben, der auf Android 9 und höher verfügbar ist, stimmt die Ausgabe von NNAPI möglicherweise nicht mit der Ausgabe von Machine-Learning-Frameworks auf höherer Ebene wie TensorFlow Lite überein. Sie sollten stattdessen nur
ANEURALNETWORKS_TENSOR_FLOAT32 übergeben, bis das Problem behoben ist.
Außerdem wird mit der API eine neue Funktion eingeführt: ANeuralNetworksModel_relaxComputationFloat32toFloat16(). Damit können Sie festlegen, ob ANEURALNETWORKS_TENSOR_FLOAT32 mit einem Bereich und einer Genauigkeit berechnet werden soll, die so niedrig sind wie beim IEEE 754-Gleitkommaformat mit 16 Bit.
AutoFill-Framework
In Android 9 werden mehrere Verbesserungen eingeführt, 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
In Android 9 werden eine Reihe von Sicherheitsfunktionen eingeführt, die in den folgenden Abschnitten zusammengefasst sind:
Android geschützte Bestätigung
Auf unterstützten Geräten mit Android 9 oder höher können Sie die geschützte Bestätigung von Android verwenden. Bei diesem Workflow wird in Ihrer App eine Aufforderung für den Nutzer angezeigt, in der er eine kurze Erklärung bestätigen muss. Mit dieser Anweisung kann die App bestätigen, dass der Nutzer eine sensible Transaktion wie eine Zahlung abschließen möchte.
Wenn der Nutzer die Erklärung akzeptiert, empfängt und speichert der Android-Schlüsselspeicher eine kryptografische Signatur, die durch einen Keyed-Hash Message Authentication Code (HMAC) geschützt ist. Nachdem der Android-Schlüsselspeicher die Gültigkeit der Nachricht bestätigt hat, kann Ihre App den aus trustedConfirmationRequired generierten Schlüssel in der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) verwenden, um die vom Nutzer akzeptierte Nachricht zu signieren. Die Signatur weist mit sehr hoher Wahrscheinlichkeit darauf hin, dass der Nutzer die Erklärung gesehen und ihr zugestimmt hat.
Achtung : Android geschützte Bestätigung bietet keinen sicheren Informationskanal für den Nutzer. Ihre App kann keine Vertraulichkeitsgarantien annehmen, die über die von der Android-Plattform angebotenen hinausgehen. Verwenden Sie diesen Workflow insbesondere nicht, um sensible Informationen anzuzeigen, die Sie normalerweise nicht auf dem Gerät des Nutzers anzeigen würden.
Eine Anleitung zum Hinzufügen von Unterstützung für die geschützte Bestätigung von Android finden Sie im Leitfaden zur geschützten Bestätigung von Android.
Einheitliches Dialogfeld für die biometrische Authentifizierung
In Android 9 stellt das System biometrische Authentifizierungsdialogfelder im Namen Ihrer App bereit. Diese Funktion sorgt für ein einheitliches Erscheinungsbild und eine einheitliche Platzierung des Dialogfelds. So können Nutzer besser nachvollziehen, dass sie sich mit einer vertrauenswürdigen biometrischen Anmeldedatenprüfung authentifizieren.
Wenn in Ihrer App FingerprintManager verwendet wird, um Nutzern ein Dialogfeld für die Fingerabdruckauthentifizierung zu präsentieren, wechseln Sie stattdessen zu BiometricPrompt. BiometricPrompt verlässt sich darauf, dass das System das Authentifizierungsdialogfeld anzeigt. Das Verhalten der App wird auch an die Art der biometrischen Authentifizierung angepasst, die ein Nutzer ausgewählt hat.
Hardwaresicherheitsmodul
Auf unterstützten Geräten mit Android 9 oder höher kann StrongBox KeyMint (früher Keymaster) installiert sein, eine Implementierung des KeyMint-HAL (früher Keymaster), das sich in einem Hardware-Sicherheitsmodul befindet. Das Modul enthält Folgendes:
- Eigene CPU
- Sicherer Speicher
- Ein echter Zufallszahlengenerator.
- Zusätzliche Mechanismen, um Manipulationen an Paketen und unbefugtes Sideloading von Apps zu verhindern.
Beim Prüfen von Schlüsseln, die in StrongBox KeyMint gespeichert sind, wird die Integrität eines Schlüssels vom System mit der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) abgeglichen.
Weitere Informationen zur Verwendung von StrongBox KeyMint finden Sie unter Hardware Security Module.
Sicherer Schlüsselimport in Keystore
Android 9 bietet zusätzliche Sicherheit bei der Schlüsselentschlüsselung, da verschlüsselte Schlüssel mit einem ASN.1‑codierten Schlüsselformat sicher in den Keystore importiert werden können. KeyMint entschlüsselt dann die Schlüssel im Keystore, sodass der Inhalt der Schlüssel nie als Klartext im Hostspeicher des Geräts angezeigt wird.
Weitere Informationen zum sicheren Importieren verschlüsselter Schlüssel
APK-Signaturschema mit Schlüsselrotation
Unter Android 9 wird das APK-Signaturschema v3 unterstützt. Dieses Schema bietet die Möglichkeit, für jedes Signaturzertifikat einen Rotationsnachweis-Eintrag in den Signaturblock aufzunehmen. So kann Ihre App mit einem neuen Signaturzertifikat signiert werden, indem die bisherigen Signaturzertifikate der APK-Datei mit dem Zertifikat verknüpft werden, mit dem sie jetzt signiert ist.
Weitere Informationen zum Rotieren von Schlüsseln mit apksigner
Option, die Entschlüsselung von Schlüsseln nur auf entsperrten Geräten zulässt
In Android 9 wird das Flag unlockedDeviceRequired eingeführt. Mit dieser Option wird festgelegt, ob für den Keystore der Bildschirm entsperrt sein muss, bevor Daten, die übertragen oder gespeichert werden, mit dem angegebenen Schlüssel entschlüsselt werden dürfen. Diese Arten von Schlüsseln eignen sich gut zum Verschlüsseln sensibler Daten, die auf der Festplatte gespeichert werden sollen, z. B. Gesundheits- oder Unternehmensdaten. Das Flag bietet Nutzern eine höhere Sicherheit, dass die Daten nicht entschlüsselt werden können, wenn das Gerät gesperrt ist, falls ihr Smartphone verloren geht oder gestohlen wird.
Wenn Sie einen Schlüssel vor der Entschlüsselung schützen möchten, während das Gerät gesperrt ist, aktivieren Sie das Flag, indem Sie true an die Methode setUnlockedDeviceRequired() übergeben. 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. Für den Zugriff auf ein gesperrtes Gerät ist eine PIN, ein Passwort, ein Fingerabdruck oder ein anderer vertrauenswürdiger Faktor erforderlich.
Unterstützung für Legacy-Verschlüsselung
Android 9-Geräte, die mit Keymaster 4 ausgeliefert werden, unterstützen den Triple Data Encryption Algorithm (Triple DES). Wenn Ihre App mit Legacy-Systemen zusammenarbeitet, für die Triple DES erforderlich ist, verwenden Sie diesen Chiffriertyp, wenn Sie vertrauliche Anmeldedaten verschlüsseln.
Weitere Informationen dazu, wie Sie Ihre App sicherer machen können, finden Sie hier.
Einstellung von WPS
Wi-Fi Protected Setup (WPS) wird aus Sicherheitsgründen nicht mehr unterstützt.
Android-Sicherungen
Android 9 bietet neue Funktionen und Entwickleroptionen für das Sichern und Wiederherstellen von Daten. Details zu diesen Änderungen finden Sie in den folgenden Abschnitten.
Sicherungen bei clientseitiger Verschlüsselung
Unter Android 9 werden Android-Sicherungen mit einem clientseitigen Geheimnis verschlüsselt. Diese Unterstützung wird automatisch aktiviert, wenn die folgenden Bedingungen erfüllt sind:
- Der Nutzer hat die Sicherung mit Android 9 oder höher aktiviert.
- Der Nutzer hat eine Displaysperre für sein Gerät eingerichtet, für die zum Entsperren eine PIN, ein Muster oder ein Passwort erforderlich ist.
Wenn diese Datenschutzmaßnahme aktiviert ist, ist die PIN, das Muster oder das Passwort des Geräts erforderlich, um Daten aus den Sicherungen wiederherzustellen, die vom Gerät des Nutzers erstellt wurden. Weitere Informationen zur Technologie hinter dieser Funktion finden Sie im Whitepaper Google Cloud Key Vault Service.
Gerätebedingungen für die Sicherung festlegen
Wenn Ihre App-Daten vertrauliche Informationen oder Einstellungen enthalten, können Sie in 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
In Android 9 wurden Verbesserungen am Framework für Barrierefreiheit eingeführt, die es einfacher machen, Nutzern Ihrer App ein noch besseres Nutzungserlebnis zu bieten.
Navigationssemantik
Mit den in Android 9 hinzugefügten Attributen können Sie einfacher definieren, wie Bedienungshilfen, insbesondere Screenreader, von einem Teil des Bildschirms zum anderen navigieren. Diese Attribute können Nutzern mit Sehbehinderung helfen, schnell durch Text in der Benutzeroberfläche Ihrer App zu navigieren und eine Auswahl zu treffen.
In einer Shopping-App kann ein Screenreader Nutzern beispielsweise helfen, direkt von einer Angebotskategorie zur nächsten zu wechseln, ohne dass der Screenreader alle Elemente in einer Kategorie vorlesen muss, bevor er zur nächsten wechselt.
Titel von Bedienungshilfen-Bereichen
In Android 8.1 (API-Level 27) und niedriger können Bedienungshilfen nicht immer erkennen, wann ein bestimmter Bereich des Bildschirms aktualisiert wurde, z. B. wenn 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 bilden.
In Android 9 können Sie Titel für Bedienungshilfen oder individuell identifizierbare Titel für diese Bereiche angeben. Wenn ein Bereich einen Titel für Bedienungshilfen hat, erhalten Bedienungshilfen detailliertere Informationen, wenn sich der Bereich ändert. So können Dienste Nutzern detailliertere Informationen dazu geben, was sich in der Benutzeroberfläche geändert hat.
Verwenden Sie das Attribut android:accessibilityPaneTitle, um den Titel eines Bereichs anzugeben. Sie können auch den Titel eines UI-Bereichs aktualisieren, der zur Laufzeit ersetzt wird, indem Sie setAccessibilityPaneTitle() verwenden.
Sie können beispielsweise einen Titel für den Inhaltsbereich eines Fragment-Objekts angeben.
Navigation nach Überschriften
Wenn in Ihrer App Textinhalte mit logischen Überschriften angezeigt werden, legen Sie das Attribut android:accessibilityHeading für die Instanzen von View, die diese Überschriften darstellen, auf true fest. Durch das Hinzufügen dieser Überschriften können Barrierefreiheitsdienste Nutzern helfen, direkt von einer Überschrift zur nächsten zu navigieren. Jede Bedienungshilfe kann diese Funktion nutzen, um die Navigation auf der Benutzeroberfläche für Nutzer zu verbessern.
Gruppennavigation und ‑ausgabe
Screenreader haben das Attribut android:focusable traditionell verwendet, um zu bestimmen, wann sie ein ViewGroup oder eine Sammlung von View-Objekten als eine Einheit lesen sollen. So konnten Nutzer nachvollziehen, dass die Ansichten logisch miteinander zusammenhängen.
Unter Android 8.1 und niedriger müssen Sie jedes View-Objekt in einem ViewGroup als nicht fokussierbar und das ViewGroup selbst als fokussierbar kennzeichnen. Durch diese Anordnung wurden einige Instanzen von View als fokussierbar markiert, was die Tastaturnavigation erschwerte.
Ab Android 9 können Sie das Attribut android:screenReaderFocusable anstelle des Attributs android:focusable verwenden, wenn das Fokussieren eines View-Objekts unerwünschte Folgen hat. Screenreader legen den Fokus auf alle Elemente, für die entweder android:screenReaderFocusable oder android:focusable auf true festgelegt ist.
Komfortaktionen
In Android 9 wird die Möglichkeit hinzugefügt, im Namen von Nutzern Aktionen auszuführen, die die Bedienung erleichtern:
- Interaktion mit Kurzinfos
- Durch die hinzugefügten Funktionen im Framework für Barrierefreiheit haben Sie Zugriff auf Kurzinfos in der Benutzeroberfläche einer App. Verwenden Sie
getTooltipText(), um den Text eines Tooltips zu lesen, undACTION_SHOW_TOOLTIPundACTION_HIDE_TOOLTIP, um Instanzen vonViewanzuweisen, ihre Tooltips ein- oder auszublenden. - Globale Aktionen hinzugefügt
- Mit Android 9 werden zwei zusätzliche Geräteaktionen in der Klasse
AccessibilityServiceeingeführt. Mit Ihrem Dienst können Nutzer ihre Geräte sperren und Screenshots aufnehmen, indem sie die AktionenGLOBAL_ACTION_LOCK_SCREENundGLOBAL_ACTION_TAKE_SCREENSHOTverwenden.
Details zur Änderung des Zeitfensters
Unter Android 9 ist es einfacher, Updates für die Fenster einer App zu verfolgen, wenn eine App mehrere Fenster gleichzeitig neu zeichnet. Wenn ein TYPE_WINDOWS_CHANGED-Ereignis eintritt, verwenden Sie die getWindowChanges()-API, um zu ermitteln, wie sich die Zeiträume geändert haben. Bei einer Aktualisierung im Mehrfenstermodus wird für jedes Fenster eine eigene Gruppe von Ereignissen generiert.
Die Methode getSource() gibt die Stammansicht des Fensters zurück, das mit jedem Ereignis verknüpft ist.
Wenn eine App Titel für Bedienungshilfenbereiche für ihre View-Objekte definiert hat, kann Ihr Dienst erkennen, wenn die Benutzeroberfläche der App aktualisiert wird. Wenn ein TYPE_WINDOW_STATE_CHANGED-Ereignis eintritt, verwenden Sie die von getContentChangeTypes() zurückgegebenen Typen, um zu ermitteln, wie sich das Fenster geändert hat. Das Framework kann beispielsweise erkennen, wenn ein Bereich einen neuen Titel hat oder wenn ein Bereich verschwunden ist.
Rotation
Um unbeabsichtigte Drehungen zu vermeiden, haben wir einen Modus hinzugefügt, der die aktuelle Ausrichtung fixiert, auch wenn sich die Position des Geräts ändert. Nutzer können die Drehung bei Bedarf manuell auslösen, indem sie eine Taste in der Systemleiste drücken.
Die Auswirkungen auf die Kompatibilität von Apps sind in den meisten Fällen minimal. Wenn Ihre App jedoch ein benutzerdefiniertes Rotationsverhalten oder ungewöhnliche Einstellungen für die Bildschirmausrichtung verwendet, können Probleme auftreten, die zuvor unbemerkt geblieben wären, als die Rotationspräferenz des Nutzers immer auf „Hochformat“ eingestellt war. Wir empfehlen Ihnen, das Rotationsverhalten in allen wichtigen Aktivitäten Ihrer App zu prüfen und dafür zu sorgen, dass alle Einstellungen für die Bildschirmausrichtung weiterhin für eine optimale Nutzerfreundlichkeit sorgen.
Weitere Informationen finden Sie unter Verhaltensänderungen.
Mit einem neuen Rotationsmodus können Nutzer die Rotation bei Bedarf manuell über eine Schaltfläche in der Systemleiste auslösen.
Text
Android 9 bietet die folgenden textbezogenen Funktionen:
Vorberechneter Text: Die Klasse
PrecomputedTextverbessert die Leistung beim Rendern von Text, da Sie die erforderlichen Informationen vorab berechnen und im Cache speichern können. Außerdem kann Ihre App damit das Textlayout außerhalb des Hauptthreads ausführen.Vergrößerungsglas: Die Klasse
Magnifierist ein Plattform-Widget, das eine Vergrößerungsglas-API bietet, die eine konsistente Vergrößerungsglasfunktion in allen Apps ermöglicht.Smart Linkify: In Android 9 wird die Klasse
TextClassifiererweitert. Sie nutzt maschinelles Lernen, um bestimmte Entitäten im ausgewählten Text zu erkennen und Aktionen vorzuschlagen. MitTextClassifierkann Ihre App beispielsweise erkennen, dass der Nutzer eine Telefonnummer ausgewählt hat. Ihre App könnte dann vorschlagen, dass der Nutzer mit dieser Nummer einen Anruf startet. Die Funktionen inTextClassifierersetzen die Funktionalität der KlasseLinkify.Textlayout: Mehrere praktische Methoden und Attribute erleichtern die Implementierung Ihres UI-Designs. Weitere Informationen finden Sie in der Referenzdokumentation zu
TextView.
ART-Ahead-of-Time-Konvertierung von DEX-Dateien
Auf Geräten mit Android 9 oder höher optimiert der Ahead-of-Time-Compiler (AOT) der Android-Laufzeit (ART) komprimierte DEX-Dateien (Dalvik Executable) zusätzlich, indem er die DEX-Dateien in einem App-Paket in eine kompaktere Darstellung konvertiert. Durch diese Änderung kann Ihre App schneller gestartet werden und benötigt weniger Speicherplatz und RAM.
Diese Verbesserung kommt insbesondere Low-End-Geräten mit langsameren Festplatten-E/A-Geschwindigkeiten zugute.
System-Tracing auf dem Gerät
Mit Android 9 können Sie System-Traces auf Ihrem Gerät aufzeichnen und dann einen Bericht dieser Aufzeichnungen für Ihr Entwicklungsteam freigeben. Dieser Bericht unterstützt mehrere Formate, darunter HTML.
Durch das Erfassen dieser Traces können Sie Zeitmessungsdaten zu den Prozessen und Threads Ihrer App erfassen und andere Arten von global wichtigen Gerätestatus ansehen.
Weitere Informationen zu diesem Tool