Zmiany w działaniu: aplikacje kierowane na Androida 11

Podobnie jak w poprzednich wersjach Android 11 zawiera zmiany w działaniu aplikacji, które mogą mieć wpływ na Twoją aplikację. Poniższe zmiany w działaniu dotyczą tylko aplikacji kierowanych na Androida 11 lub nowszego. Jeśli Twoja aplikacja ustawia targetSdkVersion na 30, zmodyfikuj aplikację, aby w razie potrzeby prawidłowo obsługiwała te zachowania.

Zapoznaj się też z listą zmian w działaniu, które wpływają na wszystkie aplikacje na Androidzie 11.

Prywatność

Android 11 wprowadza zmiany i ograniczenia mające na celu zwiększenie prywatności użytkowników. Oto niektóre z nich:

  • Wymuszanie zakresu miejsca na dane: dostęp do zewnętrznych katalogów pamięci masowej jest ograniczony do katalogu danej aplikacji i utworzonych przez nią typów multimediów.
  • Automatyczne resetowanie uprawnień: jeśli użytkownicy nie korzystają z aplikacji przez kilka miesięcy, system automatycznie resetuje wrażliwe uprawnienia aplikacji.
  • Dostęp do lokalizacji w tle:aby przyznać aplikacjom dostęp do lokalizacji w tle, użytkownicy muszą być przekierowywani do ustawień systemu.
  • Widoczność pakietów: gdy aplikacja wysyła zapytanie o listę aplikacji zainstalowanych na urządzeniu, zwrócona lista jest filtrowana.

Więcej informacji znajdziesz na stronie Prywatność.

Zabezpieczenia

Tagowanie wskaźnika sterty

Szczegóły zmian

Zmiana nazwy: NATIVE_HEAP_POINTER_TAGGING

Zmień identyfikator: 135754954

Jak przełączać

Jeśli testujesz zgodność aplikacji z Androidem 11, możesz włączyć lub wyłączyć tę zmianę, używając tych poleceń ADB:

adb shell am compat enable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
adb shell am compat disable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME

Więcej informacji o platformie zgodności i przełączanie zmian znajdziesz w artykule o testowaniu i debugowaniu zmian w działaniu platformy w aplikacji.

Wskaźniki sterty mają teraz tag o wartości innej niż 0 w najbardziej znaczącym bajcie (MSB). Aplikacje, które nieprawidłowo używają wskaźników, w tym te, które modyfikują MSB, mogą teraz ulegać awariom lub napotkać inne problemy. Ta zmiana jest niezbędna, aby zapewnić obsługę przyszłego sprzętu z włączonym rozszerzeniem ARM Memory Tagging Extension (MTE). Więcej informacji znajdziesz w sekcji Otagowane wskaźniki.

Aby wyłączyć tę funkcję, zapoznaj się z dokumentacją allowNativeHeapPointerTagging w pliku manifestu.

Aktualizacje powiadomień

Niestandardowe powiadomienia z tle są blokowane

Ze względów bezpieczeństwa i w trosce o wygodę użytkowników system blokuje powiadomienia zawierające widoki niestandardowe, jeśli są one wysyłane w tle przez aplikację kierowaną na Androida 11 lub nowszego. Pamiętaj, że powiadomienia tekstowe są nadal dozwolone. Są to powiadomienia utworzone za pomocą funkcji Toast.makeText(), które nie wywołują setView().

Jeśli aplikacja mimo to próbuje opublikować toast z widokiem niestandardowym w tle, system nie wyświetli go użytkownikowi. Zamiast tego system rejestruje w logcat ten komunikat:

W/NotificationService: Blocking custom toast from package \
  <package> due to package not in the foreground

Wywołania zwrotne

Jeśli chcesz otrzymywać powiadomienia, gdy pojawi się lub zniknie powiadomienie (tekstowe lub niestandardowe), użyj metody addCallback() dodanej w Androidzie 11.

Zmiany interfejsu API powiadomień tekstowych

Aplikacje kierowane na Androida 11 lub nowszego mogą zaobserwować te efekty uboczne powiadomień tekstowych:

Połączenia

Ograniczony dostęp z możliwością odczytu do bazy danych APN

Szczegóły zmian

Zmiana nazwy: APN_READING_PERMISSION_CHANGE_ID

Zmień identyfikator: 124107808

Jak przełączać

Jeśli testujesz zgodność aplikacji z Androidem 11, możesz włączyć lub wyłączyć tę zmianę, używając tych poleceń ADB:

adb shell am compat enable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME
adb shell am compat disable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME

Więcej informacji o platformie zgodności i przełączanie zmian znajdziesz w artykule o testowaniu i debugowaniu zmian w działaniu platformy w aplikacji.

Aplikacje kierowane na Androida 11 wymagają teraz uprawnień Manifest.permission.WRITE_APN_SETTINGS do odczytu bazy danych APN dostawcy usług telefonicznych i uzyskiwania do niej dostępu. Próba uzyskania dostępu do bazy danych APN bez tego uprawnienia spowoduje wygenerowanie wyjątku od zabezpieczeń.

Ułatwienia dostępu

Zadeklarowanie interakcji z mechanizmami zamiany tekstu na mowę w pliku manifestu

Ze względu na zmiany w widoczności pakietu aplikacje kierowane na Androida 11 i korzystające z mechanizmu zamiany tekstu na mowę muszą dodać do plików manifestu ten element <queries>:

<queries>
  <intent>
    <action
       android:name="android.intent.action.TTS_SERVICE" />
  </intent>
</queries>

Deklarowanie użycia przycisku ułatwień dostępu w pliku metadanych

Szczegóły zmian

Zmiana nazwy: REQUEST_ACCESSIBILITY_BUTTON_CHANGE

Zmień identyfikator: 136293963

Jak przełączać

Jeśli testujesz zgodność aplikacji z Androidem 11, możesz włączyć lub wyłączyć tę zmianę, używając tych poleceń ADB:

adb shell am compat enable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME
adb shell am compat disable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME

Więcej informacji o platformie zgodności i przełączanie zmian znajdziesz w artykule o testowaniu i debugowaniu zmian w działaniu platformy w aplikacji.

Począwszy od Androida 11 usługa ułatwień dostępu nie może deklarować w czasie działania aplikacji, że ma powiązanie z systemowym przyciskiem ułatwień dostępu. Jeśli dołączysz AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON do właściwości flags obiektu AccessibilityServiceInfo, platforma nie przekaże do Twojej usługi zdarzeń wywołania zwrotnego przycisku ułatwień dostępu.

Aby otrzymywać zdarzenia wywołań zwrotnych ułatwień dostępu w usłudze ułatwień dostępu, użyj pliku metadanych usługi ułatwień dostępu i zadeklaruj powiązanie usługi z przyciskiem ułatwień dostępu. Umieść wartość flagRequestAccessibilityButton w swojej definicji atrybutu accessibilityFlags. Częstą lokalizacją pliku metadanych usługi ułatwień dostępu jest res/raw/accessibilityservice.xml.

Aparat

Działania związane z intencją multimediów wymagają domyślnego aparatu systemu

Począwszy od Androida 11 tylko wstępnie zainstalowane systemowe aplikacje aparatu mogą reagować na te działania intencji:

Jeśli dostępna jest więcej niż 1 zainstalowana fabrycznie aplikacja aparatu systemowego, system wyświetla okno, w którym użytkownik może wybrać aplikację. Jeśli chcesz, aby aplikacja używała konkretnej aplikacji aparatu innej firmy do robienia zdjęć i filmów w jej imieniu, możesz określić te intencje, określając nazwę pakietu lub komponent.

Opakowanie i instalacja aplikacji

Skompresowane pliki zasobów

Szczegóły zmian

Zmiana nazwy: RESOURCES_ARSC_COMPRESSED

Zmień identyfikator: 132742131

Jak przełączać

Jeśli testujesz zgodność aplikacji z Androidem 11, możesz włączyć lub wyłączyć tę zmianę, używając tych poleceń ADB:

adb shell am compat enable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME
adb shell am compat disable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME

Więcej informacji o platformie zgodności i przełączanie zmian znajdziesz w artykule o testowaniu i debugowaniu zmian w działaniu platformy w aplikacji.

Aplikacji kierowanych na Androida 11 (poziom interfejsu API 30) lub nowszego nie można instalować, jeśli zawierają skompresowany plik resources.arsc lub ten plik nie jest wyrównany na 4-bajtowej granicy. System nie może zmapować tego pliku w pamięci, jeśli występuje jeden z tych warunków. Tabele zasobów, których nie można mapować w pamięci, muszą być odczytywane w buforze w ramach pamięci RAM, co powoduje niepotrzebne obciążenie pamięci i znacznie zwiększone wykorzystanie pamięci RAM przez urządzenie.

Jeśli wcześniej był używany skompresowany plik resources.arsc, wypróbuj alternatywne strategie, takie jak zmniejszanie zasobów aplikacji lub inne metody zmniejszania, zaciemniania i optymalizowania aplikacji.

Teraz wymagany schemat podpisu pliku APK w wersji 2

Aplikacje kierowane na Androida 11 (poziom interfejsu API 30), które są obecnie podpisane tylko z użyciem schematu podpisu pliku APK w wersji 1, muszą teraz być też podpisane przy użyciu schematu podpisu pliku APK w wersji 2 lub nowszej. Użytkownicy nie mogą instalować ani aktualizować aplikacji podpisanych tylko przy użyciu schematu podpisu w wersji 1 pliku APK na urządzeniach z Androidem 11.

Aby sprawdzić, czy aplikacja jest podpisana za pomocą schematu podpisu plików APK w wersji 2 lub nowszej, możesz użyć Android Studio lub narzędzia apksigner w wierszu poleceń.

Firebase

Firebase JobDispatcher i GCMNetworkManager

Jeśli Twoja aplikacja jest kierowana na interfejs API na poziomie 30 lub wyższym, wywołania interfejsu Firebase JobDispatcher i GcmNetworkManager API są wyłączone na urządzeniach z Androidem 6.0 (poziom interfejsu API 23) lub nowszym. Informacje o migracji znajdziesz w sekcjach Migracja z Firebase JobDispatcher do WorkManager i Migracja z GCMNetworkManager do WorkManager.

Rozpoznawanie mowy

Ze względu na zmiany w widoczności pakietów aplikacje kierowane na Androida 11 i korzystające z usługi rozpoznawania mowy muszą dodać do plików manifestu ten element <queries>:

<queries>
  <intent>
    <action
       android:name="android.speech.RecognitionService" />
  </intent>
</queries>

Zmiany wywołań zwrotnych dla OnSharedPreferenceChangeListener

Szczegóły zmian

Zmiana nazwy: CALLBACK_ON_CLEAR_CHANGE

Zmień identyfikator: 119147584

Jak przełączać

Jeśli testujesz zgodność aplikacji z Androidem 11, możesz włączyć lub wyłączyć tę zmianę, używając tych poleceń ADB:

adb shell am compat enable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME
adb shell am compat disable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME

Więcej informacji o platformie zgodności i przełączanie zmian znajdziesz w artykule o testowaniu i debugowaniu zmian w działaniu platformy w aplikacji.

W przypadku aplikacji kierowanych na Androida 11 (poziom interfejsu API 30) każde wywołanie Editor.clear powoduje teraz wywołanie zwrotne do OnSharedPreferenceChangeListener.onSharedPreferenceChanged z kluczem null.

Ograniczenia interfejsu spoza SDK

Android 11 zawiera zaktualizowane listy ograniczonych interfejsów spoza pakietu SDK przygotowane na podstawie współpracy z deweloperami aplikacji na Androida i najnowszych testów wewnętrznych. W miarę możliwości dbamy o to, aby dostępne były publiczne alternatywy, zanim ograniczymy dostęp do interfejsów innych niż SDK.

Jeśli Twoja aplikacja nie jest kierowana na Androida 11, niektóre z tych zmian mogą nie od razu Cię dotyczyć. Mimo że obecnie można korzystać z niektórych interfejsów innych niż SDK (w zależności od docelowego poziomu interfejsu API aplikacji), 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 korzysta z interfejsów innych niż SDK, możesz to przetestować. Jeśli Twoja aplikacja wymaga interfejsów innych niż SDK, zacznij planować migrację na alternatywne wersje pakietów SDK. Zdajemy sobie jednak sprawę, że niektóre aplikacje mogą prawidłowo korzystać z interfejsów innych niż SDK. Jeśli nie możesz znaleźć w swojej aplikacji interfejsu innego niż interfejs SDK, musisz poprosić o nowy publiczny interfejs API.

Więcej informacji o zmianach wprowadzonych w tej wersji Androida znajdziesz w artykule Aktualizacje ograniczeń interfejsu 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.