Zmiany zachowania: aplikacje kierowane na interfejs API na poziomie 28 lub wyższym

W Androidzie 9 (poziom 28 interfejsu API) wprowadzono szereg zmian w systemie Android. Poniższe zmiany w działaniu dotyczą wyłącznie aplikacji kierowanych na interfejs API na poziomie 28 lub wyższym. Aplikacje, które ustawiają targetSdkVersion na poziom interfejsu API 28 lub wyższy, muszą zmodyfikować swoje aplikacje, aby w odpowiednich przypadkach obsługiwały te działania.

Zmiany, które wpływają na wszystkie aplikacje działające na Androidzie 9, niezależnie od poziomu interfejsu API, na który są kierowane, znajdziesz w artykule Zmiany w działaniu: wszystkie aplikacje.

Usługi działające na pierwszym planie

Aplikacje kierowane na Androida 9 lub nowszego, które korzystają z usług działających na pierwszym planie, muszą prosić o uprawnienie FOREGROUND_SERVICE. Jest to zwykłe uprawnienie, więc system automatycznie przyznaje je aplikacji, która o nie prosi.

Jeśli aplikacja kierowana na Androida 9 lub nowszego spróbuje utworzyć usługę na pierwszym planie bez wysłania żądania FOREGROUND_SERVICE, system zgłosi błąd SecurityException.

Zmiany w podejściu do prywatności

Jeśli Twoja aplikacja jest kierowana na Androida 9, pamiętaj o tych zmianach w działaniu. Te aktualizacje informacji o numerze seryjnym urządzenia i DNS zwiększają prywatność użytkowników.

Wyłączenie numeru seryjnego

W Androidzie 9 wartość Build.SERIAL jest zawsze ustawiona na "UNKNOWN", aby chronić prywatność użytkowników.

Jeśli Twoja aplikacja potrzebuje dostępu do numeru seryjnego urządzenia, poproś o uprawnienie READ_PHONE_STATE, a następnie wywołaj funkcję getSerial().

Prywatność DNS

Aplikacje kierowane na Androida 9 powinny obsługiwać interfejsy API prywatnego DNS. W szczególności aplikacje powinny zadbać o to, aby wbudowany klient DNS używał szyfrowanego DNS do tego samego hosta co systemowy resolver DNS przez TLS lub był wyłączony na rzecz systemowego resolvera.

Zmiany w zabezpieczeniach platformy

Android 9 zawiera kilka zmian w działaniu, które zwiększają bezpieczeństwo aplikacji, ale te zmiany wchodzą w życie tylko wtedy, gdy aplikacja jest kierowana na poziom interfejsu API 28 lub nowszy.

Domyślnie włączony protokół TLS sieci

Jeśli Twoja aplikacja jest kierowana na Androida 9 lub nowszego, metoda isCleartextTrafficPermitted() domyślnie zwraca wartość false. Jeśli Twoja aplikacja musi włączyć ruch nieszyfrowany w przypadku określonych domen, musisz w ustawieniach bezpieczeństwa sieci aplikacji wyraźnie ustawić wartość cleartextTrafficPermitted na true w przypadku tych domen.

Katalogi danych w internecie podzielone według procesu

Aby zwiększyć stabilność aplikacji i integralność danych na Androidzie 9, aplikacje nie mogą udostępniać jednego katalogu danych WebView między wieloma procesami. Zazwyczaj w takich katalogach danych przechowywane są pliki cookie, pamięć podręczna HTTP oraz inne dane trwałe i tymczasowe związane z przeglądaniem internetu.

W większości przypadków aplikacja powinna używać klas z pakietu android.webkit, takich jak WebViewCookieManager, tylko w jednym procesie. Na przykład wszystkie obiekty, które korzystają z WebView,Activity przenieś do tego samego procesu. Możesz ściślej egzekwować zasadę „tylko jeden proces”, wywołując disableWebView() w innych procesach aplikacji. To wywołanie zapobiega przypadkowej inicjalizacji WebView w innych procesach, nawet jeśli jest wywoływane z zależnej biblioteki.

Jeśli aplikacja musi używać instancji WebView w więcej niż 1 procesie, przed użyciem danej instancji WebView w tym procesie musisz przypisać do każdego procesu unikalny sufiks katalogu danych za pomocą metody WebView.setDataDirectorySuffix(). Ta metoda umieszcza dane z sieci z każdego procesu w osobnym katalogu w katalogu danych aplikacji.

Domeny SELinux dla poszczególnych aplikacji

Aplikacje na Androida 9 lub nowszego nie mogą udostępniać danych innym aplikacjom za pomocą uprawnień systemu Unix dostępnych dla wszystkich użytkowników. Ta zmiana zwiększa integralność piaskownicy aplikacji na Androida, w szczególności wymaganie, aby dane prywatne aplikacji były dostępne tylko dla niej.

Aby udostępniać pliki za pomocą innych aplikacji, użyj dostawcy treści.

Zmiany w połączeniach

Zliczanie danych o połączeniach i wielu ścieżkach

W aplikacjach kierowanych na Androida 9 lub nowszego system zlicza ruch sieciowy w sieciach, które nie są bieżącą siecią domyślną, np. ruch komórkowy, gdy urządzenie jest połączone z Wi-Fi, i udostępnia metody w klasie NetworkStatsManager do wysyłania zapytań o ten ruch.

W szczególności funkcja getMultipathPreference() zwraca teraz wartość na podstawie wspomnianego ruchu w sieci. Od Androida 9 ta metoda zwraca true w przypadku danych komórkowych, ale gdy w ciągu dnia zgromadzi się więcej niż określona ilość ruchu, zaczyna zwracać false. Aplikacje działające na Androidzie 9 muszą wywoływać tę metodę i uwzględniać tę wskazówkę.

Klasa ConnectivityManager.NetworkCallback wysyła teraz do aplikacji informacje o sieciach VPN. Ta zmiana znacznie ułatwia aplikacjom nasłuchiwanie zdarzeń związanych z łącznością bez konieczności łączenia wywołań synchronicznych i asynchronicznych oraz korzystania z ograniczonych interfejsów API. Oznacza to również, że przesyłanie informacji działa zgodnie z oczekiwaniami, gdy urządzenie jest połączone z kilkoma sieciami Wi-Fi lub kilkoma sieciami komórkowymi jednocześnie.

Wycofanie klienta HTTP Apache

W Androidzie 6.0 usunięto obsługę klienta HTTP Apache. Od Androida 9 ta biblioteka jest usuwana ze ścieżki rozruchowej i domyślnie nie jest dostępna dla aplikacji.

Aby nadal korzystać z klienta Apache HTTP, aplikacje, których docelowa wersja Androida to 9 lub nowsza, mogą dodać do pliku AndroidManifest.xml ten kod:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Zamiast korzystać z biblioteki Apache w środowisku wykonawczym, aplikacje mogą dołączać własną wersję biblioteki org.apache.http do pliku APK. Jeśli to zrobisz, musisz ponownie spakować bibliotekę (za pomocą narzędzia takiego jak Jar Jar), aby uniknąć problemów ze zgodnością klas z klasami udostępnianymi w środowisku wykonawczym.

Zmiany w interfejsie

Widok tylko prezentacji

Widoki o powierzchni 0 (szerokość lub wysokość wynosi 0) nie są już możliwe do zaznaczenia.

Dodatkowo aktywności nie przypisują już domyślnie początkowego fokusu w trybie dotykowym. Zamiast tego możesz wyraźnie poprosić o początkowe ustawienie ostrości.

Obsługa szesnastkowej wartości RGBA w CSS

Aplikacje kierowane na Androida 9 lub nowszego muszą włączyć roboczą wersję modułu kolorów CSS na poziomie 4, aby obsługiwać kolory CSS w formacie 4- i 8-cyfrowym.

Moduł kolorów CSS na poziomie 4 jest obsługiwany przez Chrome od wersji 52, ale WebView obecnie wyłącza tę funkcję, ponieważ w istniejących aplikacjach na Androida znaleziono 32-bitowe kolory szesnastkowe w kolejności Androida (ARGB), co powodowałoby błędy renderowania.

Na przykład kolor #80ff8080 jest obecnie renderowany w WebView jako nieprzezroczysty jasnoczerwony (#ff8080) w przypadku aplikacji kierowanych na interfejs API na poziomie 27 lub niższym. Pierwszy komponent (który Android interpretuje jako komponent alfa) jest obecnie ignorowany. Jeśli aplikacja jest kierowana na interfejs API na poziomie 28 lub wyższym, #80ff8080 jest interpretowany jako półprzezroczysty jasnozielony kolor (#80ff80).

Wykrywanie typu MIME w przypadku identyfikatorów URI plików

W wersjach Androida starszych niż Android 9 typy MIME można było wywnioskować z zawartości pliku. Od Androida 9 (poziom interfejsu API 28) aplikacje muszą używać prawidłowego rozszerzenia pliku podczas wczytywania file: adresów URI w WebView.

Wywnioskowanie typów MIME na podstawie zawartości pliku może być źródłem błędów związanych z bezpieczeństwem, a współczesne przeglądarki zwykle na to nie pozwalają.

Jeśli plik ma rozpoznane rozszerzenie, np. .html, .txt, .js lub .css, typ MIME zostanie określony na podstawie rozszerzenia. Jeśli plik nie ma rozszerzenia lub ma rozszerzenie nierozpoznane, typ MIME będzie miał wartość plain text.

Na przykład identyfikator URI file:///sdcard/test.html zostanie wyrenderowany jako HTML, ale identyfikator URI file:///sdcard/test zostanie wyrenderowany jako zwykły tekst, nawet jeśli plik zawiera dane HTML.

Element przewijania dokumentu

Android 9 prawidłowo obsługuje sytuację, w której elementem przewijanym jest element główny dokumentu. W starszych wersjach pozycja przewijania była ustawiana w elemencie body, a element główny miał wartości przewijania równe zero. Android 9 umożliwia zachowanie zgodne ze standardami, w którym elementem przewijanym jest element główny.

Ponadto bezpośredni dostęp do document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop lub document.documentElement.scrollLeft będzie działać inaczej w zależności od docelowego pakietu SDK. Aby uzyskać dostęp do wartości przewijania obszaru wyświetlania, użyj gestu document.scrollingElement, jeśli jest dostępny.

Powiadomienia z zawieszonych aplikacji

Przed Androidem 9 powiadomienia ze wstrzymanych aplikacji były anulowane. Od Androida 9 powiadomienia z zawieszonych aplikacji są ukryte do czasu ich wznowienia.