Die Android 17-Plattform umfasst Verhaltensänderungen, die sich auf Ihre App auswirken können.
Die folgenden Verhaltensänderungen gelten für alle Apps, wenn sie unter Android 17 ausgeführt werden, unabhängig von targetSdkVersion. Sie sollten Ihre App testen und sie bei Bedarf an diese Änderungen anpassen.
Sehen Sie sich auch die Liste der Verhaltensänderungen an, die sich nur auf Apps auswirken, die auf Android 17 ausgerichtet sind.
Hauptfunktion
Android 17 (API‑Level 37) enthält die folgenden Änderungen, die verschiedene Kernfunktionen des Android-Systems modifizieren oder erweitern.
App-Arbeitsspeicherlimits
Mit Android 17 werden App-Speicherlimits eingeführt, die auf dem gesamten RAM des Geräts basieren. So soll eine stabilere und deterministischere Umgebung für Ihre Anwendungen und Android-Nutzer geschaffen werden. In Android 17 werden die Limits konservativ festgelegt, um Systembaselines zu erstellen und extreme Speicherlecks und andere Ausreißer zu erkennen, bevor sie systemweite Instabilität verursachen, die zu UI-Rucklern, schneller Akkuentladung und dem Beenden von Apps führt. Wir gehen davon aus, dass die Auswirkungen auf die meisten App-Sitzungen minimal sein werden. Wir empfehlen jedoch die folgenden Best Practices für den Speicher, einschließlich der Festlegung einer Baseline für den Speicher.
Sie können feststellen, ob Ihre App-Sitzung betroffen war, indem Sie
getDescription in ApplicationExitInfo aufrufen. Wenn Ihre App
betroffen war, ist der Grund für das Beenden REASON_OTHER und
die Beschreibung enthält den String "MemoryLimiter:AnonSwap" sowie
weitere Informationen. Sie können auch die triggerbasierte Profilerstellung mit
TRIGGER_TYPE_ANOMALY verwenden, um Heap-Dumps zu erhalten, die erfasst werden, wenn das
Speicherlimit erreicht wird.
Damit Sie Speicherlecks leichter finden können, wurde in Android Studio Panda die LeakCanary-Integration direkt in den Android Studio Profiler als spezielle Aufgabe hinzugefügt. Sie ist in die IDE eingebettet und vollständig in Ihren Quellcode integriert.
Datenschutz
Android 17 enthält die folgenden Änderungen zur Verbesserung des Datenschutzes für Nutzer.
SMS-OTP-Schutz
Ab Android 17 wird der Schutz für SMS-Nachrichten mit Einmalpasswörtern (OTPs) erweitert.
In früheren Android-Versionen konzentrierte sich dieser Schutz hauptsächlich auf das SMS Retriever-Format. Die Zustellung von Nachrichten mit einem SMS Retriever-Hash wurde für die meisten Apps um drei Stunden verzögert. Bestimmte Apps (z. B. der Standard-SMS-Handler) waren jedoch von der Verzögerung ausgenommen. Das galt auch für die App, der der Hash gehörte.
Ab Android 17 wird der Schutz auch auf Nachrichten im WebOTP-Format angewendet. Wenn eine App die Berechtigung zum Lesen von SMS-Nachrichten hat, aber nicht der beabsichtigte Empfänger einer WebOTP-Nachricht ist (wie durch die Domainbestätigung ermittelt), kann die App erst drei Stunden nach dem Empfang der Nachricht darauf zugreifen. Diese Änderung soll die Nutzersicherheit verbessern, indem sichergestellt wird, dass nur Apps, die mit der in der Nachricht genannten Domain verknüpft sind, den Bestätigungscode programmatisch lesen können.
Während dieser dreistündigen Verzögerung wird die SMS_RECEIVED_ACTION Broadcast-Nachricht zurückgehalten und SMS-Anbieter Datenbankabfragen werden gefiltert. Die SMS-Nachricht ist nach der Verzögerung für diese Apps verfügbar. Diese Änderung gilt für
alle Apps, unabhängig von ihrer Ziel-API-Ebene.
Bestimmte Apps wie die Standard-SMS-Assistenten-App und Begleit-Apps für verbundene Geräte sind von dieser Verzögerung ausgenommen. Alle Apps, die zum Extrahieren von OTPs auf das Lesen von SMS Nachrichten angewiesen sind, sollten auf die APIs SMS Retriever oder SMS User Consent umgestellt werden, um die Funktionalität beizubehalten.
Sicherheit
Android 17 bietet die folgenden Verbesserungen für die Geräte- und App-Sicherheit.
Einstellungszeitplan für usesClearTraffic
In einer zukünftigen Version planen wir, das usesCleartextTraffic-Element einzustellen.
Apps, die unverschlüsselte (HTTP-)Verbindungen herstellen müssen, sollten auf die Verwendung einer Netzwerksicherheitskonfigurationsdatei umgestellt werden. Damit können Sie angeben, zu welchen Domains Ihre App Klartextverbindungen herstellen muss.
Beachten Sie, dass Dateien zur Netzwerksicherheitskonfiguration nur auf API-Ebenen 24 und höher unterstützt werden. Wenn das Mindest-API-Level Ihrer App niedriger als 24 ist, sollten Sie beides tun:
- Setzen Sie das Attribut
usesCleartextTrafficauftrue. - Netzwerkkonfigurationsdatei verwenden
Wenn das Mindest-API-Level Ihrer App 24 oder höher ist, können Sie eine Netzwerkkonfigurationsdatei verwenden und müssen usesCleartextTraffic nicht festlegen.
Implizite URI-Gewährungen einschränken
Currently, if an app launches an intent with a URI that has the action
ACTION_SEND, ACTION_SEND_MULTIPLE, or
ACTION_IMAGE_CAPTURE, the system automatically grants the read and
write URI permissions to the target app. Starting in Android 18, the system will
no longer automatically grant these permissions. For this reason, we recommend
that apps explicitly grant the
relevant URI permissions instead of relying on the system to grant them.
To detect the usage of these intents in your app, use StrictMode with
detectImplicitUriPermissionGrant() to trigger a violation:
Kotlin
val policy = StrictMode.VmPolicy.Builder() .detectImplicitUriPermissionGrant() .penaltyLog() .build() StrictMode.setVmPolicy(policy)
Java
StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder() .detectImplicitUriPermissionGrant() .penaltyLog() .build(); StrictMode.setVmPolicy(policy);
Alternatively, you can monitor for logged exceptions containing the message
Please set the grant explicitly in the app that appears when system implicitly
sets the grant. You can monitor for these logs
using the following adb command:
adb logcat | grep "Please set the grant explicitly in the app"
To explicitly grant the necessary permissions, add the
FLAG_GRANT_READ_URI_PERMISSION flag to ACTION_SEND and
ACTION_SEND_MULTIPLE intents:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Include both FLAG_GRANT_READ_URI_PERMISSION and
FLAG_GRANT_WRITE_URI_PERMISSION flags for
ACTION_IMAGE_CAPTURE intents:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Schlüsselspeicher-Limits pro App
Apps sollten nicht zu viele Schlüssel im Android-Keystore erstellen, da es sich um eine gemeinsam genutzte Ressource für alle Apps auf dem Gerät handelt. Ab Android 17 erzwingt das System ein Limit für die Anzahl der Schlüssel, die einer App gehören können. Das Limit liegt bei 50.000 Schlüsseln für Nicht-System-Apps, die auf Android 17 (API-Level 37) oder höher ausgerichtet sind, und bei 200.000 Schlüsseln für alle anderen Apps. System-Apps haben ein Limit von 200.000 Schlüsseln,unabhängig davon, auf welche API-Ebene sie ausgerichtet sind.
Wenn eine App versucht, über das Limit hinaus Schlüssel zu erstellen, schlägt die Erstellung mit dem Fehler KeyStoreException fehl. Der Meldungsstring der Ausnahme enthält Informationen zum Schlüssellimit. Wenn die App getNumericErrorCode() für die Ausnahme aufruft, hängt der Rückgabewert davon ab, auf welches API-Level die App ausgerichtet ist:
- Apps, die auf Android 17 (API‑Level 37) oder höher ausgerichtet sind:
getNumericErrorCode()gibt den neuenERROR_TOO_MANY_KEYS-Wert zurück. - Alle anderen Apps:
getNumericErrorCode()gibtERROR_INCORRECT_USAGEzurück.
Profilübergreifenden Loopback-Traffic blockieren
Ab Android 17 ist Loopback-Traffic zwischen Profilen standardmäßig nicht mehr zulässig. Loopback-Traffic innerhalb desselben Profils ist davon nicht betroffen. Diese Änderung gilt für alle Apps, die unter Android 17 oder höher ausgeführt werden, unabhängig davon, auf welches API-Level die App ausgerichtet ist.
Nutzererfahrung und System-UI
Android 17 enthält die folgenden Änderungen, die für eine einheitlichere, intuitive Nutzererfahrung sorgen sollen.
Standard-IME-Sichtbarkeit nach Drehung wiederherstellen
Ab Android 17 wird die vorherige Sichtbarkeit der IME nicht wiederhergestellt, wenn sich die Konfiguration des Geräts ändert (z. B. durch Drehen) und dies nicht von der App selbst verarbeitet wird.
Wenn sich die Konfiguration Ihrer App ändert und die App diese Änderung nicht verarbeitet und das Keyboard nach der Änderung sichtbar sein muss, müssen Sie dies explizit anfordern. Sie können diese Anfrage auf eine der folgenden Arten stellen:
- Legen Sie das Attribut
android:windowSoftInputModeaufstateAlwaysVisiblefest. - Fordern Sie die Bildschirmtastatur programmatisch in der Methode
onCreate()Ihrer Activity an oder fügen Sie die MethodeonConfigurationChanged()hinzu.
Menschliche Eingabe
Android 17 enthält die folgenden Änderungen, die sich darauf auswirken, wie Apps mit Eingabegeräten wie Tastaturen und Touchpads interagieren.
Touchpads liefern standardmäßig relative Ereignisse während der Zeigererfassung
Beginning with Android 17, if an app requests pointer capture using
View.requestPointerCapture() and the user uses a touchpad, the system
recognizes pointer movement and scrolling gestures from the user's touches and
reports them to the app in the same way as pointer and scroll wheel movements
from a captured mouse. In most cases, this removes the need for apps that
support captured mice to add special handling logic for touchpads. For more
details, see the documentation for View.POINTER_CAPTURE_MODE_RELATIVE.
Previously, the system did not attempt to recognize gestures from the touchpad,
and instead delivered the raw, absolute finger locations to the app in a similar
format to touchscreen touches. If an app still requires this absolute data, it
should call the new View.requestPointerCapture(int) method with
View.POINTER_CAPTURE_MODE_ABSOLUTE instead.
Medien
Android 17 enthält die folgenden Änderungen am Media-Verhalten.
Härtung von Audio im Hintergrund
Beginning with Android 17, the audio framework enforces restrictions on background audio interactions including audio playback, audio focus requests, and volume change APIs to ensure that these changes are started intentionally by the user.
If the app tries to call audio APIs while the app is not in a valid lifecycle,
the audio playback and volume change APIs fail silently without throwing an
exception or providing a failure message. The audio focus API fails with the
result code AUDIOFOCUS_REQUEST_FAILED.
For more information, including mitigation strategies, see Background audio hardening.
Konnektivität
Android 17 enthält die folgenden Änderungen zur Verbesserung der Gerätekonnektivität.
Autonome Neukopplung bei Verlust der Bluetooth-Bindung
Android 17 introduces autonomous re-pairing, a system-level enhancement designed to automatically resolve Bluetooth bond loss.
Previously, if a bond was lost, users had to manually navigate to Settings to unpair and then re-pair the peripheral. This feature builds upon the security improvement of Android 16 by allowing the system to re-establish bonds in the background without requiring users to manually navigate to Settings to unpair and re-pair peripherals.
While most apps will not require code changes, developers should be aware of the following behavior changes in Bluetooth stack:
- New pairing context: The
ACTION_PAIRING_REQUESTnow includes theEXTRA_PAIRING_CONTEXTextra which allows apps to distinguish between a standard pairing request and an autonomous system-initiated re-pairing attempt. - Conditional key updates: Existing security keys will only be replaced if the re-pairing is successful and new connection meets or exceeds the security level of the previous bond.
- Modified intent timing: The
ACTION_KEY_MISSINGintent is now broadcast only if the autonomous re-pairing attempt fails. This reduces unnecessary error handling in the app if the system successfully recovers the bond in the background. - User notification: The system manages re-pairing via new UI notifications and dialogs. Users will be prompted to confirm the re-pairing attempt to ensure they are aware of the reconnection.
Peripheral device manufacturers and companion app developers should verify that hardware and app gracefully handle bond transitions. To test this behavior, simulate a remote bond loss using either of the following methods:
- Manually remove the bond information from the peripheral device
- Manually unpair the device in: Settings > Connected devices