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 intencjiACTION_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 metodygetSubscriptionId()
. 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_PERMISSION
i FLAG_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", ...)
.