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 deterministyczne ś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 prowadzić do przeskoków interfejsu, szybkiego zużycia baterii i zamykania 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 objęta tym problemem, wywołaj funkcję getDescription w ApplicationExitInfo. Jeśli aplikacja została objęta tym problemem, powód zakończenia sesji 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 aktywatorach z TRIGGER_TYPE_ANOMALY, aby uzyskać zrzuty stosu zbierane po osiągnięciu limitu pamięci.
Aby ułatwić Ci znajdowanie wycieków pamięci, Android Studio Panda dodaje integrację z LeakCanary bezpośrednio w profilerze Android Studio jako dedykowane zadanie, które jest kontekstowe w środowisku IDE i w pełni zintegrowane z kodem źródłowym.
Prywatność
Android 17 zawiera te zmiany, które zwiększają prywatność użytkowników.
Ochrona przed SMS-ami z kodami jednorazowymi
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 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, które zwiększają bezpieczeństwo urządzeń 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 zwrotnego między profilami połączonymi
Beginning with Android 17, cross-profile loopback traffic is no longer permitted by default. Loopback traffic within the same profile is not affected. This change applies to all apps running on Android 17 or higher, regardless of what API level the app targets.
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: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 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 wprowadza autonomiczne ponowne parowanie, czyli ulepszenie na poziomie systemu, które automatycznie rozwiązuje problem z utratą połączenia Bluetooth.
Wcześniej, jeśli połączenie zostało utracone, użytkownicy musieli ręcznie przejść do Ustawień, aby odłączyć, a następnie ponownie połączyć urządzenie peryferyjne. Ta funkcja opiera się na ulepszeniach zabezpieczeń wprowadzonych w Androidzie 16, ponieważ umożliwia systemowi ponowne nawiązywanie połączeń w tle bez konieczności ręcznego przechodzenia przez użytkowników do Ustawień w celu rozparowania i ponownego sparowania urządzeń peryferyjnych.
Większość aplikacji nie będzie wymagać zmian w kodzie, ale deweloperzy powinni pamiętać o tych zmianach w działaniu stosu Bluetooth:
- Nowy kontekst parowania:
ACTION_PAIRING_REQUESTzawiera teraz dodatkowy elementEXTRA_PAIRING_CONTEXT, który umożliwia aplikacjom odróżnienie standardowego żądania parowania od próby ponownego parowania zainicjowanej przez autonomiczny system. - Warunkowe aktualizacje kluczy: istniejące klucze bezpieczeństwa zostaną zastąpione tylko wtedy, gdy ponowne parowanie się powiedzie, a nowe połączenie osiągnie poziom bezpieczeństwa poprzedniego połączenia lub go przekroczy.
- Zmiana czasu działania intencji: intencja
ACTION_KEY_MISSINGjest teraz wysyłana tylko wtedy, gdy nie uda się automatyczne ponowne parowanie. Dzięki temu w aplikacji nie będzie konieczne niepotrzebne obsługiwanie błędów, jeśli systemowi uda się odzyskać połączenie w tle. - Powiadomienie użytkownika: system zarządza ponownym parowaniem za pomocą nowych powiadomień interfejsu i okien dialogowych. Użytkownicy zostaną poproszeni o potwierdzenie próby ponownego sparowania, aby mieć pewność, że wiedzą o ponownym połączeniu.
Producenci urządzeń peryferyjnych i deweloperzy aplikacji towarzyszących powinni sprawdzić, czy sprzęt i aplikacja prawidłowo obsługują przejścia między stanami połączenia. Aby przetestować to zachowanie, zasymuluj utratę połączenia zdalnego za pomocą jednej z tych metod:
- Ręczne usuwanie informacji o powiązaniu z urządzenia peryferyjnego
- Ręcznie odłącz urządzenie: Ustawienia > Połączone urządzenia