Zmiany w działaniu: wszystkie aplikacje

Platforma Android 17 zawiera zmiany w działaniu, które mogą mieć wpływ na Twoją aplikację. Poniższe zmiany w działaniu dotyczą wszystkich aplikacji działających na Androidzie 17, niezależnie od targetSdkVersion. Przetestuj aplikację, a następnie w razie potrzeby zmodyfikuj ją, aby obsługiwała te zmiany.

Zapoznaj się też z listą zmian w działaniu, które wpływają tylko na aplikacje kierowane na Androida 17.

Główna funkcjonalność

Android 17 (API na poziomie 37) zawiera te zmiany, które modyfikują lub rozszerzają różne podstawowe funkcje systemu Android.

Limity pamięci aplikacji

Android 17 wprowadza limity pamięci aplikacji oparte na całkowitej pamięci RAM urządzenia, aby zapewnić bardziej stabilne i przewidywalne środowisko dla aplikacji i użytkowników Androida. W Androidzie 17 limity są ustawione w sposób konserwatywny, aby ustalić wartości bazowe systemu. Ma to na celu wykrywanie ekstremalnych wycieków pamięci i innych wartości odstających, zanim spowodują one niestabilność całego systemu, co może skutkować zacinaniem się interfejsu, szybszym rozładowywaniem baterii i zamykaniem aplikacji. Spodziewamy się, że w przypadku większości sesji w aplikacjach wpływ będzie minimalny, ale zalecamy stosowanie tych sprawdzonych metod dotyczących pamięci, w tym ustalenie wartości bazowej pamięci.

Aby sprawdzić, czy sesja aplikacji została przerwana, wywołaj funkcję getDescriptionApplicationExitInfo. Jeśli aplikacja została przerwana, powód zakończenia będzie mieć wartość REASON_OTHER, a opis będzie zawierać ciąg znaków "MemoryLimiter:AnonSwap" wraz z innymi informacjami. Możesz też użyć profilowania opartego na wyzwalaczach z funkcją TRIGGER_TYPE_ANOMALY, aby uzyskać zrzuty sterty zebrane po osiągnięciu limitu pamięci.

Dokumentacja Zarządzanie pamięcią aplikacji zawiera informacje, które pomogą Ci zdiagnozować problemy z pamięcią aplikacji i zoptymalizować zużycie zasobów.

Sprawdzanie działania aplikacji w warunkach ograniczonej pamięci

Za pomocą Android Debug Bridge (adb) możesz dostosować lub wyłączyć limity pamięci na dowolnym urządzeniu, na którym są one nałożone. Polecenie powłoki am zawiera 3 podpolecenia do dostosowywania limitów pamięci. (Te polecenia nie mają wpływu na urządzenie, które nie nakłada limitów pamięci).

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

Nakazuje ogranicznikowi pamięci ignorowanie niektórych lub wszystkich procesów. Przekazanie identyfikatora UID (identyfikatora użytkownika Androida) powoduje, że ogranicznik pamięci ignoruje egzekwowanie limitów we wszystkich procesach powiązanych z tym identyfikatorem. Możesz też przekazać wartość all (ignoruj wszystkie aplikacje) lub none (nie ignoruj żadnych aplikacji). Przekazanie wartości none zastępuje wszystkie poprzednie wywołania funkcji am memory-limiter ignore.

Jeśli polecisz ogranicznikowi pamięci zignorować identyfikator UID, nadal możesz ręcznie zastosować limit pamięci do procesu w aplikacji, wywołując am memory-limiter manual.

manual

Nakazuje systemowi nałożenie ograniczenia pamięci na proces o określonym identyfikatorze PID (Process ID). Ograniczenie pamięci jest podawane jako liczba całkowita w MB. Na przykład podanie wartości 30 oznacza, że proces jest ograniczony do 30 MB pamięci. Przekazanie wartości max usuwa wszystkie limity pamięci w tym procesie. Przekazanie wartości none spowoduje usunięcie wszystkich ręcznie ustawionych limitów procesu i przywrócenie domyślnego limitu systemu (jeśli taki istnieje).

status

Zwraca bieżący stan ogranicznika pamięci. Stan obejmuje limity pamięci nałożone na widoczne i niewidoczne procesy.

Prywatność

Android 17 zawiera te zmiany, które zwiększają prywatność użytkowników.

Ochrona przed SMS-ami z kodami jednorazowymi

从 Android 17 开始,Android 将扩大对包含一次性密码 (OTP) 的短信的保护范围。

在之前的 Android 版本中,此保护主要侧重于 SMS Retriever 格式。对于大多数应用,包含 SMS Retriever 哈希的消息的递送延迟了 3 小时。不过,某些应用(例如默认短信处理程序)不受此延迟的影响,拥有哈希的应用也不受此延迟的影响。

从 Android 17 开始,此保护也适用于 WebOTP 格式的消息。如果应用有权读取短信,但不是 WebOTP 消息的预期接收者(由网域验证确定),则该应用在收到消息后 3 小时内无法访问该消息。此变更旨在提高用户安全性,确保只有与消息中提及的网域关联的应用才能以编程方式读取验证码。

在这 3 小时的延迟期间,系统会保留 SMS_RECEIVED_ACTION 广播,并过滤 短信提供商 数据库查询。延迟结束后,这些应用即可使用短信。此变更适用于 所有应用,无论其目标 API 级别如何。

某些应用(例如默认短信助理应用、关联设备配套应用等)不受此延迟的影响。所有依赖于读取短信 来提取 OTP 的应用都应过渡到使用 SMS RetrieverSMS User Consent API,以确保功能持续可用。

Bezpieczeństwo

Android 17 zawiera te ulepszenia, które zwiększają bezpieczeństwo urządzeń i aplikacji.

Harmonogram wycofywania atrybutu usesCleartextTraffic

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 usesCleartextTraffic attribute to true
  • 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.

Ograniczanie niejawnych uprawnień do identyfikatorów URI

目前,如果应用启动的 intent 具有 URI,且该 URI 具有操作 ACTION_SENDACTION_SEND_MULTIPLEACTION_IMAGE_CAPTURE,则系统会自动向目标应用授予读取和 写入 URI 权限。从 Android 18 开始,系统将 不再自动授予这些权限。因此,我们建议应用明确授予相关 URI 权限,而不是依赖系统授予这些权限。

如需检测应用中这些 intent 的使用情况,请将 StrictModedetectImplicitUriPermissionGrant() 结合使用,以触发违规行为:

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

或者,您也可以监控包含消息 Please set the grant explicitly in the app 的已记录异常,该消息会在系统隐式设置授予时显示。您可以使用以下 adb 命令监控这些日志:

adb logcat | grep "Please set the grant explicitly in the app"

如需明确授予必要的权限,请将 FLAG_GRANT_READ_URI_PERMISSION标志添加到ACTION_SENDACTION_SEND_MULTIPLEintent:

Kotlin

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

Java

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

对于 ACTION_IMAGE_CAPTURE intent,请同时添加FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION 标志:

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

Limity magazynu kluczy poszczególnych aplikacji

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.

Blokowanie ruchu zwrotnego między profilami połączonymi

Od Androida 17 ruch zwrotny między profilami nie jest już domyślnie dozwolony. Nie ma to wpływu na ruch zwrotny w ramach tego samego profilu. Ta zmiana dotyczy wszystkich aplikacji działających na Androidzie 17 lub nowszym, niezależnie od docelowego poziomu interfejsu API.

Wygoda użytkowania i interfejs systemu

Android 17 zawiera te zmiany, które mają na celu zapewnienie bardziej spójnego i intuicyjnego interfejsu użytkownika.

Przywracanie domyślnej widoczności IME po obróceniu ekranu

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:windowSoftInputMode attribute to stateAlwaysVisible.
  • Programmatically request the soft keyboard in your activity's onCreate() method, or add the onConfigurationChanged() method.

Dane wejściowe od człowieka

Android 17 zawiera te zmiany, które wpływają na sposób, w jaki aplikacje wchodzą w interakcję z urządzeniami wejściowymi, takimi jak klawiatury i touchpady.

Touchpady domyślnie dostarczają zdarzenia względne podczas przechwytywania wskaźnika

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.

Multimedia

Android 17 zawiera te zmiany w działaniu multimediów.

Wzmacnianie zabezpieczeń dźwięku w tle

Beginning with Android 17, the audio framework enforces restrictions on background audio interactions including audio playback, audio focus requests, and volume change APIs to ensure that these changes are started intentionally by the user.

If the app tries to call audio APIs while the app is not in a valid lifecycle, the audio playback and volume change APIs fail silently without throwing an exception or providing a failure message. The audio focus API fails with the result code AUDIOFOCUS_REQUEST_FAILED.

For more information, including mitigation strategies, see Background audio hardening.

Łączność

Android 17 zawiera te zmiany, które zwiększają łączność urządzeń.

Autonomiczne ponowne parowanie w przypadku utraty połączenia Bluetooth

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_REQUEST now includes the EXTRA_PAIRING_CONTEXT extra 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_MISSING intent 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