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

从 Android 17 开始,以 Android 17(API 级别 37) 或更高版本为目标平台的应用会收到 android.os.MessageQueue 的新无锁实现。新实现可提升性能并减少丢帧,但可能会破坏反映 MessageQueue 私有字段和方法的客户端。

如需了解详情(包括缓解措施),请参阅 MessageQueue 行为变更指南

Pola statyczne finalne są teraz niemodyfikowalne

在以 Android 17(API 级别 37)或更高版本为目标平台的 Android 17 或更高版本上运行的应用无法更改 static final 字段。如果应用尝试使用反射更改 static final 字段,则会导致 IllegalAccessException。尝试通过 JNI API(例如 SetStaticLongField())修改其中一个字段会导致应用崩溃。

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

此功能引入了新的 AccessibilityEventTextAttribute API,以增强屏幕阅读器针对 CJKV 语言输入的语音反馈。CJKV IME 应用现在可以指示在文本撰写期间是否已选择文本转换候选内容。具有编辑字段的应用可以在发送文本更改无障碍事件时指定文本更改类型。例如,应用可以指定在文本撰写期间发生了文本更改,或者文本更改是由提交导致的。这样做可让屏幕阅读器等无障碍服务根据文本修改的性质提供更精确的反馈。

应用采用量

  • IME 应用:在编辑字段中设置正在撰写的文本时,IME 可以使用 TextAttribute.Builder.setTextSuggestionSelected() 来指明是否选择了特定的转换候选对象。

  • 具有“编辑字段”权限的应用:维护自定义 InputConnection 的应用可以通过调用 TextAttribute.isTextSuggestionSelected() 来检索候选选择数据。然后,这些应用在调度 TYPE_VIEW_TEXT_CHANGED 事件时应调用 AccessibilityEvent.setTextChangeTypes()。如果应用以 Android 17(API 级别 37)为目标平台,并使用标准 TextView,则默认启用此功能。(也就是说,TextView 将负责从 IME 检索数据,并在向无障碍服务发送事件时设置文本更改类型)。

  • 无障碍服务:处理 TYPE_VIEW_TEXT_CHANGED 事件的无障碍服务可以调用 AccessibilityEvent.getTextChangeTypes() 来识别修改的性质,并相应地调整其反馈策略。

Prywatność

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

Włączono ECH (Encrypted Client Hello)

Android 17 wprowadza obsługę platformy dla rozszerzenia Encrypted Client Hello (ECH), czyli rozszerzenia TLS, które zwiększa prywatność użytkowników przez szyfrowanie wskaźnika nazwy serwera (SNI) w uzgadnianiu TLS. To szyfrowanie pomaga uniemożliwić obserwatorom sieci łatwe zidentyfikowanie konkretnej domeny, z którą łączy się Twoja aplikacja.

W przypadku aplikacji kierowanych na Androida 17 (poziom API 37) lub nowsze wersje rozszerzenie ECH jest używane w połączeniach TLS. Rozszerzenie ECH jest aktywne tylko wtedy, gdy biblioteka sieciowa używana przez aplikację (np. HttpEngine, WebView lub OkHttp) ma zintegrowaną obsługę ECH, a serwer zdalny też obsługuje protokół ECH. Jeśli nie można uzgodnić ECH, klient wysyła rozszerzenie ECH z losową zawartością (mechanizm o nazwie ECH GREASE). Więcej informacji o tym, jak działa ECH GREASE, znajdziesz w RFC 9849.

Aby umożliwić aplikacjom dostosowywanie tego działania, Android 17 dodaje nowy <domainEncryption> element do pliku konfiguracji zabezpieczeń sieci. Deweloperzy mogą używać elementu <domainEncryption> w tagach <base-config> lub <domain-config>, aby wybrać tryb ECH (np. "enabled" lub "disabled") globalnie lub dla poszczególnych domen.

Więcej informacji znajdziesz w dokumentacji Encrypted Client Hello.

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

Android 17 wprowadza uprawnienia w czasie działania (aplikacji) ACCESS_LOCAL_NETWORK, aby chronić użytkowników przed nieautoryzowanym dostępem do sieci lokalnej. Ponieważ to uprawnienie należy do istniejącej grupy uprawnień NEARBY_DEVICES, użytkownicy, którzy przyznali już inne uprawnienia NEARBY_DEVICES, nie będą ponownie proszeni o ich przyznanie. Ten nowy wymóg uniemożliwia złośliwym aplikacjom wykorzystywanie nieograniczonego dostępu do sieci lokalnej do potajemnego śledzenia użytkowników i zbierania odcisków cyfrowych. Deklarując to uprawnienie i wysyłając prośbę o nie, aplikacja może wykrywać urządzenia w sieci lokalnej (LAN), takie jak urządzenia inteligentnego domu czy odbiorniki do przesyłania, i łączyć się z nimi.

Aplikacje kierowane na Androida 17 (API na poziomie 37) lub nowszego mają teraz 2 sposoby na utrzymanie komunikacji z urządzeniami w sieci LAN: mogą korzystać z selektorów urządzeń obsługiwanych przez system, które chronią prywatność i pomijają prośbę o uprawnienia, lub wyraźnie prosić o te nowe uprawnienia w czasie działania, aby utrzymać komunikację w sieci lokalnej.

Więcej informacji znajdziesz w dokumentacji uprawnień do sieci lokalnej.

Ukrywanie haseł na urządzeniach fizycznych

如果应用以 Android 17(API 级别 37)或更高版本为目标平台,并且用户使用的是实体输入设备(例如外接键盘),Android 操作系统会对密码字段中的所有字符应用新的 show_passwords_physical 设置。默认情况下,该设置会隐藏所有密码字符。

Android 系统会显示用户最后输入的密码字符,以帮助用户查看是否输错了密码。不过,对于较大的外接键盘,此功能就没那么必要了。此外,配备外接键盘的设备通常具有较大的显示屏,这会增加他人看到输入密码的风险。

如果用户使用的是设备触摸屏,系统会应用新的 show_passwords_touch 设置。

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 formatu WebOTP ani SMS Retriever). W przypadku większości aplikacji kierowanych na Androida 17 (poziom API 37) lub nowszego te wiadomości SMS stają się dostępne dopiero po 3 godzinach od ich otrzymania. To opóźnienie ma pomóc w zapobieganiu przejęciu kodu jednorazowego. 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.

Niektóre aplikacje, takie jak 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

Jeśli aplikacja jest kierowana na Androida 17 (API na poziomie 37) lub nowszego, przejrzystość certyfikatów (CT) jest domyślnie włączona. (Na Androidzie 16 CT jest dostępny, ale aplikacje musiały wyrazić zgodę na jego używanie).

Bezpieczniejszy natywny DCL-C

如果您的应用以 Android 17(API 级别 37)或更高版本为目标平台,则 Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护功能现在也适用于原生库。

使用 System.load() 加载的所有原生文件都必须标记为只读。否则,系统会抛出 UnsatisfiedLinkError

我们建议应用尽可能避免动态加载代码,因为这样做会大大增加应用因代码注入或代码篡改而遭到入侵的风险。

Ograniczanie pól PII w widoku danych CP2

W przypadku aplikacji kierowanych na Androida 17 (poziom API 37) i nowsze wersje dostawca kontaktów 2 (CP2) ogranicza dostęp do niektórych kolumn zawierających informacje umożliwiające identyfikację. Gdy ta zmiana zostanie włączona, te kolumny zostaną usunięte z widoku danych, aby zwiększyć prywatność użytkowników. Ograniczone kolumny:

Aplikacje, które używają tych kolumn z ContactsContract.Data mogą je zamiast tego wyodrębniać z ContactsContract.RawContacts , łącząc się z RAW_CONTACT_ID.

Wymuszanie rygorystycznych kontroli SQL w CP2

W przypadku aplikacji kierowanych na Androida 17 (interfejs API na poziomie 37) i nowsze wersje dostawca kontaktów 2 (CP2) wymusza ścisłą weryfikację zapytań SQL, gdy uzyskiwany jest dostęp do tabeli ContactsContract.Data bez uprawnienia READ_CONTACTS.

Po wprowadzeniu tej zmiany, jeśli aplikacja nie ma uprawnień READ_CONTACTS, podczas wysyłania zapytań do tabeli ContactsContract.Data ustawiane są opcje StrictColumnsStrictGrammar. Jeśli zapytanie używa wzorca, który nie jest z nimi zgodny, zostanie odrzucone i spowoduje zgłoszenie wyjątku.

Multimedia

W Androidzie 17 wprowadziliśmy te zmiany w działaniu multimediów.

Wzmacnianie zabezpieczeń dźwięku w tle

从 Android 17 开始,音频框架对后台音频互动(包括音频播放、音频焦点请求和音量更改 API)强制执行限制,以确保这些更改是由用户有意启动的。

部分音频限制适用于所有应用。不过,如果应用以 Android 17(API 级别 37)为目标平台,则限制会更加严格。如果这些应用在后台运行时与音频互动,则必须有前台服务正在运行。此外,应用还必须满足以下一项或两项要求:

  • 前台服务必须具有仅在使用时授予的权限 (WIU)。
  • 应用必须具有精确闹钟权限,并且正在与 USAGE_ALARM 音频流互动。

如需了解详情(包括缓解措施),请参阅后台音频安全加固

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

W przypadku aplikacji kierowanych na Androida 17 (poziom API 37) metoda read() interfejsu InputStream uzyskana z BluetoothSocket opartego na RFCOMM zwraca teraz wartość -1, gdy gniazdo jest zamknięte lub połączenie zostało przerwane.

Ta zmiana ujednolica działanie gniazd RFCOMM z gniazdami LE CoC i jest zgodna ze standardową dokumentacją InputStream.read(), która mówi, że po osiągnięciu końca strumienia zwracana jest wartość -1.

Aplikacje, które polegają wyłącznie na przechwytywaniu wyjątku IOException w celu przerwania pętli odczytu, mogą zostać dotknięte tą zmianą. Powinny one zaktualizować pętle odczytu BluetoothSocket, aby jawnie sprawdzać wartość zwracaną -1. Dzięki temu pętla zakończy się prawidłowo, gdy urządzenie zdalne zostanie odłączone lub gniazdo zostanie zamknięte. Przykładową implementację znajdziesz we fragmencie kodu w przewodniku Przesyłanie danych przez Bluetooth.