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 funkcja
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 łącznej ilości pamięci RAM urządzenia, aby zapewnić bardziej stabilne i deterministyczne środowisko dla Twoich aplikacji i użytkowników Androida. Te limity koncentrują się na wyciekach pamięci i innych elementach odstających, zanim spowodują niestabilność całego systemu, co może prowadzić do przeskoków interfejsu, szybszego zużycia baterii i zamykania aplikacji. Chociaż przewidujemy minimalny wpływ na zdecydowaną większość sesji aplikacji, zalecamy stosowanie tych sprawdzonych metod dotyczących pamięci, w tym ustalenie wartości bazowej pamięci.
Aby sprawdzić, czy sesja aplikacji została naruszona, wywołaj
getDescription w ApplicationExitInfo. Jeśli Twoja aplikacja została
naruszona, powód zakończenia będzie mieć wartość REASON_OTHER i
opis będzie zawierać ciąg znaków "MemoryLimiter:AnonSwap" oraz
inne informacje. Możesz też użyć profilowania opartego na wyzwalaczach z
TRIGGER_TYPE_ANOMALY, aby uzyskać zrzuty sterty, które są zbierane po osiągnięciu
limitu pamięci.
W dokumentacji Zarządzanie pamięcią aplikacji znajdziesz informacje które pomogą Ci zdiagnozować problemy z pamięcią aplikacji i zoptymalizować zużycie zasobów.
Testowanie zachowania aplikacji w warunkach ograniczeń pamięci
Możesz użyć Android Debug Bridge (adb), aby dostosować lub wyłączyć
limity pamięci na dowolnym urządzeniu, na którym są one stosowane. Polecenie powłoki am udostępnia 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|allam memory-limiter manual <pid> <limit>|max|noneam memory-limiter status
ignoreNakazuje ogranicznikowi pamięci ignorowanie niektórych lub wszystkich procesów. Przekazanie identyfikatora UID (identyfikatora użytkownika Androida) nakazuje ogranicznikowi pamięci ignorowanie egzekwowania limitu we wszystkich procesach powiązanych z tym identyfikatorem. Możesz też przekazać wartość
all(ignoruj wszystkie aplikacje) lubnone(nie ignoruj żadnych aplikacji). Przekazanie wartościnonezastępuje wszystkie poprzednie wywołaniaam memory-limiter ignore.Jeśli nakazujesz ogranicznikowi pamięci ignorowanie identyfikatora UID, nadal możesz zastosować ręczny limit pamięci do procesu w aplikacji, wywołując
am memory-limiter manual.manualNakazuje systemowi nałożenie ograniczenia pamięci na proces o określonym identyfikatorze PID (identyfikatorze procesu). Ograniczenie pamięci jest określane jako liczba całkowita w MB. Na przykład przekazanie wartości
30oznacza, że proces jest ograniczony do 30 MB pamięci. Przekazanie wartościmaxusuwa wszystkie limity pamięci dla tego procesu. Przekazanie wartościnoneusuwa wszystkie ręczne limity ustawione dla procesu, przywracając domyślny limit systemu (jeśli taki istnieje).statusZwraca bieżący stan ogranicznika pamięci. Stan obejmuje limity pamięci nałożone na widoczne i niewidoczne procesy.
Prywatność
W Androidzie 17 wprowadziliśmy te zmiany, aby zwiększyć prywatność użytkowników.
Ochrona haseł jednorazowych SMS
Od Androida 17 Android rozszerza ochronę wiadomości SMS zawierających hasła jednorazowe.
W poprzednich wersjach Androida ta ochrona była skoncentrowana głównie na formacie SMS Retriever. Dostarczanie wiadomości zawierających hash SMS Retriever było opóźnione w przypadku większości aplikacji o 3 godziny. Jednak niektóre aplikacje (np. domyślna aplikacja do obsługi SMS-ów) były zwolnione z tego opóźnienia, podobnie jak aplikacja, która była właścicielem hasha.
Od Androida 17 ochrona obejmuje też wiadomości w formacie WebOTP. Jeśli aplikacja ma uprawnienia do odczytywania wiadomości SMS, ale nie jest zamierzonym odbiorcą wiadomości WebOTP (co jest ustalane na podstawie weryfikacji domeny), nie będzie miała dostępu do wiadomości przez 3 godziny od jej otrzymania. Ta zmiana ma na celu zwiększenie bezpieczeństwa użytkowników przez zapewnienie, że tylko aplikacje powiązane z domeną wymienioną w wiadomości będą mogły programowo odczytać kod weryfikacyjny.
Podczas tego 3-godzinnego opóźnienia transmisja SMS_RECEIVED_ACTION jest
wstrzymywana, a zapytania do bazy danych dostawcy SMS-ów są filtrowane. Po upływie tego czasu wiadomość SMS jest dostępna dla tych aplikacji. Ta zmiana dotyczy
wszystkich aplikacji, niezależnie od poziomu interfejsu API, na który są kierowane.
Niektóre aplikacje, takie jak domyślna aplikacja asystenta SMS-ów czy aplikacje towarzyszące połączonym urządzeniom, są zwolnione z tego opóźnienia. Aby zapewnić dalsze działanie, wszystkie aplikacje, które polegają na odczytywaniu wiadomości SMS w celu wyodrębnienia hasła jednorazowego, powinny przejść na korzystanie z interfejsów API SMS Retriever lub SMS User Consent.
Bezpieczeństwo
Android 17 zawiera te ulepszenia zabezpieczeń urządzenia 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
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.
Ograniczanie niejawnych uprawnień do identyfikatorów URI
Obecnie, jeśli aplikacja uruchamia intencję z URI, która ma działanie
ACTION_SEND, ACTION_SEND_MULTIPLE lub
ACTION_IMAGE_CAPTURE, system automatycznie przyznaje aplikacji docelowej uprawnienia do odczytu i zapisu URI. Od Androida 18 system nie będzie już automatycznie przyznawać tych uprawnień. Z tego powodu zalecamy, aby aplikacje wyraźnie przyznawały odpowiednie uprawnienia dotyczące identyfikatora URI, zamiast polegać na systemie.
Aby wykryć użycie tych intencji w aplikacji, użyj StrictMode z detectImplicitUriPermissionGrant(), aby wywołać naruszenie:
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);
Możesz też monitorować zalogowane wyjątki zawierające komunikat
Please set the grant explicitly in the app, który pojawia się, gdy system niejawnie
ustawia uprawnienia. Możesz monitorować te logi za pomocą tego polecenia: adb
adb logcat | grep "Please set the grant explicitly in the app"
Aby wyraźnie przyznać niezbędne uprawnienia, dodaj flagę FLAG_GRANT_READ_URI_PERMISSION do intencji ACTION_SEND i ACTION_SEND_MULTIPLE:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uwzględnij flagi FLAG_GRANT_READ_URI_PERMISSION i FLAG_GRANT_WRITE_URI_PERMISSION w przypadku intencji ACTION_IMAGE_CAPTURE:
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 newERROR_TOO_MANY_KEYSvalue. - All other apps:
getNumericErrorCode()returnsERROR_INCORRECT_USAGE.
Blokowanie ruchu sprzężenia zwrotnego profilu połączonego
从 Android 17 开始,默认情况下不再允许跨个人资料环回流量。同一个人资料内的环回流量不受影响。 此项变更适用于在 Android 17 或更高版本上运行的所有应用,无论应用以哪个 API 级别为目标平台。
Wrażenia użytkowników i interfejs systemu
Android 17 zawiera te zmiany, które mają na celu zapewnienie bardziej spójnego i intuicyjnego interfejsu.
Przywracanie domyślnej widoczności IME po obróceniu
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.
Dane wejściowe od człowieka
Android 17 zawiera te zmiany, które wpływają na sposób, w jaki aplikacje korzystają z urządzeń wejściowych, takich 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
W Androidzie 17 wprowadziliśmy 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ść
W Androidzie 17 wprowadziliśmy te zmiany, aby zwiększyć łą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_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