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
Android 17 引入了基于设备总 RAM 的应用内存限制,旨在为您的应用和 Android 用户打造更稳定、更具确定性的环境。在 Android 17 中,限制设置得较为保守,目的是建立系统基准,在极端内存泄漏和其他异常情况触发系统范围的不稳定性(导致界面卡顿、耗电过快和应用被终止)之前,先针对这些情况。虽然我们预计对绝大多数 应用会话的影响很小,但我们建议遵循以下内存最佳实践, 包括建立内存基准。
您可以通过在 ApplicationExitInfo 中调用
getDescription 来确定应用会话是否受到影响;如果您的应用受到
影响,退出原因将为 REASON_OTHER 并且
说明将包含字符串 "MemoryLimiter:AnonSwap" 以及
其他信息。您还可以使用 基于触发器的分析(使用
TRIGGER_TYPE_ANOMALY)来获取在达到
内存限制时收集的堆转储。
为了帮助您查找内存泄漏,Android Studio Panda 直接在 Android Studio 性能分析器中添加了 LeakCanary 集成,作为 IDE 中特定任务,并与您的源代码完全集成。
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
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-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 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);
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 neuenERROR_TOO_MANY_KEYS-Wert zurück. - Alle anderen Apps:
getNumericErrorCode()gibtERROR_INCORRECT_USAGEzurü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: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 darauf auswirken, wie Apps mit Eingabegeräten wie Tastaturen und Touchpads interagieren.
Touchpads liefern standardmäßig relative Ereignisse während der Zeigererfassung
从 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 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
Android 17 引入了自主重新配对功能,这是一项系统级增强功能,旨在自动解决蓝牙配对信息丢失问题。
以前,如果配对信息丢失,用户必须手动前往“设置”取消配对,然后重新配对外围设备。此功能以 Android 16 的安全改进为基础,允许系统在后台重新建立配对信息,而无需用户手动前往“设置”取消配对并重新配对外围设备。
虽然大多数应用不需要更改代码,但开发者应注意蓝牙堆栈中的以下行为变更:
- 新的配对上下文:
ACTION_PAIRING_REQUEST现在包含EXTRA_PAIRING_CONTEXTextra,允许应用区分 标准配对请求和自主系统发起的重新配对尝试。 - 有条件的密钥更新:只有在重新配对成功且新连接达到或超过之前配对信息的安全级别时,才会替换现有安全密钥。
- 修改后的 intent 时间:现在,只有在自主重新配对尝试失败时,才会广播
ACTION_KEY_MISSINGintent。如果系统在后台成功恢复配对信息,则可以减少应用中不必要的错误处理。 - 用户通知:系统通过新的界面通知和对话框管理重新配对。系统会提示用户确认重新配对尝试,以确保用户了解重新连接。
外围设备制造商和配套应用开发者应验证硬件和应用是否能妥善处理配对信息转换。如需测试此行为,请使用以下任一方法模拟远程配对信息丢失:
- 从外围设备中手动移除配对信息
- 在“设置”>“已连接的设备”中手动取消配对设备