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|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 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) odernone(keine Apps ignorieren) übergeben. Durch die Übergabe vonnonewerden alle vorherigen Aufrufe vonam 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 manualaufrufen.manualWeist 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 vonmaxwerden alle Arbeitsspeicherlimits für diesen Prozess entfernt. Durch die Übergabe vonnonewerden alle manuell festgelegten Limits für den Prozess entfernt und das Standardlimit des Systems wiederhergestellt (falls vorhanden).statusGibt 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
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-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
应用应避免在 Android 密钥库中创建过多的密钥,因为它是设备上所有应用的共享资源。从 Android 17 开始,系统会强制限制应用可拥有的密钥数量。对于以 Android 17(API 级别 37)或更高版本为目标平台的非系统应用,密钥数量上限为 50,000 个;对于所有其他应用,密钥数量上限为 200,000 个。无论系统应用以哪个 API 级别为目标,其密钥数量上限均为 20 万。
如果应用尝试创建超出限制的密钥,则创建会失败并显示 KeyStoreException。异常的消息字符串包含有关密钥限制的信息。如果应用针对异常调用 getNumericErrorCode(),则返回值取决于应用的目标 API 级别:
- 如果应用以 Android 17(API 级别 37)或更高版本为目标平台,
getNumericErrorCode()会返回新的ERROR_TOO_MANY_KEYS值。 - 所有其他应用:
getNumericErrorCode()返回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: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 auf die Interaktion von Apps mit Eingabegeräten wie Tastaturen und Touchpads auswirken.
Touchpads liefern bei der Zeigererfassung standardmäßig relative Ereignisse
从 Android 17 开始,如果应用使用 View.requestPointerCapture() 请求捕获指针,并且用户使用触控板,系统会识别用户触摸操作产生的指针移动和滚动手势,并以与捕获的鼠标产生的指针和滚轮移动相同的方式将这些信息报告给应用。在大多数情况下,这使得支持捕获鼠标的应用无需为触控板添加特殊的处理逻辑。如需了解详情,请参阅 View.POINTER_CAPTURE_MODE_RELATIVE 的文档。
之前,系统不会尝试识别触控板的手势,而是以类似于触摸屏触摸的格式将原始的绝对手指位置传递给应用。如果应用仍需要此绝对数据,则应改为使用 View.POINTER_CAPTURE_MODE_ABSOLUTE 调用新的 View.requestPointerCapture(int) 方法。
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 引入了自主重新配对功能,这是一项系统级增强功能,旨在自动解决蓝牙配对信息丢失问题。
以前,如果配对信息丢失,用户必须手动前往“设置”取消配对,然后重新配对外围设备。此功能以 Android 16 的安全改进为基础,允许系统在后台重新建立配对信息,而无需用户手动前往“设置”取消配对并重新配对外围设备。
虽然大多数应用不需要更改代码,但开发者应注意蓝牙堆栈中的以下行为变更:
- 新的配对上下文:
ACTION_PAIRING_REQUEST现在包含EXTRA_PAIRING_CONTEXTextra,允许应用区分 标准配对请求和自主系统发起的重新配对尝试。 - 有条件的密钥更新:只有在重新配对成功且新连接达到或超过之前配对信息的安全级别时,才会替换现有安全密钥。
- 修改后的 intent 时间:现在,只有在自主重新配对尝试失败时,才会广播
ACTION_KEY_MISSINGintent。如果系统在后台成功恢复配对信息,则可以减少应用中不必要的错误处理。 - 用户通知:系统通过新的界面通知和对话框管理重新配对。系统会提示用户确认重新配对尝试,以确保用户了解重新连接。
外围设备制造商和配套应用开发者应验证硬件和应用是否能妥善处理配对信息转换。如需测试此行为,请使用以下任一方法模拟远程配对信息丢失:
- 从外围设备中手动移除配对信息
- 在“设置”>“已连接的设备”中手动取消配对设备