Verhaltensänderungen: alle Apps

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.

Die LeakCanary-Aufgabe im Android Studio Profiler.

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 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-Gewährungen einschränken

Wenn eine App derzeit einen Intent mit einem URI startet, der die Aktion ACTION_SEND, SEND_MULTIPLE, oder ACTION_IMAGE_CAPTURE, enthält, gewährt das System der Ziel-App automatisch die Lese- und Schreibberechtigungen für den URI. Wir planen, dieses Verhalten in Android 18 zu ändern. Aus diesem Grund empfehlen wir, dass Apps die relevanten URI-Berechtigungen explizit gewähren, anstatt sich darauf zu verlassen, dass das System dies tut.

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 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 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: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 darauf auswirken, wie Apps mit Eingabegeräten wie Tastaturen und Touchpads interagieren.

Touchpads liefern standardmäßig relative Ereignisse während der Zeigererfassung

Ab Android 17 erkennt das System, wenn eine App mit View.requestPointerCapture() die Zeigererfassung anfordert und der Nutzer ein Touchpad verwendet, die Zeigerbewegungen und Scrollgesten, die durch die Berührungen des Nutzers entstehen, und meldet sie der App auf dieselbe Weise wie Zeiger- und Mausradbewegungen einer erfassten Maus. In den meisten Fällen müssen Apps, die erfasste Mäuse unterstützen, daher keine spezielle Logik für Touchpads hinzufügen. Weitere Informationen finden Sie in der Dokumentation zu View.POINTER_CAPTURE_MODE_RELATIVE.

Bisher hat das System nicht versucht, Gesten vom Touchpad zu erkennen, sondern die rohen, absoluten Fingerpositionen in einem ähnlichen Format wie bei Touchscreen-Berührungen an die App gesendet. Wenn eine App diese absoluten Daten weiterhin benötigt, sollte sie stattdessen die neue Methode View.requestPointerCapture(int) mit View.POINTER_CAPTURE_MODE_ABSOLUTE aufrufen.

Medien

Android 17 enthält die folgenden Änderungen am Media-Verhalten.

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 zur Verbesserung der Gerätekonnektivität.

Autonome Neukopplung bei Verlust der Bluetooth-Bindung

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