Zmiany w działaniu: aplikacje kierowane na Androida 11

Podobnie jak w przypadku poprzednich wersji Androida, w Androidzie 11 wprowadziliśmy zmiany w działaniu, które mogą mieć wpływ na Twoją aplikację. Poniższe zmiany w działaniu dotyczą wyłącznie aplikacji kierowanych na Androida 11 lub nowszego. Jeśli Twoja aplikacja ustawia wartość targetSdkVersion na 30, zmodyfikuj ją, aby w odpowiednich przypadkach prawidłowo obsługiwała te działania.

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

Prywatność

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

Więcej informacji znajdziesz na stronie Prywatność.

Bezpieczeństwo

Tagowanie wskaźników sterty

Szczegóły zmian

Zmień nazwę: NATIVE_HEAP_POINTER_TAGGING

Identyfikator zmiany: 135754954

Jak przełączać

Podczas testowania zgodności aplikacji z Androidem 11 możesz włączać i wyłączać tę zmianę za pomocą 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 systemie sprawdzania zgodności i przełączaniu zmian znajdziesz w artykule Testowanie i debugowanie zmian w działaniu platformy w aplikacji.

Wskaźniki sterty mają teraz niezerowy tag w najbardziej znaczącym bajcie (MSB). Aplikacje, które nieprawidłowo używają wskaźników, w tym te, które modyfikują starszy bit, mogą teraz ulegać awariom lub powodować inne problemy. Ta zmiana jest konieczna, aby obsługiwać przyszłe urządzenia z włączonym rozszerzeniem Memory Tagging Extension (MTE) na architekturze ARM. Więcej informacji znajdziesz w artykule Tagged Pointers.

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

Zmiany w powiadomieniach

Niestandardowe powiadomienia z tła są blokowane

Ze względów bezpieczeństwa i w celu zapewnienia użytkownikom komfortu system blokuje wysyłane w tle przez aplikacje kierowane na Androida 11 lub nowszego komunikaty typu „toast” zawierające widoki niestandardowe. Pamiętaj, że dymki tekstowe są nadal dozwolone. Są to dymki utworzone za pomocą Toast.makeText(), które nie wywołują setView().

Jeśli aplikacja spróbuje mimo to opublikować w tle powiadomienie typu toast zawierające widok niestandardowy, system nie wyświetli tego komunikatu użytkownikowi. Zamiast tego system rejestruje w logcat następujący komunikat:

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

Wywołania zwrotne dotyczące powiadomień

Jeśli chcesz otrzymywać powiadomienia o wyświetlaniu lub zamykaniu wyskakujących okienek (tekstowych lub niestandardowych), użyj metody addCallback(), która została dodana w Androidzie 11.

Zmiany w interfejsie API powiadomień tekstowych

W przypadku aplikacji kierowanych na Androida 11 lub nowszego występują te efekty uboczne w przypadku toastów tekstowych:

Łączność

Ograniczony dostęp do odczytu bazy danych APN

Szczegóły zmian

Zmień nazwę: APN_READING_PERMISSION_CHANGE_ID

Identyfikator zmiany: 124107808

Jak przełączać

Podczas testowania zgodności aplikacji z Androidem 11 możesz włączać i wyłączać tę zmianę za pomocą 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 systemie sprawdzania zgodności i przełączaniu zmian znajdziesz w artykule Testowanie i debugowanie zmian w działaniu platformy w aplikacji.

Aplikacje kierowane na Androida 11 wymagają teraz uprawnienia Manifest.permission.WRITE_APN_SETTINGS z poziomu uprzywilejowanego, aby odczytywać lub uzyskiwać dostęp do bazy danych APN dostawcy telefonii. Próba uzyskania dostępu do bazy danych APN bez tego uprawnienia spowoduje wyjątek związany z bezpieczeństwem.

Ułatwienia dostępu

Deklarowanie interakcji z silnikami TTS w pliku manifestu

Ze względu na zmiany w widoczności pakietów aplikacje, które są przeznaczone na Androida 11 i korzystają z silnika 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

Zmień nazwę: REQUEST_ACCESSIBILITY_BUTTON_CHANGE

Identyfikator zmiany: 136293963

Jak przełączać

Podczas testowania zgodności aplikacji z Androidem 11 możesz włączać i wyłączać tę zmianę za pomocą 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 systemie sprawdzania zgodności i przełączaniu zmian znajdziesz w artykule Testowanie i debugowanie zmian w działaniu platformy w aplikacji.

Od Androida 11 usługa ułatwień dostępu nie może deklarować w czasie działania, że jest powiązana z systemowym przyciskiem ułatwień dostępu. Jeśli do właściwości flags obiektu AccessibilityServiceInfo dodasz AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON, platforma nie będzie przekazywać do Twojej usługi zdarzeń wywołania zwrotnego przycisku ułatwień dostępu.

Aby otrzymywać w usłudze ułatwień dostępu zdarzenia wywołania zwrotnego ułatwień dostępu, użyj pliku metadanych usługi ułatwień dostępu, aby zadeklarować powiązanie usługi z przyciskiem ułatwień dostępu. W definicji atrybutu accessibilityFlags uwzględnij wartość flagRequestAccessibilityButton. Typowa lokalizacja pliku metadanych usługi ułatwień dostępu to res/raw/accessibilityservice.xml.

Aparat

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

Od Androida 11 tylko wstępnie zainstalowane aplikacje aparatu systemowego mogą odpowiadać na te działania intencji:

Jeśli dostępnych jest więcej niż jedna wstępnie zainstalowana aplikacja systemowa aparatu, system wyświetli okno dialogowe, w którym użytkownik może wybrać aplikację. Jeśli chcesz, aby Twoja aplikacja używała konkretnej aplikacji aparatu innej firmy do robienia zdjęć lub nagrywania filmów w jej imieniu, możesz ustawić te intencje w sposób jawny, podając nazwę pakietu lub komponentu dla intencji.

Pakowanie i instalowanie aplikacji

Skompresowane pliki zasobów

Szczegóły zmian

Zmień nazwę: RESOURCES_ARSC_COMPRESSED

Identyfikator zmiany: 132742131

Jak przełączać

Podczas testowania zgodności aplikacji z Androidem 11 możesz włączać i wyłączać tę zmianę za pomocą 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 systemie sprawdzania zgodności i przełączaniu zmian znajdziesz w artykule Testowanie i debugowanie zmian w działaniu platformy w aplikacji.

Aplikacji kierowanych na Androida 11 (poziom interfejsu API 30) lub nowszego nie można zainstalować, jeśli zawierają skompresowany plik resources.arsc lub jeśli ten plik nie jest wyrównany do granicy 4-bajtowej. System nie może mapować tego pliku w pamięci, jeśli wystąpi którykolwiek z tych warunków. Tabel zasobów, których nie można mapować w pamięci, nie można odczytać do bufora w pamięci RAM, co powoduje niepotrzebne obciążenie pamięci systemu i znaczne zwiększenie wykorzystania pamięci RAM na urządzeniu.

Jeśli wcześniej używasz skompresowanego pliku resources.arsc, spróbuj innych strategii, np. zmniejszania zasobów aplikacji lub innych metod zmniejszania, zaciemniania i optymalizowania aplikacji.

Schemat podpisywania plików APK w wersji 2 jest teraz wymagany

Aplikacje, których docelowy poziom interfejsu API to Android 11 (poziom API 30) i które są obecnie podpisywane tylko przy użyciu schematu podpisu APK w wersji 1, muszą być teraz podpisywane również przy użyciu schematu podpisu APK w wersji 2 lub nowszej. Użytkownicy nie mogą instalować ani aktualizować aplikacji podpisanych tylko przy użyciu schematu podpisu APK w wersji 1 na urządzeniach z Androidem 11.

Aby sprawdzić, czy aplikacja jest podpisana przy użyciu schematu podpisywania plików APK w wersji 2 lub nowszej, możesz użyć Androida 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 interfejsów API Firebase JobDispatcher i GcmNetworkManager są wyłączone na urządzeniach z Androidem 6.0 (poziom interfejsu API 23) lub nowszym. Informacje o migracji znajdziesz w artykułach Migracja z Firebase JobDispatcher do WorkManageraMigracja z GCMNetworkManager do WorkManagera.

Rozpoznawanie mowy

Ze względu na zmiany w widoczności pakietu aplikacje, które są przeznaczone na Androida 11 i korzystają 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łania zwrotnego w przypadku OnSharedPreferenceChangeListener

Szczegóły zmian

Zmień nazwę: CALLBACK_ON_CLEAR_CHANGE

Identyfikator zmiany: 119147584

Jak przełączać

Podczas testowania zgodności aplikacji z Androidem 11 możesz włączać i wyłączać tę zmianę za pomocą 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 systemie sprawdzania zgodności i przełączaniu zmian znajdziesz w artykule Testowanie i debugowanie zmian w działaniu platformy w aplikacji.

W przypadku aplikacji kierowanych na Androida 11 (poziom API 30) za każdym razem, gdy wywoływana jest funkcja Editor.clear, wywoływane jest teraz wywołanie zwrotne do funkcji OnSharedPreferenceChangeListener.onSharedPreferenceChanged z kluczem null.

Ograniczenia dotyczące interfejsu innego niż SDK

Android 11 zawiera zaktualizowane listy ograniczonych interfejsów innych niż SDK, które powstały na podstawie współpracy z deweloperami Androida i najnowszych testów wewnętrznych. Zanim ograniczymy interfejsy inne niż SDK, w miarę możliwości 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ć. 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 istnieją uzasadnione przypadki użycia interfejsów innych niż SDK. 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ń interfejsu innego niż SDK w Androidzie 11. Więcej informacji o interfejsach innych niż SDK znajdziesz w artykule Ograniczenia dotyczące interfejsów innych niż SDK.