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 deine App auswirken können. Die folgenden Verhaltensänderungen gelten ausschließlich für Apps, die auf Android 17 oder höher ausgerichtet sind. Wenn deine App auf Android 17 oder höher ausgerichtet ist, solltest du sie gegebenenfalls so ändern, dass sie diese Verhaltensweisen unterstützt.

Sieh dir 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 deiner App.

Hauptfunktion

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

Neue sperrfreie Implementierung von MessageQueue

Beginning with Android 17, apps targeting Android 17 (API level 37) or higher receive a new lock-free implementation of android.os.MessageQueue. The new implementation improves performance and reduces missed frames, but may break clients that reflect on MessageQueue private fields and methods.

For more information, including mitigation strategies, see MessageQueue behavior change guidance.

Statische finale Felder können jetzt nicht mehr geändert werden

Apps running on Android 17 or higher that target Android 17 (API level 37) or higher cannot change static final fields. If an app attempts to change a static final field by using reflection, it will cause an IllegalAccessException. Attempting to modify one of these fields through JNI APIs (such as SetStaticLongField()) will cause the app to crash.

Bedienungshilfen

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

Unterstützung von Bedienungshilfen für die Eingabe über die physische Tastatur mit komplexen IME-Methoden

Mit dieser Funktion werden die neuen AccessibilityEvent und TextAttribute APIs eingeführt, um die Sprachausgabe von Screenreadern für die Eingabe in 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 beim Senden von Ereignissen zur Barrierefreiheit für geänderten Text Textänderungstypen angeben. Apps können beispielsweise angeben, dass eine Textänderung während der Texterstellung erfolgt ist oder dass eine Textänderung durch einen Commit verursacht wurde. Dadurch können Bedienungshilfen wie Screenreader genaueres Feedback geben, das auf der Art der Textänderung basiert.

App-Akzeptanz

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

  • Apps mit Bearbeitungsfeldern:Apps, die eine benutzerdefinierte InputConnection verwalten, können Kandidatenauswahldaten mit TextAttribute.isTextSuggestionSelected() abrufen. Diese Apps sollten dann AccessibilityEvent.setTextChangeTypes() aufrufen, wenn sie TYPE_VIEW_TEXT_CHANGED-Ereignisse senden. Bei Apps, die auf Android 17 (API-Level 37) ausgerichtet sind und die Standardklasse TextView verwenden, ist diese Funktion standardmäßig aktiviert. Das bedeutet, dass TextView das Abrufen von Daten aus der IME und das Festlegen von Textänderungstypen beim Senden von Ereignissen an Bedienungshilfen übernimmt.

  • 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) wird opportunistisch 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 die 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.

Bei Apps, die auf Android 17 (API‑Level 37) oder höher ausgerichtet sind, wird ECH für TLS-Verbindungen opportunistisch 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, wird automatisch ein Standard-TLS-Handshake ohne SNI-Verschlüsselung verwendet.

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> in <base-config>- oder <domain-config>-Tags verwenden, um einen ECH-Modus (z. B. "opportunistic", "enabled" oder "disabled") global oder pro Domain auszuwählen.

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

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

In Android 17 wird die ACCESS_LOCAL_NETWORK Laufzeitberechtigung eingeführt, um Nutzer vor unbefugtem Zugriff auf das lokale Netzwerk zu schützen. Da diese Berechtigung zur vorhandenen Berechtigungsgruppe NEARBY_DEVICES gehört, 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 durchzuführen. Wenn Sie diese Berechtigung deklarieren und anfordern, kann Ihre App Geräte im lokalen Netzwerk (LAN) erkennen und eine Verbindung zu ihnen herstellen, z. B. Smart-Home-Geräte oder Streaming-Empfänger.

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 datenschutzfreundliche Geräteauswahlen verwenden, die vom System vermittelt werden, um die Berechtigungsaufforderung zu überspringen, oder diese neue Berechtigung explizit zur Laufzeit anfordern, um die Kommunikation über das lokale 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.

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

If your app targets Android 17 (API level 37) or higher, the Safer Dynamic Code Loading (DCL) protection introduced in Android 14 for DEX and JAR files now extends to native libraries.

All native files loaded using System.load() must be marked as read-only. Otherwise, the system throws UnsatisfiedLinkError.

We recommend that apps avoid dynamically loading code whenever possible, as doing so greatly increases the risk that an app can be compromised by code injection or code tampering.

Felder mit personenbezogenen Daten in der CP2-Datenansicht einschränken

For apps targeting Android 17 (API level Android 17 (API level 37)) and higher, Contacts Provider 2 (CP2) restricts certain columns containing Personally Identifiable Information (PII) from the data view. When this change is enabled, these columns are removed from the data view to enhance user privacy. The restricted columns include:

Apps that are using these columns from ContactsContract.Data can extract them from ContactsContract.RawContacts instead, by joining with RAW_CONTACT_ID.

Strikte SQL-Prüfungen in CP2 erzwingen

For apps targeting Android 17 (API level Android 17 (API level 37)) and higher, Contacts Provider 2 (CP2) enforces strict SQL query validation when the ContactsContract.Data table is accessed without READ_CONTACTS permission.

With this change, if an app doesn't have READ_CONTACTS permission, StrictColumns and StrictGrammar options are set when querying the ContactsContract.Data table. If a query uses a pattern that isn't compatible with these, it will be rejected and cause an exception to be thrown.

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 APIs für Lautstärkeänderungen. 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 Vordergrunddienst ausgeführt werden. Außerdem muss die App eine oder beide der folgenden Anforderungen erfüllen:

  • Der Dienst im Vordergrund muss die Zugriffsberechtigung „Während der Nutzung“ (While-in-Use, WIU) haben.
  • Die App muss die Berechtigung exact alarm haben und mit USAGE_ALARM-Audiostreams interagieren.

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

Formfaktoren von Geräten

Android 17 enthält die folgenden Änderungen, um die Nutzerfreundlichkeit 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 (sw>=600dp) zu ignorieren

We introduced Platform API changes in Android 16 to ignore orientation, aspect ratio, and resizability restrictions on large screens (sw >= 600dp) for apps targeting API level 36 or higher. Developers have the option to opt out of these changes with SDK 36, but this opt-out will no longer be available for apps that target Android 17 (API level 37) or higher.

For more information, see Restrictions on orientation and resizability are ignored.

Konnektivität

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

Konsistentes BluetoothSocket-read()-Verhalten für RFCOMM

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

Durch diese Änderung wird das Verhalten von RFCOMM-Sockets an das von LE CoC-Sockets angeglichen und entspricht der Standard-InputStream.read() Dokumentation, 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 aus einer Leseschleife auszubrechen, sind möglicherweise von dieser Änderung betroffen. Sie sollten die Leseschleifen für BluetoothSocket 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 zum Übertragen von Bluetooth-Daten.