Zmiany w działaniu: aplikacje kierowane na Androida 11

Podobnie jak we wcześniejszych wersjach, Android 11 wprowadza zmiany w działaniu, które mogą wpłynąć na Twoją aplikację. Poniższe zmiany w działaniu dotyczą tylko aplikacji kierowanych na Androida 11 lub nowszego. Jeśli aplikacja ustawia targetSdkVersion na 30, w stosownych przypadkach musisz ją zmodyfikować, aby prawidłowo obsługiwała te zachowania.

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

prywatność

Aby zwiększyć prywatność użytkowników, wprowadzamy zmiany i ograniczenia w Androidzie 11 takie jak:

  • Wymuszanie zakresu miejsca na dane: dostęp do katalogów w pamięci zewnętrznej jest ograniczony do katalogu związanego z aplikacją i konkretnych typów multimediów utworzonych przez tę aplikację.
  • Automatyczne resetowanie uprawnień: jeśli użytkownicy nie korzystali 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ą zostać przekierowani do ustawień systemu.
  • Widoczność pakietów: gdy aplikacja wysyła zapytanie o listę aplikacji zainstalowanych na urządzeniu, zwracana lista jest filtrowana.

Więcej informacji znajdziesz na stronie Prywatność.

Zabezpieczenia

Tagowanie wskaźników sterty

Szczegóły zmian

Zmień nazwę: NATIVE_HEAP_POINTER_TAGGING

Identyfikator zmiany: 135754954

Jak przełączyć

Testując zgodność 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 platformie zgodności i przełączaniu zmian znajdziesz w artykule o testowaniu i debugowaniu zmian działania platformy w aplikacji.

Wskaźniki sterty mają teraz tag większy od zera w najważniejszym bajcie (MSB). Aplikacje, które używają wskaźników nieprawidłowo, w tym te, które modyfikują plik MSB, mogą teraz ulegać awariom lub napotykać inne problemy. Ta zmiana jest niezbędna do obsługi przyszłych urządzeń z włączonym rozszerzeniem ARM Memory Tagging Extension (MTE). Więcej informacji znajdziesz w artykule otagowane wskaźniki.

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

Powiadomienia o komunikatach

Niestandardowe powiadomienia typu toast są blokowane w tle

Ze względów bezpieczeństwa oraz dla wygody użytkowników system blokuje powiadomienia z widokami niestandardowymi, jeśli są one wysyłane w tle przez aplikację powiązaną z Androidem 11 lub nowszym. Pamiętaj, że toasty tekstowe nadal są dozwolone. Są to reklamy utworzone za pomocą parametru Toast.makeText(), które nie wywołują metody setView().

Jeśli mimo to aplikacja spróbuje opublikować tosty z widokiem niestandardowym w tle, system nie wyświetli komunikatu użytkownikowi. Zamiast tego system zarejestruje w logcat następujący komunikat:

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

Toast wywołania zwrotne

Jeśli chcesz otrzymywać powiadomienia, gdy pojawi się lub zniknie komunikat (tekstowy lub niestandardowy), użyj metody addCallback(), która została dodana w Androidzie 11.

Zmiany interfejsu Text toast API

Aplikacje kierowane na Androida 11 lub nowszego mają takie efekty uboczne:

Połączenia

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

Szczegóły zmian

Zmień nazwę: APN_READING_PERMISSION_CHANGE_ID

Identyfikator zmiany: 124107808

Jak przełączyć

Testując zgodność 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 platformie zgodności i przełączaniu zmian znajdziesz w artykule o testowaniu i debugowaniu zmian działania platformy w aplikacji.

Aplikacje kierowane na Androida 11 wymagają teraz uprawnień Manifest.permission.WRITE_APN_SETTINGS z podwyższonymi uprawnieniami do odczytu bazy danych APN dostawcy usług telefonicznych lub uzyskiwania do niej dostępu. Próba uzyskania dostępu do bazy danych APN bez tego uprawnienia generuje wyjątek zabezpieczeń.

Ułatwienia dostępu

Zadeklaruj w pliku manifestu interakcję z mechanizmami zamiany tekstu na mowę

Ze względu na zmiany w widoczności pakietu aplikacje kierowane na Androida 11 i obsługujące mechanizm przetwarzania tekstu na mowę muszą dodać do plików manifestu ten element <queries>:

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

Zadeklaruj użycie przycisku ułatwień dostępu w pliku metadanych

Szczegóły zmian

Zmień nazwę: REQUEST_ACCESSIBILITY_BUTTON_CHANGE

Identyfikator zmiany: 136293963

Jak przełączyć

Testując zgodność 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 platformie zgodności i przełączaniu zmian znajdziesz w artykule o testowaniu i debugowaniu zmian działania platformy w aplikacji.

Począwszy od Androida 11 usługa ułatwień dostępu nie może tworzyć deklaracji w czasie działania, w których jest 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 będzie przekazywać do Twojej usługi zdarzeń wywołania zwrotnego przycisku ułatwień dostępu.

Aby odbierać zdarzenia wywołania zwrotnego ułatwień dostępu w usłudze ułatwień dostępu, zadeklaruj powiązanie usługi z przyciskiem ułatwień dostępu w pliku metadanych tej usługi. Podaj 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 dotyczące intencji związanych z multimediami wymagają domyślnej kamery systemu

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

Jeśli dostępna jest więcej niż 1 zainstalowana fabrycznie aplikacja aparatu, system wyświetla użytkownikowi okno, w którym może wybrać aplikację. Jeśli chcesz, aby aplikacja używała określonej aplikacji aparatu innej firmy do robienia zdjęć lub filmów w jej imieniu, możesz wyraźnie wskazać te intencje, podając nazwę pakietu lub komponent na potrzeby danego zamiaru.

Pakowanie i instalacja aplikacji

Skompresowane pliki zasobów

Szczegóły zmian

Zmień nazwę: RESOURCES_ARSC_COMPRESSED

Identyfikator zmiany: 132742131

Jak przełączyć

Testując zgodność 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 platformie zgodności i przełączaniu zmian znajdziesz w artykule o testowaniu i debugowaniu zmian działania platformy w aplikacji.

Nie można zainstalować aplikacji kierowanych na Androida 11 (poziom interfejsu API 30) lub nowszego, jeśli zawierają skompresowany plik resources.arsc lub nie jest on wyrównany na granicy 4-bajtowej. System nie może zmapować tego pliku na pamięć, jeśli występuje 1 z tych warunków. Tabele zasobów, których nie można zmapować na pamięć, muszą być odczytywane do bufora w pamięci RAM, co powoduje niepotrzebne obciążenie systemu i znacznie większe wykorzystanie pamięci RAM na urządzeniu.

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

Schemat podpisu pliku APK w wersji 2 jest teraz wymagany

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

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

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 będą wyłączone na urządzeniach z Androidem 6.0 (poziom API 23) lub nowszym. Informacje o migracji znajdziesz w artykułach na temat migracji z Firebase JobDispatcher do WorkManagera i Migracja z GCMNetworkManager do WorkManagera.

Rozpoznawanie mowy

Ze względu na zmiany w widoczności pakietu 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łania zwrotnego dla OnSharedPreferenceChangeListener

Szczegóły zmian

Zmień nazwę: CALLBACK_ON_CLEAR_CHANGE

Identyfikator zmiany: 119147584

Jak przełączyć

Testując zgodność 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 platformie zgodności i przełączaniu zmian znajdziesz w artykule o testowaniu i debugowaniu zmian działania platformy w aplikacji.

W przypadku aplikacji kierowanych na Androida 11 (poziom interfejsu API 30) za każdym razem, gdy wywoływana jest metoda Editor.clear, następuje wywołanie zwrotne do OnSharedPreferenceChangeListener.onSharedPreferenceChanged z kluczem null.

Ograniczenia interfejsu innego niż SDK

Android 11 zawiera zaktualizowane listy podlegających ograniczeniom interfejsów spoza pakietu SDK opracowane na podstawie współpracy z deweloperami aplikacji na Androida i najnowszych testów wewnętrznych. Zanim ograniczymy dostęp do interfejsów spoza SDK, dbamy o to, aby w miarę możliwości dostępne były publiczne alternatywy.

Jeśli Twoja aplikacja nie jest kierowana na Androida 11, niektóre z tych zmian mogą Cię nie dotyczyć. Mimo że obecnie możesz używać niektórych interfejsów spoza pakietu SDK (w zależności od docelowego poziomu interfejsu API aplikacji), korzystanie z dowolnych metod lub pól spoza pakietu SDK niesie ze sobą wysokie ryzyko awarii aplikacji.

Jeśli nie masz pewności, czy Twoja aplikacja korzysta z interfejsów innych niż SDK, możesz przetestować ją, aby to sprawdzić. Jeśli Twoja aplikacja korzysta z interfejsów innych niż SDK, zacznij planować migrację do alternatywnych pakietów SDK. Zdajemy sobie jednak sprawę, że niektóre aplikacje mają odpowiednie przypadki użycia w zakresie interfejsów spoza SDK. Jeśli nie możesz znaleźć alternatywy dla interfejsu innego niż SDK dla funkcji w aplikacji, poproś o nowy publiczny interfejs API.

Więcej informacji o zmianach w tej wersji Androida znajdziesz w artykule Aktualizacje ograniczeń interfejsu spoza pakietu SDK w Androidzie 11. Więcej informacji o interfejsach innych niż SDK znajdziesz w artykule Ograniczenia interfejsów innych niż SDK.