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
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 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 komplexe IME-Tastaturen
This feature introduces new AccessibilityEvent and TextAttribute
APIs to enhance screen reader spoken feedback for CJKV language input. CJKV IME
apps can now signal whether a text conversion candidate has been selected during
text composition. Apps with edit fields can specify text change types when
sending text changed accessibility events.
For example, apps can specify that a text change occurred during text
composition, or that a text change resulted from a commit.
Doing this enables accessibility
services such as screen readers to deliver more precise feedback based on the
nature of the text modification.
App adoption
IME Apps: When setting composing text in edit fields, IMEs can use
TextAttribute.Builder.setTextSuggestionSelected()to indicate whether a specific conversion candidate was selected.Apps with Edit Fields: Apps that maintain a custom
InputConnectioncan retrieve candidate selection data by callingTextAttribute.isTextSuggestionSelected(). These apps should then callAccessibilityEvent.setTextChangeTypes()when dispatchingTYPE_VIEW_TEXT_CHANGEDevents. Apps targeting Android 17 (API level 37) that use the standardTextViewwill have this feature enabled by default. (That is,TextViewwill handle retrieving data from the IME and setting text change types when sending events to accessibility services).Accessibility Services: Accessibility services that process
TYPE_VIEW_TEXT_CHANGEDevents can callAccessibilityEvent.getTextChangeTypes()to identify the nature of the modification and adjust their feedback strategies accordingly.
Datenschutz
Android 17 enthält die folgenden Änderungen, um den Datenschutz für Nutzer zu verbessern.
ECH (Encrypted Client Hello) aktiviert
Android 17 introduces platform support for Encrypted Client Hello (ECH), a TLS extension that enhances user privacy by encrypting the Server Name Indication (SNI) in the TLS handshake. This encryption helps prevent network observers from easily identifying the specific domain your app is connecting to.
For apps targeting Android 17 (API level 37) or higher, ECH is used for TLS connections. ECH is active only if the networking library used by the app (for example, HttpEngine, WebView, or OkHttp) has integrated ECH support and the remote server also supports the ECH protocol. If ECH cannot be negotiated, the client sends an ECH extension with randomized contents (a mechanism called ECH GREASE). See RFC 9849 for more details on how ECH GREASE works.
To allow apps to customize this behavior, Android 17 adds a new
<domainEncryption> element to the Network Security Configuration file.
Developers can use <domainEncryption> within <base-config> or
<domain-config> tags to select an ECH mode (for example,
"enabled" or "disabled") on a global or per-domain basis.
For more information, see the Encrypted Client Hello documentation.
Berechtigung für lokales Netzwerk für Apps, die auf Android 17 ausgerichtet sind, erforderlich
Android 17 introduces the ACCESS_LOCAL_NETWORK runtime permission
to protect users from unauthorized local network access. Because this falls
under the existing NEARBY_DEVICES permission group, users who have already
granted other NEARBY_DEVICES permissions aren't prompted again. This new
requirement prevents malicious apps from exploiting unrestricted local network
access for covert user tracking and fingerprinting. By declaring and requesting
this permission, your app can discover and connect to devices on the local area
network (LAN), such as smart home devices or casting receivers.
Apps targeting Android 17 (API level 37) or higher now have two paths to maintain communication with LAN devices: Adopt system-mediated, privacy-preserving device pickers to skip the permission prompt, or explicitly request this new permission at runtime to maintain local network communication.
For more information, see the Local network permission documentation.
Passwörter auf physischen Geräten ausblenden
If an app targets Android 17 (API level 37) or higher and the user is using
a physical input device (for example, an external keyboard), the Android
operating system applies the new show_passwords_physical setting to all
characters in the password field. By default, that setting hides all password
characters.
The Android system shows the last-typed password character to help the user see if they mistyped the password. However, this is much less necessary with larger external keyboards. In addition, devices with external keyboards often have larger displays, which increases the danger of someone seeing the typed password.
If the user is using the device's touchscreen, the system applies the new
show_passwords_touch setting.
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
IntentSenderausweiten. Entwickler müssen die alteMODE_BACKGROUND_ACTIVITY_START_ALLOWED-Konstante migrieren. Stattdessen sollten Sie detaillierte Steuerelemente wieMODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLEverwenden, 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
如果您的应用以 Android 17(API 级别 37)或更高版本为目标平台,则 Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护功能现在也适用于原生库。
使用 System.load() 加载的所有原生文件都必须标记为只读。否则,系统会抛出 UnsatisfiedLinkError。
我们建议应用尽可能避免动态加载代码,因为这样做会大大增加应用因代码注入或代码篡改而遭到入侵的风险。
Felder mit personenbezogenen Daten in der CP2-Datenansicht einschränken
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 der Kontakteanbieter 2 (Contacts Provider 2, CP2) eine strenge SQL-Abfragevalidierung, wenn
auf die Tabelle ContactsContract.Data ohne die Berechtigung
READ_CONTACTS zugegriffen wird.
Wenn eine App nicht die READ_CONTACTS
Berechtigung hat, werden mit dieser Änderung die StrictColumns und
StrictGrammar Optionen festgelegt, wenn
die ContactsContract.Data Tabelle abgefragt wird. Wenn eine Abfrage ein Muster verwendet, das mit diesen Optionen nicht kompatibel ist, wird sie abgelehnt und es wird eine Ausnahme ausgelöst.
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
我们在 Android 16 中引入了平台 API 变更,以 忽略屏幕方向、 宽高比和尺寸调整能力限制(针对大型屏幕,sw >= 600dp),适用于面向 API 级别 36 或更高级别的应用。开发者可以选择使用 SDK 36 退出这些变更,但对于面向 Android 17(API 级别 37)或更高级别的应用,此退出选项将不再可用。
如需了解详情,请参阅忽略屏幕方向和尺寸调整能力限制。
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.
Konsistentes Verhalten von BluetoothSocket read() 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.