Zmiany w działaniu: wszystkie aplikacje

Platforma Android 11 zawiera zmiany zachowania, które mogą mieć wpływ na Twoją aplikację. Te zmiany zachowania dotyczą wszystkich aplikacji, gdy działają na Androidzie 11, niezależnie od targetSdkVersion. Należy przetestować aplikację, a w razie potrzeby zmodyfikować ją tak, aby spełniała te wymagania.

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

Prywatność

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

  • Jednorazowe zezwolenia: użytkownicy mogą zezwolić na tymczasowy dostęp do lokalizacji, mikrofonu i aparatu.
  • Widoczność okna z prośbą o przyznanie uprawnień: wielokrotne odmowy przyznania uprawnień oznaczają „nie pytaj ponownie”.
  • Sprawdzanie dostępu do danych: uzyskaj informacje o tym, gdzie aplikacja uzyskuje dostęp do danych prywatnych, zarówno w kodzie aplikacji, jak i w kodzie bibliotek zależnych.
  • Uprawnienia dla okna alertu systemowego: niektóre klasy aplikacji automatycznie otrzymują uprawnienia SYSTEM_ALERT_WINDOW na żądanie. Ponadto intencje obejmujące działanie intencyjne ACTION_MANAGE_OVERLAY_PERMISSION zawsze prowadzą użytkowników do ekranu w ustawieniach systemu.
  • Stały identyfikator karty SIM: w Androidzie 11 i nowszych dostęp do stałych identyfikatorów ICCID 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) umożliwiającą jednoznaczne identyfikowanie zainstalowanych kart SIM, w tym kart fizycznych i elektronicznych. Wartość tego identyfikatora jest stabilna dla danej karty SIM, chyba że urządzenie zostało zresetowane do ustawień fabrycznych.

Więcej informacji znajdziesz na stronie Prywatność.

Powiadomienia o narażeniu na kontakt

Android 11 aktualizuje platformę z uwzględnieniem systemu powiadomień o narażeniu na kontakt. Użytkownicy mogą teraz uruchamiać aplikacje powiadomień o narażeniu na kontakt na Androidzie 11 bez konieczności włączania ustawienia lokalizacji urządzenia. Jest to wyjątek tylko w przypadku systemu powiadomień o narażeniu na kontakt, ponieważ został on zaprojektowany w taki sposób, aby aplikacje z jego użyciem nie mogły określać lokalizacji urządzenia przez skanowanie Bluetooth.

Ze względu na ochronę prywatności użytkowników wszystkie inne aplikacje nadal nie mogą skanować Bluetooth, chyba że włączona jest lokalizacja urządzenia i użytkownik udzielił im uprawnień do lokalizacji. Więcej informacji znajdziesz w poście Informacje o powiadomieniach o narażeniu na kontakt.

Bezpieczeństwo

Domyślnie gniazda SSL używają mechanizmu SSL Conscrypt

Domyślna implementacja SSLSocket na Androidzie opiera się na Conscrypt. Od Androida 11 ta implementacja jest wewnętrznie budowana na podstawie SSLEngine Conscrypt.

Allocator Scudo Hardened

Android 11 używa wewnętrznie Scudo Hardened Allocator do obsługi alokacji pamięci. Scudo może wykrywać i niwelować niektóre rodzaje naruszeń zasad bezpieczeństwa pamięci. Jeśli w rodzajowych raportach o awariach widzisz awarie związane z Scudo (np. Scudo ERROR:), zapoznaj się z dokumentacją Rozwiązywanie problemów ze Scudo.

Statystyki użytkowania aplikacji

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

Obsługa 5G w emulatorze

Android 11 zawiera interfejsy API 5G, które umożliwiają dodawanie do aplikacji najnowocześniejszych funkcji. Aby testować funkcje po ich dodaniu, możesz korzystać z nowych możliwości Android SDK emulatora. Nowa funkcja została dodana w wersji 30.0.22 emulatora. Wybranie ustawienia sieci 5G ustawi TelephonyDisplayInfo na OVERRIDE_NETWORK_TYPE_NR_NSA, zmieni szacowaną przepustowość i umożliwi ustawienie taryfowania, aby sprawdzić, czy aplikacja reaguje odpowiednio na zmiany stanu NET_CAPABILITY_TEMPORARILY_NOT_METERED.

Wydajność i debugowanie

Debugowanie limitów wywołań interfejsu JobScheduler API

Android 11 oferuje obsługę debugowania aplikacji, aby umożliwić identyfikację potencjalnych wywołań JobScheduler interfejsu API, które przekroczyły określone limity szybkości. Deweloperzy mogą korzystać z tej funkcji, aby wykrywać potencjalne problemy z wydajnością. W przypadku aplikacji, w których atrybut pliku manifestu debuggable ma wartość true, JobScheduler wywołania interfejsu API, które przekraczają limity częstotliwości, zwracają wartość RESULT_FAILURE. Limity są ustawiane w taki sposób, aby nie wpływać na uzasadnione przypadki użycia.

Dezynfektor deskryptorów plików (fdsan)

Android 10 wprowadził fdsan (oczyszczanie deskryptorów plików). fdsan wykrywa nieprawidłowe obchodzenie się z własnością opisu pliku, na przykład użycie po zamknięciu i podwójne zamknięcie. Domyślny tryb aplikacji fdsan zmienia się w Androidzie 11. Funkcja fdsan jest teraz przerywana po wykryciu błędu. Wcześniejsze zachowanie polegało na zapisaniu ostrzeżenia i kontynuowaniu. Jeśli aplikacja ulega awarii z powodu fdsan, zapoznaj się z artykułem fdsan documentation.

Ograniczenia interfejsu innego niż SDK

Android 11 zawiera zaktualizowane listy ograniczonych interfejsów innych niż SDK, które zostały opracowane we współpracy z deweloperami Androida i na podstawie najnowszych testów wewnętrznych. Zawsze, gdy to możliwe, sprawdzamy, czy dostępne są publiczne alternatywy, zanim zaczniemy ograniczać interfejsy inne niż SDK.

Jeśli Twoja aplikacja nie jest kierowana na Androida 11, niektóre z tych zmian mogą nie mieć na nią wpływu od razu. Obecnie możesz używać niektórych interfejsów spoza pakietu SDK (w zależności od docelowego poziomu interfejsu API aplikacji), ale korzystanie z metod lub pól spoza pakietu 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 przetestować ją, aby się tego dowiedzieć. Jeśli Twoja aplikacja korzysta z interfejsów spoza pakietu SDK, zaplanuj migrację na alternatywy dla pakietu SDK. Zdajemy sobie jednak sprawę, że w niektórych przypadkach interfejsy inne niż SDK mogą być przydatne. Jeśli nie możesz znaleźć alternatywy dla interfejsu spoza pakietu SDK, który jest używany w funkcji Twojej aplikacji, poproś o nowy publiczny interfejs API.

Więcej informacji o zmianach w tej wersji Androida znajdziesz w artykule Zmiany ograniczeń interfejsu niebędącego interfejsem pakietu SDK w Androidzie 11. Więcej informacji o interfejsach innych niż SDK znajdziesz w artykule Ograniczenia interfejsów innych niż SDK.

Usunięcie biblioteki wspólnej Map w wersji 1

Wersja 1. biblioteki udostępnionej Map została całkowicie usunięta w Androidzie 11. Ta biblioteka została wycofana i przestała działać w przypadku aplikacji na Androida 10. Aplikacje, które wcześniej korzystały z tej wspólnej biblioteki na urządzeniach z Androidem 9 (poziom interfejsu API 28) lub niższym, powinny zamiast tego używać pakietu SDK Map 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 kierowana na Androida 11, nadal może uzyskać dostęp do URI treści. Aplikacja musi zawierać flagi intencji, nawet jeśli identyfikator URI treści jest powiązany z dostawcą treści, którego aplikacja nie jest właścicielem.

Jeśli Twoja aplikacja jest właścicielem dostawcy treści powiązanego z URI treści, sprawdź, czy dostawca treści nie został wyeksportowany. Zalecamy już stosowanie tej sprawdzonej metody dotyczącej zabezpieczeń.

Wczytywanie biblioteki

Wczytywanie wspólnej biblioteki ICU za pomocą ścieżki bezwzględnej

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

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