Zmiany w działaniu: aplikacje kierowane na interfejs API w wersji 29 lub nowszej

Android 10 zawiera zaktualizowane zmiany w działaniu systemu, które mogą mieć wpływ na Twoją aplikację. Zmiany wymienione na tej stronie dotyczą wyłącznie aplikacji kierowanych na Interfejs API w wersji 29 lub nowszej. Jeśli Twoja aplikacja ustawia w polu targetSdkVersion wartość „29” lub powyżej, należy zmodyfikować aplikację, aby obsługiwała te zachowania, w odpowiednich przypadkach.

Zapoznaj się też z listą zmian zachowania, które mają wpływ na wszystkie aplikacje działające na Androidzie 10.

Uwaga: oprócz zmian wymienionych na tej stronie Android 10 wprowadza dużą liczbę zmian i ograniczeń związanych z ochroną prywatności, następujące:

  • Ograniczone miejsce na dane
  • Dostęp do numeru seryjnego urządzenia USB
  • Możliwość włączania, wyłączania i konfigurowania sieci Wi-Fi
  • Dostęp do lokalizacji dla interfejsów API połączeń

Zmiany te, które mają wpływ na aplikacje kierowane na interfejs API na poziomie 29 lub wyższym, zwiększyć prywatność użytkowników. Więcej informacji o tym, jak wspierać te zmiany, znajdziesz na stronie Zmiany dotyczące prywatności.

Aktualizacje ograniczeń dotyczących interfejsu innego niż SDK

Aby zapewnić stabilność i zgodność aplikacji, platforma zaczęła ograniczać które interfejsy inne niż SDK aplikacja może być używana w Androidzie 9 (poziom API 28). Android 10 zawiera zaktualizowane listy ograniczonych interfejsów spoza pakietu SDK, które powstały we współpracy z deweloperami Androida i na podstawie najnowszych testów wewnętrznych. Zależy nam na tym, przed ograniczeniem korzystania z interfejsów innych niż SDK.

Jeśli nie będziesz kierować swoich aplikacji na Androida 10 (poziom interfejsu API 29), niektóre z tych zmian mogą nie być od razu widoczne. Mimo że obecnie możesz korzystać z wybranych interfejsy inne niż SDK (w zależności od docelowego poziomu interfejsu API aplikacji), Korzystanie z dowolnej metody lub pola niezwiązanego z pakietem SDK zawsze wiąże się z dużym ryzykiem naruszenia .

Jeśli nie masz pewności, czy Twoja aplikacja używa interfejsów innych niż SDK, możesz ją przetestować, aby się tego dowiedzieć. Jeśli Twoja aplikacja korzysta z interfejsów innych niż SDK, należy zaplanować migracji do alternatywnych pakietów SDK. Rozumiemy jednak, że niektóre aplikacje z prawidłowych zastosowań interfejsów innych niż SDK. Jeśli nie możesz znaleźć innej do korzystania z interfejsu poza pakietem SDK, musisz żądanie nowego publicznego interfejsu API.

Więcej informacji znajdziesz w artykule Aktualizacje ograniczeń interfejsu spoza SDK w Androidzie 10. oraz zapoznaj się z ograniczeniami dotyczącymi interfejsów innych niż SDK.

Udostępniona pamięć

Ashmem zmienił format map dalvik w katalogu /proc/<pid>/maps. i wpływa na aplikacje, które bezpośrednio analizują plik map. Programiści aplikacji powinni przetestuj format /proc/<pid>/maps na urządzeniach, które działają Androida 10 lub nowszego i przeanalizuj je, jeśli aplikacja jest zależna od formatów map dalvik.

Aplikacje przeznaczone na Androida 10 nie mogą bezpośrednio używać ashmem (/dev/ashmem). Zamiast tego muszą uzyskiwać dostęp do pamięci współdzielonej za pomocą klasy ASharedMemory NDK. Aplikacje nie mogą też bezpośrednio wysyłać poleceń IOCTL do istniejących deskryptorów plików ashmem. Zamiast tego muszą używać klasy ASharedMemory z NDK lub interfejsów API Javy na Androida do tworzenia regionów pamięci współdzielonej. Ta zmiana pozwoli zwiększyć bezpieczeństwo stabilność podczas pracy z pamięcią współdzieloną, poprawiającą wydajność i bezpieczeństwo; z Androida.

Usunięto uprawnienia do uruchamiania katalogu głównego aplikacji

Wykonywanie plików z katalogu głównego aplikacji z możliwością zapisu jest Naruszenie zasad W^X. Aplikacje powinny ładować tylko kod binarny umieszczony w jej pliku APK.

Niezaufane aplikacje kierowane na Androida 10 nie mogą wywoływać funkcji execve() bezpośrednio na plikach w katalogu głównym aplikacji.

Oprócz tego aplikacje kierowane na Androida 10 nie mogą modyfikować w pamięci. kod wykonywalny z plików otwartych za pomocą dlopen() i oczekujących te zmiany mają być zapisywane na dysku, ponieważ biblioteka nie może mieć zostały zmapowane PROT_EXEC za pomocą deskryptora pliku z możliwością zapisu. Obejmuje to wszelkie pliki udostępnionych obiektów (.so) z relokacjami tekstu.

Środowisko wykonawcze Androida akceptuje tylko pliki OAT wygenerowane przez system

Środowisko wykonawcze Androida (ART) nie wywołuje już funkcji dex2oat z aplikacji proces tworzenia konta. Ta zmiana oznacza, że ART będzie akceptować tylko pliki OAT wygenerowane przez system.

Egzekwowanie poprawności AOT w ART

W przeszłości kompilacja danych z wyprzedzeniem (AOT) wykorzystywana przez Androida Środowisko wykonawcze (ART) może powodować awarie środowiska wykonawczego, jeśli środowisko ścieżki klasy nie było tak samo podczas kompilowania i podczas działania. Android 10 lub nowszy zawsze wymaga, aby te konteksty środowiska były takie same, co skutkuje następujące zmiany w działaniu:

  • Niestandardowe moduły ładujące klas, czyli programy wczytujące klasy tworzone przez aplikacje, w przeciwieństwie do klasy programy ładujące z pakietu dalvik.system – nie są skompilowane przez AOT. Dzieje się tak, ponieważ ART nie ma informacji o niestandardowej implementacji wyszukiwania klas w czasie działania.
  • dodatkowe pliki .dex, czyli pliki .dex wczytywane ręcznie przez aplikacje spoza podstawowych plików APK – są AOT kompilowane w tle. Dzieje się tak, ponieważ kompilacja przy pierwszym użyciu może być zbyt kosztowna i prowadzić do niechcianej zwłoki przed wykonaniem. Pamiętaj, że w przypadku aplikacji zastosowanie podziałów i odejście od drugorzędnych zalecamy używanie plików .dex.
  • Biblioteki udostępnione w Androidzie (wpisy <library> i <uses-library> w pliku manifestu Androida) są zaimplementowane za pomocą innego w hierarchii wczytywania klasy niż używana w poprzednich wersjach platformy.

Zmiany uprawnień do intencji pełnoekranowej

Aplikacje kierowane na Androida 10 lub nowszego i korzystające z powiadomień pełny ekran intencje muszą żądać USE_FULL_SCREEN_INTENT. uprawnienia dostępu w pliku manifestu aplikacji. Jest to normalne uprawnienie, więc system automatycznie przyznaje je aplikacji, która o nie prosi.

Jeśli aplikacja kierowana na Androida 10 lub nowszego próbuje utworzyć powiadomienia z intencją pełnoekranową bez wysyłania żądania system zignoruje intencję pełnoekranową i wyświetli następujący komunikat komunikat logu:

Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

Obsługa urządzeń składanych

W Androidzie 10 wprowadziliśmy zmiany dotyczące urządzeń składanych i urządzeń z dużym ekranem.

W przypadku aplikacji na Androida 10 onResume() i onPause() metody działają w inny sposób. Gdy wiele aplikacji jest wyświetlanych jednocześnie w trybie wielu okien lub w trybie wielu wyświetlaczy, widoczne są wszystkie najważniejsze aktywności, które można zaznaczyć, są w stanie wznowionym, ale tylko jedna z nich: „największa wznowiona” aktywność, ma ostrość. W przypadku wersji starszych niż Android 10 tylko można wznowić pojedynczą aktywność w systemie, a wszystkie pozostałe aktywności są wstrzymane.

Nie myl „fokus” z „pierwszym wznowionym”, działania. System przypisuje nadawanie priorytetów działaniom na podstawie kolejności nakładania elementów, aby nadać wyższy priorytet z czynnościami, z którymi użytkownik ostatnio wchodził w interakcję. Działaniem może być została wznowiona, ale bez zaznaczenia (np. jeśli obszar powiadomień to rozwinięto).

W Androidzie 10 (poziom interfejsu API 29) i nowszych możesz subskrybować wywołanie zwrotne onTopResumedActivityChanged(), aby otrzymywać powiadomienia, gdy Twoja aktywność uzyska lub utraci pozycję najwyższej odświeżonej aktywności. Jest to odpowiednik stanu wznowienia sprzed Androida 10 i może być przydatny jako wskazówkę, czy aplikacja korzysta z zasobów na wyłączność lub w pojedynkę, w celu udostępnienia jej innym aplikacjom.

Działanie funkcji resizeableActivity Zmienił się też atrybut manifestu. Jeśli aplikacja resizeableActivity=false w Androidzie 10 (poziom interfejsu API 29) lub nowszym, może być w trybie zgodności gdy zmieni się dostępny rozmiar ekranu lub gdy aplikacja przejdzie z jednego ekranu na innego użytkownika.

Aplikacje mogą używać android:minAspectRatio wprowadzonego w Androidzie 10 do wskazywania ekranu i formaty obrazu obsługiwane przez aplikację.

Narzędzie emulatora Androida Studio od wersji 3.5 zawiera 7,3" i 8" do testowania kodu na większych ekranach.

Więcej informacji znajdziesz w artykule Projektowanie aplikacji na urządzenia składane.