Verhaltensänderungen: alle Apps

Die Android 17-Plattform enthält Verhaltensänderungen, die sich auf deine 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. Du solltest deine App testen und sie dann gegebenenfalls an diese Änderungen anpassen.

Sieh dir 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 ändern 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 Apps 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 zu systemweiter Instabilität führen, die sich in UI-Rucklern, schneller Akkuentladung und dem Beenden von Apps äußert. Wir gehen davon aus, dass die Auswirkungen auf die überwiegende Mehrheit der App-Sitzungen minimal sein werden. Wir empfehlen jedoch die folgenden Best Practices für den Arbeitsspeicher, einschließlich der Festlegung einer Baseline für den Arbeitsspeicher.

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 andere 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.

In der Dokumentation Speicher Ihrer App verwalten finden Sie Informationen , die Ihnen bei der Diagnose von Speicherproblemen Ihrer App und der Optimierung des Ressourcen verbrauchs helfen.

Verhalten Ihrer App unter den Speicherbeschränkungen testen

Mit der Android Debug Bridge (adb) können Sie die Speicherlimits auf jedem Gerät anpassen oder deaktivieren, auf dem sie festgelegt sind. Der Shell-Befehl am bietet drei Unterbefehle zum Anpassen der Speicherlimits. Diese Befehle haben keine Auswirkungen auf Geräte, auf denen keine Speicherlimits festgelegt sind.

  • am memory-limiter ignore <uid>|none|all
  • am memory-limiter manual <pid> <limit>|max|none
  • am memory-limiter status
ignore

Weist den Speicherbegrenzer an, einige oder alle Prozesse zu ignorieren. Wenn Sie eine UID (Android-Nutzer-ID) übergeben, wird der Speicherbegrenzer angewiesen, die Durchsetzung für alle Prozesse zu ignorieren, die mit dieser UID verknüpft sind. Sie können auch all (alle Apps ignorieren) oder none (keine Apps ignorieren) übergeben. Wenn Sie none übergeben, werden alle vorherigen Aufrufe von am memory-limiter ignore überschrieben.

Wenn Sie den Speicherbegrenzer anweisen, eine UID zu ignorieren, können Sie trotzdem ein manuelles Speicherlimit auf einen Prozess in der App anwenden, indem Sie am memory-limiter manual aufrufen.

manual

Weist das System an, eine Speicherbeschränkung für den Prozess mit der angegebenen PID (Prozess-ID) festzulegen. Die Speicherbeschränkung wird als Ganzzahl in MB angegeben. Wenn Sie beispielsweise 30 übergeben, ist der Prozess auf 30 MB Arbeitsspeicher beschränkt. Wenn Sie max übergeben, werden alle Speicherlimits für diesen Prozess entfernt. Wenn Sie none übergeben, werden alle manuell festgelegten Limits für den Prozess entfernt und das Standardlimit des Systems wiederhergestellt (falls vorhanden).

status

Gibt den aktuellen Status des Speicherbegrenzers aus. Der Status umfasst die Speicherlimits, die für sichtbare und nicht sichtbare Prozesse festgelegt sind.

Datenschutz

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

SMS-OTP-Schutz

Beginning with Android 17, Android is expanding its protection for SMS messages containing one-time passwords (OTP).

In previous versions of Android, this protection was primarily focused on the SMS Retriever format. Delivery of messages containing an SMS retriever hash was delayed for most apps for three hours. However, certain apps (like the default SMS handler) were exempt from the delay, and the app that owned the hash was also exempted.

Beginning with Android 17, the protection is also applied to WebOTP format messages. If an app has permission to read SMS messages but is not the intended recipient of a WebOTP message (as determined by domain verification), the message is not accessible to the app until three hours after the message's receipt. This change is intended to improve user security by ensuring that only apps associated with the domain mentioned in the message can programmatically read the verification code.

During this three hour delay, the SMS_RECEIVED_ACTION broadcast is withheld and SMS provider database queries are filtered. The SMS message is available to these apps after the delay. This change applies to all apps, regardless of their target API level.

Certain apps such as the default SMS assistant app, connected device companion apps, etc., are exempted from this delay. All apps that rely on reading SMS messages for OTP extraction should transition to using SMS Retriever or SMS User Consent APIs to ensure continued functionality.

Sicherheit

Android 17 enthält 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 usesCleartextTraffic auf true.
  • 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-Berechtigungen einschränken

Wenn eine App derzeit einen Intent mit einem URI startet, der die Aktion ACTION_SEND, ACTION_SEND_MULTIPLE oder ACTION_IMAGE_CAPTURE hat, gewährt das System der Ziel-App automatisch die Lese- und Schreib-URI-Berechtigungen. Ab Android 18 gewährt das System diese Berechtigungen nicht mehr automatisch. Aus diesem Grund empfehlen wir, dass Apps die relevanten URI-Berechtigungen explizit gewähren, anstatt sich darauf zu verlassen, dass das System sie gewährt.

Wenn Sie die Verwendung dieser Intents in Ihrer App erkennen möchten, verwenden Sie StrictMode mit detectImplicitUriPermissionGrant(), um einen Verstoß auszulösen:

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);

Alternativ können Sie nach protokollierten Ausnahmen mit der Meldung Please set the grant explicitly in the app suchen, die angezeigt wird, wenn das System die Erteilung implizit festlegt. Sie können diese Logs mit dem folgenden adb-Befehl überwachen:

adb logcat | grep "Please set the grant explicitly in the app"

Wenn Sie die erforderlichen Berechtigungen explizit gewähren möchten, fügen Sie das Flag FLAG_GRANT_READ_URI_PERMISSION den Intents ACTION_SEND und ACTION_SEND_MULTIPLE hinzu:

Kotlin

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

Java

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

Fügen Sie sowohl das Flag FLAG_GRANT_READ_URI_PERMISSION als auch das Flag FLAG_GRANT_WRITE_URI_PERMISSION für ACTION_IMAGE_CAPTURE-Intents ein:

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);

Keystore-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 neuen ERROR_TOO_MANY_KEYS-Wert zurück.
  • Alle anderen Apps: getNumericErrorCode() gibt ERROR_INCORRECT_USAGE zurü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 eine einheitlichere und intuitivere Nutzererfahrung schaffen sollen.

Standardmäßige 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:windowSoftInputMode auf stateAlwaysVisible fest.
  • Fordern Sie die Bildschirmtastatur programmatisch in der Methode onCreate() Ihrer Activity an oder fügen Sie die Methode onConfigurationChanged() hinzu.

Menschliche Eingabe

Android 17 enthält die folgenden Änderungen, die sich auf die Interaktion von Apps mit Eingabegeräten wie Tastaturen und Touchpads auswirken.

Touchpads liefern bei der Zeigererfassung standardmäßig relative Ereignisse

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 Medienverhalten.

Härtung von Audio im Hintergrund

Ab Android 17 erzwingt das Audio-Framework Einschränkungen für Audiointeraktionen im Hintergrund, einschließlich Audiowiedergabe, Audiofokus-Anfragen und APIs zur Lautstärkeänderung. So soll sichergestellt werden, dass diese Änderungen vom Nutzer beabsichtigt sind.

Wenn die App versucht, Audio-APIs aufzurufen, während sie sich nicht in einem gültigen Lebenszyklus befindet, schlagen die APIs für die Audiowiedergabe und die Lautstärkeänderung im Hintergrund fehl, ohne eine Ausnahme auszulösen oder eine Fehlermeldung zu liefern. Die Audiofokus-API schlägt mit dem Ergebniscode AUDIOFOCUS_REQUEST_FAILED fehl.

Weitere Informationen, einschließlich Strategien zur Risikominderung, finden Sie unter Background audio hardening (Härtung von Audio im Hintergrund).

Konnektivität

Android 17 enthält die folgenden Änderungen, um die Gerätekonnektivität zu verbessern.

Autonome Neuverknüpfung bei Verlust der Bluetooth-Verbindung

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_REQUEST now includes the EXTRA_PAIRING_CONTEXT extra 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_MISSING intent 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