Zmiany w działaniu: wszystkie aplikacje

Platforma Android 11 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 11, niezależnie od targetSdkVersion. Przetestuj aplikację i w razie potrzeby 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ą tylko na aplikacje kierowane na Androida 11.

Prywatność

Android 11 wprowadza zmiany i ograniczenia, które zwiększają prywatność użytkowników, m.in.:

  • Jednorazowe zezwolenia: dają użytkownikom możliwość przyznania bardziej tymczasowego dostępu do lokalizacji, mikrofonu i aparatu.
  • Widoczność okna uprawnień: wielokrotne odrzucenie uprawnienia oznacza „nie pytaj ponownie”.
  • Sprawdzanie dostępu do danych: dowiedz się, gdzie Twoja aplikacja uzyskuje dostęp do danych prywatnych, zarówno w kodzie aplikacji, jak i w kodzie zależnych bibliotek.
  • Uprawnienia do okna alertu systemowego: niektóre klasy aplikacji automatycznie otrzymują uprawnienie SYSTEM_ALERT_WINDOW na żądanie. Dodatkowo intencje, które zawierają działanie intencji ACTION_MANAGE_OVERLAY_PERMISSION, zawsze kierują użytkowników do ekranu w ustawieniach systemowych.
  • Stałe identyfikatory SIM: na Androidzie 11 i nowszych dostęp do niemożliwych do zresetowania identyfikatorów ICCID za pomocą metody getIccId() jest ograniczony. Metoda zwraca niepusty ciąg znaków. Aby jednoznacznie zidentyfikować kartę SIM zainstalowaną na urządzeniu, użyj metody getSubscriptionId(). Identyfikator subskrypcji zawiera wartość indeksu (zaczynającą się od 1) służącą do jednoznacznego identyfikowania zainstalowanych kart SIM, w tym fizycznych i elektronicznych. Wartość tego identyfikatora jest stała dla danej karty SIM, chyba że urządzenie zostanie przywrócone do ustawień fabrycznych.

Więcej informacji znajdziesz na stronie Prywatność.

Powiadomienia o narażeniu na kontakt

Android 11 aktualizuje platformę z myślą o systemie powiadomień o narażeniu na kontakt. Użytkownicy mogą teraz korzystać z aplikacji do powiadomień o narażeniu na kontakt na Androidzie 11 bez konieczności włączania ustawienia lokalizacji urządzenia. Jest to wyjątek dotyczący tylko systemu powiadomień o narażeniu na kontakt, ponieważ został on zaprojektowany w taki sposób, że aplikacje, które go używają, nie mogą określać lokalizacji urządzenia za pomocą skanowania Bluetooth.

Aby chronić prywatność użytkowników, wszystkie inne aplikacje nadal nie mogą skanować Bluetooth, chyba że ustawienie lokalizacji urządzenia jest włączone, a użytkownik przyznał im dostęp do lokalizacji. Więcej informacji znajdziesz w poście Aktualizacja dotycząca powiadomień o narażeniu na kontakt.

Bezpieczeństwo

Gniazda SSL domyślnie używają silnika Conscrypt SSL

Domyślna implementacja SSLSocket na Androidzie jest oparta na Conscrypt. Od Androida 11 ta implementacja jest wewnętrznie oparta na SSLEngine Conscrypt.

Scudo Hardened Allocator

Android 11 używa wewnętrznie alokatora Scudo Hardened Allocator do obsługi alokacji sterty. Scudo może wykrywać i ograniczać niektóre typy naruszeń bezpieczeństwa pamięci. Jeśli w raportach o awariach systemowych widzisz awarie związane ze Scudo (np. Scudo ERROR:), zapoznaj się z dokumentacją dotyczącą rozwiązywania problemów ze Scudo.

Statystyki korzystania z aplikacji

Aby lepiej chronić użytkowników, Android 11 przechowuje statystyki korzystania z aplikacji przez każdego użytkownika w pamięci zaszyfrowanej danymi logowania. Dlatego ani system, ani żadne aplikacje nie mają dostępu do tych danych, dopóki metoda isUserUnlocked() nie zwróci wartości true, co następuje po wykonaniu jednej z tych czynności:

  • Użytkownik odblokowuje urządzenie po raz pierwszy po uruchomieniu systemu.
  • Użytkownik przełącza się na swoje konto na urządzeniu.

Jeśli Twoja aplikacja jest już powiązana z instancją UsageStatsManager, sprawdź, czy wywołujesz metody na tym obiekcie po odblokowaniu urządzenia przez użytkownika. W przeciwnym razie interfejs API zwraca teraz wartości null lub puste.

Obsługa 5G w emulatorze

Android 11 dodaje interfejsy API 5G, dzięki którym aplikacje mogą korzystać z najnowocześniejszych funkcji. Aby przetestować funkcje podczas ich dodawania, możesz użyć nowych możliwości emulatora Android SDK. Nowa funkcja została dodana w emulatorze w wersji 30.0.22. Wybranie ustawienia sieci 5G ustawia TelephonyDisplayInfo na OVERRIDE_NETWORK_TYPE_NR_NSA, modyfikuje szacowaną przepustowość i pozwala ustawić połączenie jako taryfowe, aby sprawdzić, czy aplikacja odpowiednio reaguje na zmiany stanu NET_CAPABILITY_TEMPORARILY_NOT_METERED.

Wydajność i debugowanie

Debugowanie limitów wywołań interfejsu API JobScheduler

Android 11 obsługuje debugowanie aplikacji, aby identyfikować potencjalne wywołania interfejsu API JobScheduler, które przekroczyły określone limity liczby żądań. Deweloperzy mogą używać tej funkcji do identyfikowania potencjalnych problemów z wydajnością. W przypadku aplikacji z atrybutem manifestu debuggable ustawionym na „true” wywołania interfejsu API JobScheduler przekraczające limity liczby żądań będą zwracać błąd RESULT_FAILURE. Limity są ustawione tak, aby nie miały wpływu na uzasadnione przypadki użycia.

Narzędzie do czyszczenia deskryptorów plików (fdsan)

W Androidzie 10 wprowadziliśmy fdsan (narzędzie do czyszczenia deskryptorów plików). fdsan wykrywa nieprawidłowe zarządzanie własnością deskryptora pliku, takie jak użycie po zamknięciu i podwójne zamknięcie. W Androidzie 11 domyślny tryb fdsan ulega zmianie. fdsan teraz przerywa działanie po wykryciu błędu. Wcześniej rejestrował ostrzeżenie i kontynuował działanie. Jeśli w aplikacji występują awarie spowodowane przez fdsan, zapoznaj się z fdsan documentation.

Ograniczenia interfejsów innych niż SDK

Android 11 zawiera zaktualizowane listy ograniczonych interfejsów spoza pakietu SDK, które powstały we współpracy z programistami aplikacji na Androida i na podstawie najnowszych testów wewnętrznych. Zanim ograniczymy dostęp do interfejsów innych niż SDK, staramy się zapewnić publiczne alternatywy.

Jeśli Twoja aplikacja nie jest kierowana na Androida 11, niektóre z tych zmian mogą nie mieć na nią natychmiastowego wpływu. Obecnie możesz używać niektórych interfejsów spoza pakietu SDK (w zależności od docelowego poziomu interfejsu API aplikacji), ale użycie dowolnej metody lub pola spoza pakietu SDK zawsze wiąże się z dużym ryzykiem uszkodzenia aplikacji.

Jeśli nie masz pewności, czy Twoja aplikacja używa interfejsów innych niż SDK, możesz ją przetestować, aby to sprawdzić. Jeśli Twoja aplikacja korzysta z interfejsów innych niż SDK, zacznij planować migrację do alternatywnych rozwiązań SDK. Rozumiemy jednak, że niektóre aplikacje mają uzasadnione przypadki użycia interfejsów spoza pakietu SDK. Jeśli nie możesz znaleźć alternatywy dla interfejsu spoza pakietu SDK w przypadku funkcji w aplikacji, poproś o nowy publiczny interfejs API.

Więcej informacji o zmianach w tej wersji Androida znajdziesz w artykule Aktualizacje ograniczeń interfejsów innych niż SDK w Androidzie 11. Więcej informacji o interfejsach spoza pakietu SDK znajdziesz w artykule Ograniczenia dotyczące interfejsów spoza pakietu SDK.

Usunięto bibliotekę udostępnioną Mapy w wersji 1

Wersja 1 biblioteki udostępnionej Map została całkowicie usunięta w Androidzie 11. Ta biblioteka została wcześniej wycofana i przestała działać w aplikacjach na Androidzie 10. Aplikacje, które wcześniej korzystały z tej biblioteki współdzielonej na urządzeniach z Androidem 9 (API na poziomie 28) lub starszym, powinny zamiast tego używać Maps SDK na Androida.

Interakcja z innymi aplikacjami

Udostępnianie identyfikatorów URI treści

Jeśli Twoja aplikacja udostępnia identyfikator URI treści innej aplikacji, intencja musi przyznawać uprawnienia dostępu do identyfikatora URI przez ustawienie co najmniej jednej z tych flag intencji: FLAG_GRANT_READ_URI_PERMISSION i FLAG_GRANT_WRITE_URI_PERMISSION. Dzięki temu, jeśli druga aplikacja jest przeznaczona na Androida 11, nadal będzie miała dostęp do identyfikatora URI treści. Aplikacja musi zawierać flagi intencji, nawet jeśli identyfikator URI treści jest powiązany z mechanizmem dostarczania treści, który nie należy do Twojej aplikacji.

Jeśli Twoja aplikacja jest właścicielem mechanizmu dostarczania treści powiązanego z identyfikatorem URI treści, sprawdź, czy mechanizm dostarczania treści nie jest eksportowany. Zalecamy już stosowanie tej sprawdzonej metody dotyczącej bezpieczeństwa.

Wczytuję bibliotekę

Wczytywanie wspólnej biblioteki ICU ze ścieżką bezwzględną

Aplikacje kierowane na interfejs API na poziomie 28 lub niższym nie mogą używać dlopen(3) do wczytywania libicuuc ze ścieżką bezwzględną „/system/lib/libicuuc.so”. W przypadku tych aplikacji dlopen("/system/lib/libicuuc.so", ...) zwróci pusty uchwyt.

Aby załadować bibliotekę, użyj jej nazwy jako nazwy pliku, na przykład dlopen("libicuuc.so", ...).