Zmiany w działaniu: aplikacje kierowane na Androida 17 lub nowszego

Podobnie jak w przypadku poprzednich wersji Androida, w Androidzie 17 wprowadziliśmy zmiany w działaniu, które mogą mieć wpływ na Twoją aplikację. Poniższe zmiany w działaniu dotyczą wyłącznie aplikacji kierowanych na Androida 17 lub nowszego. Jeśli Twoja aplikacja jest kierowana na Androida 17 lub nowszego, zmodyfikuj ją, aby w odpowiednich przypadkach obsługiwała te działania.

Zapoznaj się też z listą zmian w działaniu, które wpływają na wszystkie aplikacje działające na Androidzie 17 niezależnie od aplikacji targetSdkVersion.

Główna funkcjonalność

Android 17 zawiera te zmiany, które modyfikują lub rozszerzają różne podstawowe funkcje systemu Android.

Nowa implementacja MessageQueue bez blokad

Beginning with Android 17, apps targeting Android 17 (API level 37) or higher receive a new lock-free implementation of android.os.MessageQueue. The new implementation improves performance and reduces missed frames, but may break clients that reflect on MessageQueue private fields and methods.

For more information, including mitigation strategies, see MessageQueue behavior change guidance.

Pola statyczne finalne są teraz niemodyfikowalne

Apps running on Android 17 or higher that target Android 17 (API level 37) or higher cannot change static final fields. If an app attempts to change a static final field by using reflection, it will cause an IllegalAccessException. Attempting to modify one of these fields through JNI APIs (such as SetStaticLongField()) will cause the app to crash.

Ułatwienia dostępu

W Androidzie 17 wprowadziliśmy te zmiany, aby poprawić ułatwienia dostępu.

Obsługa ułatwień dostępu w przypadku złożonego wpisywania z klawiatury fizycznej w edytorze IME

Ta funkcja wprowadza nowe AccessibilityEvent i TextAttribute interfejsy API, które mają na celu ulepszenie informacji głosowych czytnika ekranu w przypadku wprowadzania tekstu w językach CJKV. Aplikacje IME w językach CJKV mogą teraz sygnalizować, czy podczas tworzenia tekstu wybrano kandydata do konwersji tekstu. Aplikacje z polami edycji mogą określać typy zmian tekstu podczas wysyłania zdarzeń ułatwień dostępu dotyczących zmiany tekstu. Aplikacje mogą na przykład określić, że zmiana tekstu nastąpiła podczas tworzenia tekstu lub że zmiana tekstu była wynikiem zatwierdzenia. Dzięki temu usługi ułatwień dostępu, takie jak czytniki ekranu, mogą przekazywać dokładniejsze informacje na podstawie charakteru modyfikacji tekstu.

Popularność aplikacji

  • Aplikacje IME: podczas ustawiania tekstu w polach edycji aplikacje IME mogą używać metody TextAttribute.Builder.setTextSuggestionSelected(), aby wskazać, czy wybrano konkretnego kandydata do konwersji.

  • Aplikacje z polami edycji: aplikacje, które obsługują niestandardowe połączenie InputConnection, mogą pobierać dane o wyborze kandydata, wywołując metodę TextAttribute.isTextSuggestionSelected(). Te aplikacje powinny następnie wywoływać metodę AccessibilityEvent.setTextChangeTypes() podczas wysyłania zdarzeń TYPE_VIEW_TEXT_CHANGED. W przypadku aplikacji kierowanych na Androida 17 (poziom interfejsu API 37), które używają standardowego widoku TextView, ta funkcja będzie domyślnie włączona. (Oznacza to, że widok TextView będzie obsługiwać pobieranie danych z aplikacji IME i ustawianie typów zmian tekstu podczas wysyłania zdarzeń do usług ułatwień dostępu).

  • Usługi ułatwień dostępu: usługi ułatwień dostępu, które przetwarzają zdarzenia TYPE_VIEW_TEXT_CHANGED, mogą wywoływać metodę AccessibilityEvent.getTextChangeTypes(), aby określić charakter modyfikacji i odpowiednio dostosować strategie informacji zwrotnych.

Prywatność

W Androidzie 17 wprowadziliśmy te zmiany, aby zwiększyć prywatność użytkowników.

Włączono ECH (Encrypted Client Hello)

Android 17 introduces platform support for Encrypted Client Hello (ECH), a TLS extension that enhances user privacy by encrypting the Server Name Indication (SNI) in the TLS handshake. This encryption helps prevent network observers from easily identifying the specific domain your app is connecting to.

For apps targeting Android 17 (API level 37) or higher, ECH is used for TLS connections. ECH is active only if the networking library used by the app (for example, HttpEngine, WebView, or OkHttp) has integrated ECH support and the remote server also supports the ECH protocol. If ECH cannot be negotiated, the client sends an ECH extension with randomized contents (a mechanism called ECH GREASE). See RFC 9849 for more details on how ECH GREASE works.

To allow apps to customize this behavior, Android 17 adds a new <domainEncryption> element to the Network Security Configuration file. Developers can use <domainEncryption> within <base-config> or <domain-config> tags to select an ECH mode (for example, "enabled" or "disabled") on a global or per-domain basis.

For more information, see the Encrypted Client Hello documentation.

W przypadku aplikacji kierowanych na Androida 17 wymagane jest uprawnienie do sieci lokalnej

Android 17 introduces the ACCESS_LOCAL_NETWORK runtime permission to protect users from unauthorized local network access. Because this falls under the existing NEARBY_DEVICES permission group, users who have already granted other NEARBY_DEVICES permissions aren't prompted again. This new requirement prevents malicious apps from exploiting unrestricted local network access for covert user tracking and fingerprinting. By declaring and requesting this permission, your app can discover and connect to devices on the local area network (LAN), such as smart home devices or casting receivers.

Apps targeting Android 17 (API level 37) or higher now have two paths to maintain communication with LAN devices: Adopt system-mediated, privacy-preserving device pickers to skip the permission prompt, or explicitly request this new permission at runtime to maintain local network communication.

For more information, see the Local network permission documentation.

Ukrywanie haseł na urządzeniach fizycznych

If an app targets Android 17 (API level 37) or higher and the user is using a physical input device (for example, an external keyboard), the Android operating system applies the new show_passwords_physical setting to all characters in the password field. By default, that setting hides all password characters.

The Android system shows the last-typed password character to help the user see if they mistyped the password. However, this is much less necessary with larger external keyboards. In addition, devices with external keyboards often have larger displays, which increases the danger of someone seeing the typed password.

If the user is using the device's touchscreen, the system applies the new show_passwords_touch setting.

Ochrona OTP w przypadku standardowych SMS-ów

Od Androida 17 Android rozszerza ochronę SMS-ów z hasłem jednorazowym na standardowe wiadomości SMS (zawierające hasło jednorazowe, które nie korzystają z formatów WebOTP ani SMS Retriever). W przypadku większości aplikacji kierowanych na Androida 17 (poziom API 37) lub nowszego te wiadomości SMS są dostępne dopiero 3 godziny po ich otrzymaniu. To opóźnienie ma pomóc w zapobieganiu przejęciu kodu jednorazowego. Podczas tego 3-godzinnego opóźnienia wstrzymywane jest nadawanie komunikatu SMS_RECEIVED_ACTION, a zapytania do bazy danych dostawcy SMS-ów są filtrowane. Po upływie tego czasu wiadomość SMS jest dostępna dla tych aplikacji.

Niektóre aplikacje, np. domyślna aplikacja asystenta SMS-ów, aplikacje towarzyszące połączonym urządzeniom itp., są zwolnione z tego opóźnienia. 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, aby zapewnić dalsze działanie.

Bezpieczeństwo

W Androidzie 17 wprowadziliśmy te ulepszenia, aby zwiększyć bezpieczeństwo urządzeń i aplikacji.

Bezpieczeństwo aktywności

W Androidzie 17 platforma kontynuuje przejście na architekturę „bezpieczną domyślnie”, wprowadzając szereg ulepszeń zaprojektowanych w celu ograniczenia poważnych luk w zabezpieczeniach, takich jak wyłudzanie informacji, przejmowanie interakcji i ataki typu „confused deputy”. W ramach tej aktualizacji deweloperzy muszą wyraźnie zgodzić się na nowe standardy bezpieczeństwa, aby zachować zgodność aplikacji i ochronę użytkowników.

Najważniejsze zmiany dla programistów:

  • Wzmacnianie zabezpieczeń BAL i ulepszona akceptacja: udoskonalamy ograniczenia dotyczące uruchamiania aktywności w tle (BAL), rozszerzając ochronę na IntentSender. Deweloperzy muszą zrezygnować ze stałej starszego typu MODE_BACKGROUND_ACTIVITY_START_ALLOWED. Zamiast tego używaj szczegółowych elementów sterujących, takich jak MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, które ograniczają uruchamianie aktywności do sytuacji, w których aplikacja wywołująca jest widoczna, co znacznie zmniejsza obszar ataku.
  • Narzędzia do wdrażania: deweloperzy powinni korzystać z trybu ścisłego i zaktualizowanych kontroli lint, aby identyfikować starsze wzorce i zapewnić gotowość na przyszłe wymagania dotyczące docelowego pakietu SDK.

Domyślne włączanie CT

If an app targets Android 17 (API level 37) or higher, certificate transparency (CT) is enabled by default. (On Android 16, CT is available but apps had to opt in.)

Bezpieczniejszy natywny DCL-C

If your app targets Android 17 (API level 37) or higher, the Safer Dynamic Code Loading (DCL) protection introduced in Android 14 for DEX and JAR files now extends to native libraries.

All native files loaded using System.load() must be marked as read-only. Otherwise, the system throws UnsatisfiedLinkError.

We recommend that apps avoid dynamically loading code whenever possible, as doing so greatly increases the risk that an app can be compromised by code injection or code tampering.

Ograniczanie pól PII w widoku danych CP2

For apps targeting Android 17 (API level Android 17 (API level 37)) and higher, Contacts Provider 2 (CP2) restricts certain columns containing Personally Identifiable Information (PII) from the data view. When this change is enabled, these columns are removed from the data view to enhance user privacy. The restricted columns include:

Apps that are using these columns from ContactsContract.Data can extract them from ContactsContract.RawContacts instead, by joining with RAW_CONTACT_ID.

Wymuszanie rygorystycznych kontroli SQL w CP2

For apps targeting Android 17 (API level Android 17 (API level 37)) and higher, Contacts Provider 2 (CP2) enforces strict SQL query validation when the ContactsContract.Data table is accessed without READ_CONTACTS permission.

With this change, if an app doesn't have READ_CONTACTS permission, StrictColumns and StrictGrammar options are set when querying the ContactsContract.Data table. If a query uses a pattern that isn't compatible with these, it will be rejected and cause an exception to be thrown.

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.

Some audio restrictions apply to all apps. However, the restrictions are more stringent if an app targets Android 17 (API level 37). If one of these apps interacts with audio while it is in the background, it must have a foreground service running. In addition, the app must meet one or both of these requirements:

  • The foreground service must have while-in-use (WIU) capabilities.
  • The app must have the exact alarm permission and be interacting with USAGE_ALARM audio streams.

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

Formaty urządzeń

W Androidzie 17 wprowadziliśmy te zmiany, aby poprawić wygodę użytkowników na urządzeniach o różnych rozmiarach i formatach.

Zmiany w interfejsie Platform API, które ignorują ograniczenia dotyczące orientacji, możliwości zmiany rozmiaru i formatu obrazu na dużych ekranach (sw>=600dp)

W Androidzie 16 wprowadziliśmy zmiany w interfejsie Platform API, aby ignorować ograniczenia dotyczące orientacji, formatu obrazu i możliwości zmiany rozmiaru na dużych ekranach (sw >= 600 dp) w przypadku aplikacji korzystających z API na poziomie 36 lub nowszym. Deweloperzy mogą zrezygnować z tych zmian w przypadku pakietu SDK 36, ale ta opcja nie będzie już dostępna w przypadku aplikacji, których docelowy poziom to Android 17 (API na poziomie 37) lub nowszy.

Więcej informacji znajdziesz w artykule Ograniczenia dotyczące orientacji i możliwości zmiany rozmiaru są ignorowane.

Łączność

W Androidzie 17 wprowadziliśmy tę zmianę, aby zwiększyć spójność i dostosować się do standardowego działania InputStream w Javie w przypadku gniazd Bluetooth RFCOMM.

Spójne działanie metody read() w BluetoothSocket w przypadku RFCOMM

For apps targeting Android 17 (API level 37), the read() method of the InputStream obtained from an RFCOMM-based BluetoothSocket now returns -1 when the socket is closed or the connection is dropped.

This change makes RFCOMM socket behavior consistent with LE CoC sockets and aligns with the standard InputStream.read() documentation, which states that -1 is returned when the end of the stream is reached.

Apps that rely solely on catching an IOException to break out of a read loop may be impacted by this change and should update the BluetoothSocket read loops to explicitly check for a return value of -1. This ensures the loop terminates correctly when the remote device disconnects or the socket is closed. For an example of the recommended implementation, see the code snippet in the Transfer Bluetooth data guide.