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-Arbeitsspeicherlimits eingeführt, die auf dem gesamten RAM des Geräts basieren. So wird eine stabilere und deterministischere Umgebung für Ihre Apps und Android-Nutzer geschaffen. Diese Limits konzentrieren sich auf Speicherlecks und andere Ausreißer, bevor sie systemweite Instabilität auslösen, die zu UI-Rucklern, höherem Akkuverbrauch und dem Beenden von Apps führt. 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 eines Basiswerts 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 Arbeitsspeicherlimit erreicht wird.

In der Dokumentation Arbeitsspeicher Ihrer App verwalten finden Sie Informationen zur Diagnose von Arbeitsspeicherproblemen Ihrer App und zur Optimierung des Ressourcen verbrauchs.

Verhalten Ihrer App unter den Arbeitsspeicherbeschränkungen testen

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

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

Weist den Arbeitsspeicherbegrenzer an, einige oder alle Prozesse zu ignorieren. Wenn Sie eine UID (Android-Nutzer-ID) übergeben, wird der Arbeitsspeicherbegrenzer angewiesen, die Erzwingung 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. Durch die Übergabe von none werden alle vorherigen Aufrufe von am memory-limiter ignore überschrieben.

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

manual

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

status

Gibt den aktuellen Status des Arbeitsspeicherbegrenzers aus. Der Status umfasst die Arbeitsspeicherlimits, die für sichtbare und nicht sichtbare Prozesse gelten.

Datenschutz

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

SMS-OTP-Schutz

Ab Android 17 wird der Schutz von SMS-Nachrichten mit Einmalpasswörtern (OTP) ausgeweitet.

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. die Standard-SMS-App) waren jedoch von der Verzögerung ausgenommen. Das galt auch für die App, die den Hash besaß.

Ab Android 17 wird der Schutz auch auf WebOTP-Nachrichten 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 Erhalt der Nachricht darauf zugreifen. Diese Änderung soll die Nutzersicherheit verbessern, indem sichergestellt wird, dass nur Apps, die mit der in der Nachricht erwähnten Domain verknüpft sind, den Bestätigungscode programmatisch lesen können.

Während dieser dreistündigen Verzögerung wird die SMS_RECEIVED_ACTION-Übertragung zurückgehalten und Datenbankabfragen des SMS-Anbieters werden gefiltert. Die SMS ist nach der Verzögerung für diese Apps verfügbar. Diese Änderung gilt für alle Apps, unabhängig von ihrem Ziel-API-Level.

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, damit sie weiterhin funktionieren.

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

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

Keystore-Limits pro App

Apps should avoid creating excessive numbers of keys in Android Keystore, because it is a shared resource for all apps on the device. Beginning with Android 17, the system enforces a limit on the number of keys an app can own. The limit is 50,000 keys for non-system apps targeting Android 17 (API level 37) or higher, and 200,000 keys for all other apps. System apps have a limit of 200,000 keys, regardless of which API level they target.

If an app attempts to create keys beyond the limit, the creation fails with a KeyStoreException. The exception's message string contains information about the key limit. If the app calls getNumericErrorCode() on the exception, the return value depends on what API level the app targets:

  • Apps targeting Android 17 (API level 37) or higher: getNumericErrorCode() returns the new ERROR_TOO_MANY_KEYS value.
  • All other apps: getNumericErrorCode() returns ERROR_INCORRECT_USAGE.

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

Mit Android 17 wird die autonome Neuverknüpfung eingeführt, eine Verbesserung auf Systemebene, die darauf ausgelegt ist, den Verlust von Bluetooth-Verknüpfungen automatisch zu beheben.

Bisher mussten Nutzer bei einem Verlust der Verknüpfung manuell die Einstellungen aufrufen, um die Verknüpfung mit dem Peripheriegerät aufzuheben und es dann neu zu verknüpfen. Diese Funktion baut auf der Sicherheitsverbesserung von Android 16 auf, indem sie es dem System ermöglicht, Verknüpfungen im Hintergrund wiederherzustellen, ohne dass Nutzer manuell die Einstellungen aufrufen müssen, um die Verknüpfung mit Peripheriegeräten aufzuheben und sie neu zu verknüpfen.

Bei den meisten Apps sind keine Codeänderungen erforderlich. Entwickler sollten jedoch die folgenden Verhaltensänderungen im Bluetooth-Stack beachten:

  • Neuer Verknüpfungskontext: Die ACTION_PAIRING_REQUEST enthält jetzt die EXTRA_PAIRING_CONTEXT zusätzliche, mit der Apps zwischen einer Standardverknüpfungsanfrage und einem autonomen, vom System initiierten Neuverknüpfungsversuch unterscheiden können.
  • Bedingte Schlüsselaktualisierungen:Vorhandene Sicherheitsschlüssel werden nur ersetzt, wenn die Neuverknüpfung erfolgreich ist und die neue Verbindung das Sicherheitsniveau der vorherigen Verknüpfung erfüllt oder übertrifft.
  • Geänderter Intent-Zeitpunkt:Der Intent ACTION_KEY_MISSING wird jetzt nur gesendet, wenn der autonome Neuverknüpfungsversuch fehlschlägt. Dadurch wird die unnötige Fehlerbehandlung in der App reduziert, wenn das System die Verknüpfung im Hintergrund erfolgreich wiederherstellt.
  • Benachrichtigung für Nutzer:Die Neuverknüpfung wird vom System über neue UI-Benachrichtigungen und Dialogfelder verwaltet. Nutzer werden aufgefordert, den Neuverknüpfungsversuch zu bestätigen, damit sie über die Wiederverbindung informiert sind.

Hersteller von Peripheriegeräten und Entwickler von Begleit-Apps sollten prüfen, ob Hardware und App Verknüpfungsübergänge ordnungsgemäß verarbeiten. Um dieses Verhalten zu testen, simulieren Sie einen Verlust der Remote-Verknüpfung mit einer der folgenden Methoden:

  • Entfernen Sie die Verknüpfungsinformationen manuell vom Peripheriegerät.
  • Heben Sie die Verknüpfung mit dem Gerät manuell auf: Einstellungen > Verbundene Geräte