Verhaltensänderungen: Apps, die auf Android 17 oder höher ausgerichtet sind

Wie bei früheren Versionen enthält Android 17 Verhaltensänderungen, die sich auf Ihre App auswirken können. Die folgenden Verhaltensänderungen gelten ausschließlich für Apps, die auf Android 17 oder höher ausgerichtet sind. Wenn Ihre App auf Android 17 oder höher ausgerichtet ist, sollten Sie sie gegebenenfalls so ändern, dass sie diese Verhaltensweisen unterstützt.

Sehen Sie sich auch die Liste der Verhaltensänderungen an, die sich auf alle Apps auswirken die unter Android 17 ausgeführt werden, unabhängig von der targetSdkVersion Ihrer App.

Nutzererfahrung und System-UI

Android 17 enthält die folgenden Änderungen, die eine einheitlichere und intuitivere Nutzererfahrung ermöglichen sollen.

Widget für Arbeitsspeicherlimit

Ab Android 17 erzwingt das System für Apps, die auf Android 17 (API‑Level 37) oder höher ausgerichtet sind, ein strenges Speicherlimit (1,5 × Bildschirmbreite × Bildschirmhöhe × 4) für die kombinierte Speichernutzung von Bitmaps und Symbolen im RemoteViews-Paket. Das Überschreiten dieser Beschränkungen führt zu einem schwerwiegenden IllegalArgumentException-Fehler und zum Absturz des App-Prozesses.

Weitere Informationen finden Sie unter UpdateAppWidget.

Hauptfunktion

Android 17 enthält die folgenden Änderungen, die verschiedene Kernfunktionen des Android-Systems ändern oder erweitern.

Neue sperrfreie Implementierung von MessageQueue

Ab Android 17 erhalten Apps, die auf Android 17 (API-Level 37) oder höher ausgerichtet sind, eine neue sperrenfreie Implementierung von android.os.MessageQueue. Die neue Implementierung verbessert die Leistung und reduziert fehlende Frames, kann aber Clients beeinträchtigen, die private Felder und Methoden von MessageQueue verwenden.

Weitere Informationen, einschließlich Strategien zur Risikominderung, finden Sie unter Leitfaden zur Verhaltensänderung von MessageQueue.

Statische finale Felder sind jetzt nicht mehr änderbar

Apps, die unter Android 17 oder höher ausgeführt werden und auf Android 17 (API‑Level 37) oder höher ausgerichtet sind, können static final-Felder nicht ändern. Wenn eine App versucht, ein static final-Feld mithilfe von Reflection zu ändern, führt dies zu einem IllegalAccessException. Wenn Sie versuchen, eines dieser Felder über JNI-APIs (z. B. SetStaticLongField()) zu ändern, stürzt die App ab.

Bedienungshilfen

In Android 17 wurden die folgenden Änderungen vorgenommen, um die Bedienungshilfen zu verbessern.

Unterstützung von Bedienungshilfen für die Eingabe über komplexe IME-Tastaturen

Mit dieser Funktion werden neue AccessibilityEvent- und TextAttribute-APIs eingeführt, um das gesprochene Feedback von Screenreadern für die Eingabe von CJKV-Sprachen zu verbessern. CJKV-IME-Apps können jetzt signalisieren, ob während der Texterstellung ein Kandidat für die Textkonvertierung ausgewählt wurde. Apps mit Bearbeitungsfeldern können Textänderungstypen angeben, wenn sie Barrierefreiheitsereignisse für geänderten Text senden. Apps können beispielsweise angeben, dass während der Texterstellung eine Textänderung vorgenommen wurde oder dass eine Textänderung durch einen Commit erfolgt ist. So können Bedienungshilfen wie Screenreader genaueres Feedback geben, das auf der Art der Textänderung basiert.

App-Akzeptanz

  • IME-Apps:Beim Verfassen von Text in Bearbeitungsfeldern können IMEs mit TextAttribute.Builder.setTextSuggestionSelected() angeben, ob ein bestimmter Konvertierungskandidat ausgewählt wurde.

  • Apps mit „Felder bearbeiten“:Apps, die eine benutzerdefinierte InputConnection verwalten, können Kandidatenauswahldaten abrufen, indem sie TextAttribute.isTextSuggestionSelected() aufrufen. Diese Apps sollten dann AccessibilityEvent.setTextChangeTypes() aufrufen, wenn TYPE_VIEW_TEXT_CHANGED-Ereignisse gesendet werden. Bei Apps, die auf Android 17 (API-Level 37) ausgerichtet sind und die Standard-TextView verwenden, ist diese Funktion standardmäßig aktiviert. TextView ist also für das Abrufen von Daten aus der IME und das Festlegen von Textänderungstypen beim Senden von Ereignissen an Barrierefreiheitsdienste zuständig.

  • Bedienungshilfen:Bedienungshilfen, die TYPE_VIEW_TEXT_CHANGED-Ereignisse verarbeiten, können AccessibilityEvent.getTextChangeTypes() aufrufen, um die Art der Änderung zu ermitteln und ihre Feedbackstrategien entsprechend anzupassen.

Datenschutz

Android 17 enthält die folgenden Änderungen, um den Datenschutz für Nutzer zu verbessern.

ECH (Encrypted Client Hello) aktiviert

In Android 17 wird die Plattformunterstützung für Encrypted Client Hello (ECH) eingeführt, eine TLS-Erweiterung, die den Datenschutz der Nutzer verbessert, indem der Server Name Indication (SNI) im TLS-Handshake verschlüsselt wird. Diese Verschlüsselung erschwert es, die spezifische Domain zu identifizieren, mit der Ihre App eine Verbindung herstellt.

Für Apps, die auf Android 17 (API-Level 37) oder höher ausgerichtet sind, wird ECH für TLS-Verbindungen verwendet. ECH ist nur aktiv, wenn die von der App verwendete Netzwerkbibliothek (z. B. HttpEngine, WebView oder OkHttp) ECH unterstützt und der Remote-Server das ECH-Protokoll ebenfalls unterstützt. Wenn ECH nicht ausgehandelt werden kann, sendet der Client eine ECH-Erweiterung mit zufälligen Inhalten (ein Mechanismus namens ECH GREASE). Weitere Informationen zur Funktionsweise von ECH GREASE finden Sie in RFC 9849.

Damit Apps dieses Verhalten anpassen können, wird in Android 17 ein neues <domainEncryption>-Element in der Datei „Network Security Configuration“ hinzugefügt. Entwickler können <domainEncryption> innerhalb von <base-config>- oder <domain-config>-Tags verwenden, um einen ECH-Modus (z. B. "enabled" oder "disabled") global oder pro Domain auszuwählen.

Weitere Informationen finden Sie in der Dokumentation zu Encrypted Client Hello.

Berechtigung für lokales Netzwerk für Apps, die auf Android 17 ausgerichtet sind, erforderlich

In Android 17 wird die Laufzeitberechtigung ACCESS_LOCAL_NETWORK eingeführt, um Nutzer vor unautorisiertem Zugriff auf das lokale Netzwerk zu schützen. Da dies unter die vorhandene Berechtigungsgruppe NEARBY_DEVICES fällt, werden Nutzer, die bereits andere NEARBY_DEVICES-Berechtigungen erteilt haben, nicht noch einmal aufgefordert. Diese neue Anforderung verhindert, dass schädliche Apps uneingeschränkten Zugriff auf das lokale Netzwerk nutzen, um Nutzer-Tracking und Fingerprinting heimlich zu verfolgen und zu erstellen. Wenn Sie diese Berechtigung deklarieren und anfordern, kann Ihre App Geräte im lokalen Netzwerk (LAN) wie Smart-Home-Geräte oder Casting-Empfänger erkennen und eine Verbindung zu ihnen herstellen.

Apps, die auf Android 17 (API‑Level 37) oder höher ausgerichtet sind, haben jetzt zwei Möglichkeiten, die Kommunikation mit LAN-Geräten aufrechtzuerhalten: Sie können systemvermittelte, datenschutzfreundliche Geräteauswahlen verwenden, um die Berechtigungsaufforderung zu umgehen, oder diese neue Berechtigung explizit zur Laufzeit anfordern, um die Kommunikation im lokalen Netzwerk aufrechtzuerhalten.

Weitere Informationen finden Sie in der Dokumentation zur Berechtigung für das lokale Netzwerk.

Passwörter auf physischen Geräten ausblenden

Wenn eine App auf Android 17 (API‑Level 37) oder höher ausgerichtet ist und der Nutzer ein physisches Eingabegerät (z. B. eine externe Tastatur) verwendet, wendet das Android-Betriebssystem die neue show_passwords_physical-Einstellung auf alle Zeichen im Passwortfeld an. Standardmäßig werden alle Passwortzeichen ausgeblendet.

Das Android-System zeigt das zuletzt eingegebene Passwortzeichen an, damit der Nutzer sehen kann, ob er das Passwort falsch eingegeben hat. Bei größeren externen Tastaturen ist dies jedoch viel weniger notwendig. Außerdem haben Geräte mit externen Tastaturen oft größere Displays, was die Gefahr erhöht, dass jemand das eingegebene Passwort sieht.

Wenn der Nutzer den Touchscreen des Geräts verwendet, wendet das System die neue Einstellung show_passwords_touch an.

OTP-Schutz für Standard-SMS-Nachrichten

Ab Android 17 wird der SMS-OTP-Schutz von Android auf Standard-SMS-Nachrichten ausgeweitet (SMS-Nachrichten, die ein OTP enthalten und nicht das WebOTP- oder SMS Retriever-Format verwenden). Bei den meisten Apps, die auf Android 17 (API‑Level 37) oder höher ausgerichtet sind, sind diese SMS erst drei Stunden nach Erhalt verfügbar. Diese Verzögerung soll dazu beitragen, das Abfangen von Einmalpasswörtern zu verhindern. Während dieser dreistündigen Verzögerung wird die SMS_RECEIVED_ACTION-Übertragung zurückgehalten und die Datenbankabfragen des SMS-Anbieters werden gefiltert. Die SMS ist nach der Verzögerung für diese Apps verfügbar.

Bestimmte Apps wie die standardmäßige SMS-Assistenten-App oder Companion-Apps für verbundene Geräte sind von dieser Verzögerung ausgenommen. Alle Apps, die zum Extrahieren von Einmalpasswörtern auf das Lesen von SMS angewiesen sind, sollten auf die APIs SMS Retriever oder SMS User Consent umgestellt werden, um die Funktionalität aufrechtzuerhalten.

Sicherheit

In Android 17 wurden die folgenden Verbesserungen an der Geräte- und App-Sicherheit vorgenommen.

Aktivitätssicherheit

In Android 17 wird die Plattform weiterhin in Richtung einer „Secure-by-Default“-Architektur verschoben. Es werden eine Reihe von Verbesserungen eingeführt, die darauf ausgelegt sind, Exploits mit hohem Schweregrad wie Phishing, Interaction Hijacking und Confused Deputy-Angriffe zu minimieren. Mit diesem Update müssen Entwickler neue Sicherheitsstandards explizit aktivieren, um die App-Kompatibilität und den Nutzerschutz aufrechtzuerhalten.

Wichtige Auswirkungen für Entwickler:

  • BAL-Härtung und verbesserte Einwilligung: Wir optimieren die Einschränkungen für den Start von Hintergrundaktivitäten (Background Activity Launch, BAL), indem wir den Schutz auf IntentSender ausweiten. Entwickler müssen die alte MODE_BACKGROUND_ACTIVITY_START_ALLOWED-Konstante migrieren. Stattdessen sollten Sie detaillierte Steuerelemente wie MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE verwenden, die den Start von Aktivitäten auf Szenarien beschränken, in denen die aufrufende App sichtbar ist. Dadurch wird die Angriffsfläche erheblich verringert.
  • Tools zur Einführung:Entwickler sollten den Strict-Modus und aktualisierte Lint-Prüfungen verwenden, um Legacy-Muster zu identifizieren und die Einhaltung zukünftiger Anforderungen an das Ziel-SDK sicherzustellen.

CT standardmäßig aktivieren

Wenn eine App auf Android 17 (API-Level 37) oder höher ausgerichtet ist, die Zertifikattransparenz (Certificate Transparency, CT) ist standardmäßig aktiviert. Unter Android 16 ist CT verfügbar, aber Apps mussten sich dafür anmelden.

Sicherere native DCL—C

Wenn Ihre App auf Android 17 (API-Level 37) oder höher ausgerichtet ist, gilt der in Android 14 eingeführte Schutz für sichereres dynamisches Laden von Code (Dynamic Code Loading, DCL) für DEX- und JAR-Dateien jetzt auch für native Bibliotheken.

Alle nativen Dateien, die mit System.load() geladen werden, müssen als schreibgeschützt markiert werden. Andernfalls wird UnsatisfiedLinkError ausgegeben.

Wir empfehlen, dass Apps nach Möglichkeit keinen Code dynamisch laden, da dies das Risiko, dass eine App durch Code-Injection oder Manipulation von Code kompromittiert wird, erheblich erhöht.

Einschränken von PII-Feldern in der CP2-Datenansicht

Bei Apps, die auf Android 17 (API-Level 37) und höher ausgerichtet sind, werden in Contacts Provider 2 (CP2) bestimmte Spalten mit personenidentifizierbaren Informationen aus der Datenansicht entfernt. Wenn diese Änderung aktiviert ist, werden diese Spalten aus der Datenansicht entfernt, um den Datenschutz der Nutzer zu verbessern. Die eingeschränkten Spalten sind:

Apps, die diese Spalten aus ContactsContract.Data verwenden, können sie stattdessen aus ContactsContract.RawContacts extrahieren, indem sie mit RAW_CONTACT_ID verknüpft werden.

Strikte SQL-Prüfungen in CP2 erzwingen

Bei Apps, die auf Android 17 (API-Level 37) und höher ausgerichtet sind, erzwingt Contacts Provider 2 (CP2) eine strenge SQL-Abfragevalidierung, wenn ohne die Berechtigung READ_CONTACTS auf die Tabelle ContactsContract.Data zugegriffen wird.

Wenn eine App nicht die Berechtigung READ_CONTACTS hat, werden mit dieser Änderung beim Abfragen der Tabelle ContactsContract.Data die Optionen StrictColumns und StrictGrammar festgelegt. Wenn eine Abfrage ein Muster verwendet, das nicht mit diesen kompatibel ist, wird sie abgelehnt und es wird eine Ausnahme ausgelöst.

Intelligenz

Android 17 enthält die folgenden Änderungen an der Systemintelligenz.

Einstellung von setContentCaptureEnabled

Die Funktion „Inhalte erfassen“ ist auf bestimmten Geräten standardmäßig aktiviert, damit On-Device-KI-Funktionen Bildschirminhalte für intelligente Funktionen analysieren können.

Ab Android 17 ist die API-Methode ContentCaptureManager.setContentCaptureEnabled(boolean) veraltet. Bei Apps, die auf Android 17 (API‑Level 37) oder höher ausgerichtet sind, wird die Inhaltserfassung durch den Aufruf von setContentCaptureEnabled(false) nicht mehr deaktiviert.

Wenn Ihre App weiterhin die Aufnahme von Inhalten deaktivieren oder verhindern muss, dass Bildschirm-Inhalte vom System aufgenommen werden, müssen Sie zum Fensterlayout-Parameter FLAG_SECURE wechseln.

Wenn Sie die Inhaltserfassung deaktivieren möchten, legen Sie das Flag FLAG_SECURE für Ihr Fenster fest, wie im folgenden Beispiel gezeigt:

Kotlin

window.setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
)

Java

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
);

Weitere Informationen finden Sie in der Referenzdokumentation zu WindowManager.LayoutParams.FLAG_SECURE.

Medien

Android 17 enthält die folgenden Änderungen am Medienverhalten.

Härtung von Audio im Hintergrund

Ab Android 17 werden im Audio-Framework Einschränkungen für Audiointeraktionen im Hintergrund erzwungen, darunter Audiowiedergabe, Audiofokus-Anfragen und Lautstärkeänderungs-APIs. So soll sichergestellt werden, dass diese Änderungen vom Nutzer initiiert werden.

Für alle Apps gelten bestimmte Audioeinschränkungen. Die Einschränkungen sind jedoch strenger, wenn eine App auf Android 17 (API‑Level 37) ausgerichtet ist. Wenn eine dieser Apps im Hintergrund mit Audio interagiert, muss ein Dienst im Vordergrund ausgeführt werden. Außerdem muss die App eine oder beide der folgenden Anforderungen erfüllen:

  • Der Dienst im Vordergrund muss die Berechtigung „Während der Nutzung“ haben.
  • Die App muss die Berechtigung exact alarm haben und mit USAGE_ALARM-Audiostreams interagieren.

Weitere Informationen, einschließlich Strategien zur Risikominderung, finden Sie unter Härten von Hintergrundaudio.

Formfaktoren von Geräten

Android 17 enthält die folgenden Änderungen, um die Nutzererfahrung auf einer Reihe von Geräten mit unterschiedlichen Größen und Formfaktoren zu verbessern.

Änderungen an der Plattform-API, um Einschränkungen für Ausrichtung, Größenänderung und Seitenverhältnis auf großen Displays zu ignorieren (sw>=600dp)

In Android 16 haben wir Änderungen an der Plattform-API eingeführt, um Einschränkungen für Ausrichtung, Seitenverhältnis und Größenänderung auf großen Bildschirmen (sw >= 600 dp) zu ignorieren für Apps, die auf API-Level 36 oder höher ausgerichtet sind. Entwickler haben die Möglichkeit, diese Änderungen mit SDK 36 zu deaktivieren. Diese Deaktivierung ist jedoch nicht mehr für Apps verfügbar, die auf Android 17 (API-Level 37) oder höher ausgerichtet sind.

Weitere Informationen finden Sie unter Einschränkungen für Ausrichtung und Größenänderung werden ignoriert.

Konnektivität

In Android 17 wurde die folgende Änderung eingeführt, um die Konsistenz zu verbessern und das Verhalten von Bluetooth-RFCOMM-Sockets an das Standardverhalten von InputStream in Java anzugleichen.

Einheitliches BluetoothSocket-Leseverhalten für RFCOMM

Bei Apps, die auf Android 17 (API-Level 37) ausgerichtet sind, gibt die Methode read() des InputStream, der von einem RFCOMM-basierten BluetoothSocket stammt, jetzt -1 zurück, wenn der Socket geschlossen oder die Verbindung getrennt wird.

Diese Änderung sorgt dafür, dass sich RFCOMM-Sockets genauso verhalten wie LE CoC-Sockets. Außerdem wird die Standarddokumentation InputStream.read() eingehalten, in der angegeben ist, dass -1 zurückgegeben wird, wenn das Ende des Streams erreicht ist.

Apps, die sich ausschließlich darauf verlassen, eine IOException abzufangen, um eine Leseschleife zu beenden, sind möglicherweise von dieser Änderung betroffen. Sie sollten die BluetoothSocket-Leseschleifen aktualisieren, um explizit nach einem Rückgabewert von -1 zu suchen. So wird sichergestellt, dass die Schleife korrekt beendet wird, wenn die Verbindung zum Remote-Gerät getrennt oder der Socket geschlossen wird. Ein Beispiel für die empfohlene Implementierung finden Sie im Code-Snippet im Leitfaden Bluetooth-Daten übertragen.