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 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ę
getDescription w ApplicationExitInfo. 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|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) 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) lubnone(nie ignoruj żadnych aplikacji). Przekazanie wartościnonezastępuje wszystkie poprzednie wywołania funkcjiam 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.manualNakazuje 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
30oznacza, że proces jest ograniczony do 30 MB pamięci. Przekazanie wartościmaxusuwa wszystkie limity pamięci w tym procesie. Przekazanie wartościnonespowoduje usunięcie wszystkich ręcznie ustawionych limitów procesu i przywrócenie domyślnego limitu 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
Beginning with Android 17, Android is expanding its protection for SMS messages containing one-time passwords (OTP).
In previous versions of Android, this protection was primarily focused on the SMS Retriever format. Delivery of messages containing an SMS retriever hash was delayed for most apps for three hours. However, certain apps (like the default SMS handler) were exempt from the delay, and the app that owned the hash was also exempted.
Beginning with Android 17, the protection is also applied to WebOTP format messages. If an app has permission to read SMS messages but is not the intended recipient of a WebOTP message (as determined by domain verification), the message is not accessible to the app until three hours after the message's receipt. This change is intended to improve user security by ensuring that only apps associated with the domain mentioned in the message can programmatically read the verification code.
During this three hour delay, the SMS_RECEIVED_ACTION broadcast is
withheld and SMS provider database queries are filtered. The
SMS message is available to these apps after the delay. This change applies to
all apps, regardless of their target API level.
Certain apps such as the default SMS assistant app, connected device companion apps, etc., are exempted from this delay. All apps that rely on reading SMS messages for OTP extraction should transition to using SMS Retriever or SMS User Consent APIs to ensure continued functionality.
Bezpieczeństwo
Android 17 zawiera te ulepszenia zabezpieczeń urządzenia i aplikacji:
Harmonogram wycofywania atrybutu usesCleartextTraffic
W przyszłej wersji planujemy wycofać element usesCleartextTraffic.
Aplikacje, które muszą nawiązywać niezaszyfrowane połączenia (HTTP), powinny przejść na korzystanie z pliku konfiguracji zabezpieczeń sieci, który pozwala określić, z jakimi domenami aplikacja musi nawiązywać połączenia w postaci tekstu nieszyfrowanego.
Pamiętaj, że pliki konfiguracji zabezpieczeń sieci są obsługiwane tylko na poziomach interfejsu API 24 i wyższych. Jeśli minimalny poziom interfejsu API aplikacji jest niższy niż 24, musisz wykonać obie te czynności:
- ustawić atrybut
usesCleartextTrafficnatrue - użyć pliku konfiguracji sieci.
Jeśli minimalny poziom interfejsu API aplikacji to 24 lub wyższy, możesz użyć pliku konfiguracji sieci i nie musisz ustawiać 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
Aplikacje powinny unikać tworzenia nadmiernej liczby kluczy w magazynie kluczy Androida, ponieważ jest to zasób współdzielony przez wszystkie aplikacje na urządzeniu. Od Androida 17 system egzekwuje limit liczby kluczy, które może posiadać aplikacja. Limit wynosi 50 tys. kluczy w przypadku aplikacji innych niż systemowe, które są kierowane na Androida 17 (poziom interfejsu API 37) lub nowszego, oraz 200 tys. kluczy w przypadku wszystkich innych aplikacji. Aplikacje systemowe mają limit 200 tys. kluczy niezależnie od poziomu interfejsu API, na który są kierowane.
Jeśli aplikacja spróbuje utworzyć klucze ponad limit, utworzenie nie powiedzie się i zostanie zgłoszony wyjątek a
KeyStoreException. Ciąg komunikatu wyjątku zawiera informacje o limicie kluczy. Jeśli aplikacja wywoła getNumericErrorCode() w przypadku
wyjątku, wartość zwracana zależy od poziomu interfejsu API, na który jest kierowana:
- Aplikacje kierowane na Androida 17 (poziom interfejsu API 37) lub nowszego:
getNumericErrorCode()zwraca nową wartośćERROR_TOO_MANY_KEYS. - Wszystkie inne aplikacje:
getNumericErrorCode()zwracaERROR_INCORRECT_USAGE.
Blokowanie ruchu sprzężenia zwrotnego profilu połączonego
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.
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
Od Androida 17, gdy konfiguracja urządzenia ulegnie zmianie (np. w wyniku obrócenia ekranu), a aplikacja nie obsłuży tej zmiany, poprzednia widoczność IME nie zostanie przywrócona.
Jeśli w aplikacji nastąpi zmiana konfiguracji, której nie obsługuje, a po zmianie klawiatura musi być widoczna, musisz wyraźnie o to poprosić. Możesz przesłać prośbę na jeden z tych sposobów:
- Ustaw atrybut
android:windowSoftInputModenastateAlwaysVisible. - Programowo poproś o wyświetlenie klawiatury ekranowej w metodzie
onCreate()aktywności lub dodaj metodęonConfigurationChanged().
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
Od Androida 17, jeśli aplikacja poprosi o przechwycenie wskaźnika za pomocą
View.requestPointerCapture(), a użytkownik będzie korzystać z touchpada, system
rozpozna ruch wskaźnika i gesty przewijania wykonywane przez użytkownika i
zgłosi je aplikacji w taki sam sposób jak ruchy wskaźnika i kółka myszy
z przechwyconej myszy. W większości przypadków eliminuje to konieczność dodawania przez aplikacje obsługujące przechwycone myszy specjalnej logiki obsługi touchpadów. Więcej
informacji znajdziesz w dokumentacji View.POINTER_CAPTURE_MODE_RELATIVE.
Wcześniej system nie próbował rozpoznawać gestów z touchpada, ale przekazywał do aplikacji surowe, bezwzględne lokalizacje palców w formacie podobnym do dotknięć ekranu dotykowego. Jeśli aplikacja nadal wymaga tych danych bezwzględnych, powinna
zamiast tego wywołać nową metodę View.requestPointerCapture(int) z
View.POINTER_CAPTURE_MODE_ABSOLUTE.
Multimedia
W Androidzie 17 wprowadziliśmy te zmiany w działaniu multimediów.
Wzmacnianie zabezpieczeń dźwięku w tle
Od Androida 17 framework audio wymusza ograniczenia dotyczące interakcji audio w tle, w tym odtwarzania dźwięku, żądań aktywności audio i interfejsów API do zmiany głośności, aby mieć pewność, że te zmiany są inicjowane przez użytkownika.
Jeśli aplikacja spróbuje wywołać interfejsy API audio, gdy nie jest w prawidłowym cyklu życia, interfejsy API do odtwarzania dźwięku i zmiany głośności nie powiedzą się bez zgłaszania wyjątku ani wyświetlania komunikatu o błędzie. Interfejs API aktywności audio nie powiedzie się z kodem wyniku AUDIOFOCUS_REQUEST_FAILED.
Więcej informacji, w tym o strategiach ograniczania ryzyka, znajdziesz w artykule Wzmacnianie zabezpieczeń dźwięku w tle .
Łą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