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, gdy działają one na Androidzie 11, niezależnie od targetSdkVersion. W razie potrzeby przetestuj aplikację i zmodyfikuj ją, aby prawidłowo obsługiwała te funkcje.

Zapoznaj się też z listą zmian w zachowaniu, które dotyczą tylko aplikacji kierowanych na Androida 11.

Prywatność

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

  • Jednorazowe zezwolenia: dają użytkownikom możliwość przyznania tymczasowego dostępu do uprawnień związanych z lokalizacją, mikrofonem i aparatem.
  • Widoczność okna uprawnień: wielokrotne odrzucanie prośby o uprawnienia oznacza „nie pytaj ponownie”.
  • Audyt dostępu do danych: uzyskuj informacje o tym, gdzie aplikacja uzyskuje dostęp do danych prywatnych – zarówno w swoim kodzie, jak i w kodzie bibliotek zależnych.
  • Uprawnienia okna alertu systemowego: niektóre klasy aplikacji automatycznie otrzymują uprawnienie SYSTEM_ALERT_WINDOW na żądanie. Intencje, które zawierają działanie intencji ACTION_MANAGE_OVERLAY_PERMISSION, zawsze przenoszą użytkowników na ekran w ustawieniach systemu.
  • Trwałe identyfikatory karty SIM: na Androidzie 11 i nowszych dostęp do identyfikatorów ICCID, których nie można zresetować, za pomocą metody getIccId() jest ograniczony. Metoda zwraca niepusty, pusty ciąg znaków. Aby jednoznacznie zidentyfikować zainstalowaną kartę SIM na urządzeniu, użyj metody getSubscriptionId(). Identyfikator subskrypcji zawiera wartość indeksu (zaczynającą się od 1), która jednoznacznie identyfikuje zainstalowane karty SIM, w tym fizyczne i elektroniczne. 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 uruchamiać aplikacje do powiadomień o narażeniu na kontakt na urządzeniach z Androidem 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 korzystające z niego nie mogą określać lokalizacji urządzenia za pomocą skanowania Bluetooth.

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

Bezpieczeństwo

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

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

Scudo Hardened Allocator

Android 11 wewnętrznie używa wzmocnionego alokatora Scudo do obsługi alokacji sterty. Scudo potrafi wykrywać i niwelować niektóre rodzaje naruszeń bezpieczeństwa pamięci. Jeśli w raportach o awariach natywnych widzisz awarie związane ze Scudo (np. Scudo ERROR:), zapoznaj się z dokumentacją rozwiązywania problemów ze Scudo.

Statystyki użycia aplikacji

Aby lepiej chronić użytkowników, Android 11 przechowuje statystyki korzystania z aplikacji przez każdego użytkownika w zaszyfrowanym za pomocą danych logowania. Dlatego ani system, ani żadne aplikacje nie mają dostępu do tych danych, chyba że funkcja isUserUnlocked() zwróci wartość true. Dzieje się to 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 tego obiektu po odblokowaniu urządzenia przez użytkownika. W przeciwnym razie interfejs API zwraca teraz wartości null lub puste.

Obsługa emulatora w przypadku sieci 5G

Android 11 zawiera interfejsy API 5G, które umożliwiają dodawanie do aplikacji najnowocześniejszych funkcji. Aby przetestować funkcje podczas ich dodawania, możesz użyć nowych możliwości emulatora pakietu Android SDK. Nowa funkcja została dodana w emulatorze w wersji 30.0.22. Wybranie ustawienia sieci 5G powoduje zmianę wartości TelephonyDisplayInfo na OVERRIDE_NETWORK_TYPE_NR_NSA, modyfikuje szacowaną przepustowość i umożliwia ustawienie pomiaru, aby sprawdzić, czy aplikacja odpowiednio reaguje na zmiany stanu NET_CAPABILITY_TEMPORARILY_NOT_METERED.

Skuteczność i debugowanie

Debugowanie limitów wywołań interfejsu JobScheduler API

Android 11 oferuje obsługę debugowania aplikacji, aby identyfikować potencjalne wywołania interfejsu JobScheduler API, które przekroczyły określone limity szybkości. Deweloperzy mogą używać tej funkcji do wykrywania potencjalnych problemów z wydajnością. W przypadku aplikacji, w których atrybut manifestu debuggable ma wartość true, wywołania interfejsu API JobScheduler przekraczające limity częstotliwości będą zwracać wartość RESULT_FAILURE. Limity są ustawione tak, aby nie wpływały na uzasadnione przypadki użycia.

Sanitizer deskryptorów plików (fdsan)

W Androidzie 10 wprowadzono fdsan (narzędzie do czyszczenia deskryptorów plików). fdsan wykrywa nieprawidłowe zarządzanie własnością deskryptora pliku, np. użycie po zamknięciu lub podwójne zamknięcie. W Androidzie 11 zmienia się domyślny tryb fdsan. 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 z powodu fdsan, zapoznaj się z fdsan documentation.

Ograniczenia interfejsu innego niż SDK

Android 11 zawiera zaktualizowane listy ograniczonych interfejsów innych niż SDK, które powstały w wyniku współpracy z programistami Androida i najnowszych testów wewnętrznych. W miarę możliwości przed ograniczeniem interfejsów innych niż SDK udostępniamy 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 SDK (w zależności od docelowego poziomu interfejsu API aplikacji), ale korzystanie z dowolnej metody lub pola spoza SDK zawsze wiąże się z wysokim ryzykiem awarii aplikacji.

Jeśli nie masz pewności, czy Twoja aplikacja używa interfejsów innych niż SDK, możesz to sprawdzić, testując ją. Jeśli Twoja aplikacja korzysta z interfejsów spoza SDK, zacznij planować migrację na alternatywne rozwiązania SDK. Rozumiemy jednak, że w przypadku niektórych aplikacji używanie interfejsów innych niż SDK jest uzasadnione. Jeśli nie możesz znaleźć alternatywy dla używania interfejsu innego niż 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 innych niż SDK znajdziesz w artykule Ograniczenia dotyczące interfejsów innych niż SDK.

Usunięcie biblioteki udostępnionej Map Google w wersji 1

W Androidzie 11 biblioteka udostępniona Map w wersji 1 została całkowicie usunięta. 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 (poziom API 28) lub starszym, powinny zamiast tego używać pakietu SDK Map Google na Androida.

Interakcje 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 jednego z tych flag intencji: FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION. Dzięki temu, jeśli inna aplikacja jest przeznaczona na Androida 11, nadal będzie mogła uzyskać dostęp do identyfikatora URI treści. Flagi intencji muszą być uwzględnione w aplikacji nawet wtedy, gdy identyfikator URI treści jest powiązany z dostawcą treści, który nie jest własnością aplikacji.

Jeśli Twoja aplikacja jest właścicielem dostawcy treści powiązanego z identyfikatorem URI treści, sprawdź, czy dostawca treści nie jest eksportowany. Zalecamy już tę sprawdzoną metodę dotyczącą bezpieczeństwa.

Wczytuję bibliotekę

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

Aplikacje kierowane na interfejs API w wersji 28 lub starszej nie mogą używać funkcji 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 uchwyt o wartości null.

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