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-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 Grenzwerte konzentrieren sich auf Speicherlecks und andere Ausreißer, bevor sie systemweite Instabilität auslösen, die zu Ruckeln der Benutzeroberfläche, 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 zu befolgen, 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 Beendigungsanlass REASON_OTHER und die Beschreibung enthält den String "MemoryLimiter:AnonSwap" sowie andere Informationen. Sie können auch triggerbasiertes Profiling mit TRIGGER_TYPE_ANOMALY verwenden, um Heap-Dumps zu erhalten, die erfasst werden, wenn das Speicherlimit erreicht wird.
In der Dokumentation Verwaltung des App-Speichers finden Sie Informationen, die Ihnen helfen, Speicherprobleme Ihrer App zu diagnostizieren und den Ressourcenverbrauch zu optimieren.
Verhalten der App bei Arbeitsspeicherbeschränkungen testen
Sie können die Speicherlimits auf jedem Gerät, auf dem sie gelten, mit Android Debug Bridge (adb) anpassen oder deaktivieren. Der Shell-Befehl am bietet drei Unterbefehle zum Anpassen der Arbeitsspeicherlimits. Diese Befehle haben keine Auswirkungen auf Geräte ohne Speicherplatzbeschränkungen.
am memory-limiter ignore <uid>|none|allam memory-limiter manual <pid> <limit>|max|noneam memory-limiter status
ignoreWeist den Arbeitsspeicherbegrenzer an, einige oder alle Prozesse zu ignorieren. Wenn Sie eine UID (Android-Nutzer-ID) übergeben, wird der Speicherbegrenzer angewiesen, die Erzwingung für alle Prozesse zu ignorieren, die mit dieser UID verknüpft sind. Sie können auch
all(alle Apps ignorieren) odernone(keine Apps ignorieren) übergeben. Wenn Sienoneübergeben, werden alle vorherigen Aufrufe vonam memory-limiter ignoreüberschrieben.Wenn Sie den Speicherbegrenzer anweisen, eine UID zu ignorieren, können Sie weiterhin ein manuelles Speicherlimit für einen Prozess in der App festlegen, indem Sie
am memory-limiter manualaufrufen.manualWeist das System an, dem Prozess mit der angegebenen PID (Prozess-ID) eine Speicherbeschränkung aufzuerlegen. Die Arbeitsspeicherbeschränkung wird als Ganzzahl in MB angegeben. Wenn Sie beispielsweise
30übergeben, ist der Prozess auf 30 MB Arbeitsspeicher beschränkt. Wenn Siemaxübergeben, werden alle Arbeitsspeicherlimits für diesen Prozess entfernt. Wenn Sienoneübergeben, werden alle manuellen Limits für den Prozess entfernt und das Standardlimit des Systems (falls vorhanden) wird wiederhergestellt.statusGibt den aktuellen Status des Arbeitsspeicherlimits an. Der Status umfasst die Speicherlimits für sichtbare und nicht sichtbare Prozesse.
Datenschutz
Android 17 enthält die folgenden Änderungen zur Verbesserung des Datenschutzes für Nutzer.
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 bietet die folgenden Verbesserungen für die Sicherheit von Geräten und Apps.
Einstellungszeitplan für usesClearTraffic
In a future release, we plan to deprecate the usesCleartextTraffic element.
Apps that need to make unencrypted (HTTP) connections should migrate to
using a network security configuration file, which lets you
specify which domains your app needs to make cleartext connections to.
Be aware that network security configuration files are only supported on API levels 24 and higher. If your app has a minimum API level lower than 24, you should do both of the following:
- Set the
usesCleartextTrafficattribute totrue - Use a network configuration file
If your app's minimum API level is 24 or higher, you can use a network
configuration file and you don't need to set usesCleartextTraffic.
Implizite URI-Gewährungen 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 entsprechenden URI-Berechtigungen explizit erteilen, anstatt sich darauf zu verlassen, dass das System sie erteilt.
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 Berechtigung 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 er eine gemeinsam genutzte Ressource für alle Apps auf dem Gerät ist. 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:
- Für 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 Cross-Profile-Loopback-Traffic standardmäßig nicht mehr zulässig. Loopback-Traffic innerhalb desselben Profils ist 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
Beginning with Android 17, when the device's configuration changes (for example, through rotation), and this is not handled by the app itself, the previous IME visibility is not restored.
If your app undergoes a configuration change that it does not handle, and the app needs the keyboard to be visible after the change, you must explicitly request this. You can make this request in one of the following ways:
- Set the
android:windowSoftInputModeattribute tostateAlwaysVisible. - Programmatically request the soft keyboard in your activity's
onCreate()method, or add theonConfigurationChanged()method.
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
Ab Android 17 werden im Audio-Framework Einschränkungen für Audiointeraktionen im Hintergrund erzwungen, darunter Audiowiedergabe, Audiofokus-Anfragen und Lautstärkeänderungs-APIs. So soll sichergestellt werden, dass diese Änderungen vom Nutzer initiiert werden.
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 Lautstärkeänderung fehl, ohne eine Ausnahme auszulösen oder eine Fehlermeldung auszugeben. Die Audio-Fokus-API schlägt mit dem Ergebniscode AUDIOFOCUS_REQUEST_FAILED fehl.
Weitere Informationen, einschließlich Strategien zur Risikominderung, finden Sie unter Härten von Hintergrundaudio.
Konnektivität
Android 17 enthält die folgenden Änderungen zur Verbesserung der Gerätekonnektivität.
Autonome Neukopplung 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_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