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

Android 9 (poziom interfejsu API 28) wprowadza wiele zmian w systemie Android. Poniższe zmiany w działaniu dotyczą tylko aplikacji, na które są kierowane Interfejs API na poziomie 28 lub wyższym. aplikacje, w których targetSdkVersion ma ustawiony poziom API 28 lub wartość wyższa musi zmodyfikować ich aplikacje do prawidłowej obsługi tych zachowań (w stosownych przypadkach).

Zmiany, które wpływają na wszystkie aplikacje działające na Androidzie 9, niezależnie od używanego interfejsu API na docelowym poziomie, zobacz Zmiany działania: wszystkie aplikacje.

Usługi działające na pierwszym planie

Aplikacje kierowane na Androida 9 lub nowszego i korzystające z usług na pierwszym planie muszą prosić o zgodę FOREGROUND_SERVICE uprawnienia. Jest to normalne uprawnienie, więc system automatycznie przyznaje je aplikacji, która o nie prosi.

Jeśli aplikacja kierowana na Androida 9 lub nowszą próbuje utworzyć usługę na pierwszym planie bez żądania FOREGROUND_SERVICE, system zgłasza błąd SecurityException.

Zmiany w ochronie prywatności

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

Wycofanie obsługi numeru seryjnego

W Androidzie 9 Build.SERIAL to zawsze ma wartość "UNKNOWN", aby chronić użytkowników prywatności.

Jeśli aplikacja musi uzyskać dostęp do numeru seryjnego sprzętu, wykonaj poproś o READ_PHONE_STATE uprawnienia, a następnie wywołaj getSerial()

Prywatność DNS

Aplikacje kierowane na Androida 9 powinny respektować prywatne interfejsy API DNS. W szczególności aplikacje powinny zadbać o to, aby w przypadku, gdy systemowy resolver używa protokołu DNS przez TLS, każdy wbudowany klient DNS albo używa szyfrowanego DNS do tego samego hosta, co system, albo jest wyłączony na rzecz systemowego resolvera.

Zmiany w zabezpieczeniach frameworku

Android 9 zawiera kilka zmian zachowania, które zwiększają bezpieczeństwo aplikacji, ale te zmiany mają zastosowanie tylko wtedy, gdy Twoja aplikacja jest kierowana na poziom interfejsu API 28 lub wyższy.

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

Jeśli Twoja aplikacja jest kierowana na Androida 9 lub nowszego, metoda isCleartextTrafficPermitted() zwraca domyślnie false. Jeśli Twoja aplikacja musi zezwalać na tekst nieszyfrowany w przypadku określonych domen, musisz w konfiguracji bezpieczeństwa sieci aplikacji ustawić flagę cleartextTrafficPermitted na wartość true dla tych domen.

Katalogi danych internetowych z podziałem na procesy

Ze względu na stabilność aplikacji i integralność danych na Androidzie 9 aplikacje nie mogą współdzielą pojedyncze dane WebView katalog wśród wielu procesów. Zazwyczaj takie katalogi danych przechowują pliki cookie, pamięci podręczne HTTP i inne trwałe i tymczasowej pamięci na potrzeby przeglądania 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 przenieś wszystkie Activity obiektów, które używają WebView w ramach tego samego procesu. Możesz bardziej rygorystycznie egzekwować regułę „tylko 1 proces”, wywołując funkcję disableWebView() w innych procesach aplikacji. To wywołanie zapobiega błędowi polegającemu na nieprawidłowym inicjowaniu funkcji WebView w tych innych procesach, nawet jeśli jest ona wywoływana z zależnej biblioteki.

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

Domeny SELinux dla poszczególnych aplikacji

Aplikacje kierowane na Androida 9 lub nowszego nie mogą udostępniać danych innym aplikacjom za pomocą dostępne na całym świecie uprawnienia Unix. Ta zmiana poprawi integralność Piaskownica aplikacji na Androida, zwłaszcza pod kątem wymogu, dostępne są dane prywatne wyłącznie przez tę aplikację.

Aby udostępniać pliki innym aplikacjom, użyj usługi treści.

Zmiany dotyczące łączności

Zliczanie danych o połączeniach i multipath

W przypadku aplikacji kierowanych na Androida 9 lub nowszego system liczy ruch w sieciach inne niż domyślne (np. ruch mobilny, gdy urządzenie jest włączone) Wi-Fi oraz metody w NetworkStatsManager do wysyłania zapytań dotyczących tego ruchu.

W szczególności getMultipathPreference() zwraca teraz wartość na podstawie wyżej wymienionego ruchu w sieci. Rozpoczyna się od w Androidzie 9 metoda zwraca true w przypadku danych komórkowych, ale jeśli wartość jest większa niż pewna gdy w ciągu jednego dnia narasta ruch, zaczyna zwracać false. Aplikacje działające na Androidzie 9 muszą wywołać tę metodę i uwzględnić ten podręcznik.

Klasa ConnectivityManager.NetworkCallback przesyła teraz informacje o sieciach VPN do aplikacji. Ta zmiana znacznie ułatwia aby aplikacje nasłuchiwały zdarzeń połączenia bez konieczności łączenia asynchronicznych wywołań i korzystania z ograniczonych interfejsów API. Dodatkowo oznacza to, że przesyłanie informacji działa zgodnie z oczekiwaniami, gdy urządzenie jest połączone z wieloma Wi-Fi lub kilka sieci komórkowych jednocześnie.

Wycofanie klienta HTTP Apache

W Androidzie 6.0 wyłączyliśmy obsługę klienta HTTP Apache. Począwszy od Androida 9 biblioteka ta jest usuwana z Bootclasspath i jest domyślnie niedostępne dla aplikacji.

Aby nadal korzystać z klienta HTTP Apache, aplikacje kierowane na Androida 9 lub nowszego może dodać do AndroidManifest.xml te elementy:

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

Zamiast korzystania z biblioteki Apache w środowisku wykonawczym aplikacje mogą łączyć własnej wersji biblioteki org.apache.http w pliku APK. W takim przypadku musisz ponownie spakować bibliotekę (za pomocą narzędzia takiego jak Jar Jar), aby uniknąć problemów ze zgodnością klas z klasami udostępnionymi w czasie wykonywania.

Zmiany w interfejsie

Wyświetlanie skupienia

Nie można już zaznaczyć widoków z 0 obszaru (szerokość lub wysokość to 0).

Co więcej, działania nie powodują już bezpośredniego ukierunkowania tryb dotykowy. Zamiast tego możesz wyraźnie poprosić o pierwotny punkt skupienia (jeśli chcesz).

Obsługa wartości szesnastkowych CSS RGBA

Aplikacje kierowane na Androida 9 lub nowszego muszą mieć włączone zachowanie interfejsu CSS Color Module Level 4 w wersji roboczej w celu obsługi kolorów CSS z 4 i 8 cyframi szesnastkowymi.

Moduł CSS Color, poziom 4 jest obsługiwana przez Chrome od wersji 52, WebView obecnie wyłącza tę funkcję. ponieważ istniejące aplikacje na Androida zawierają 32-bitowe kolory w systemie szesnastkowym w kolejności komponentów z Androidem (ARGB), co powoduje 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 jest interpretowany przez Androida jako komponent alfa) jest obecnie ignorowany. Jeśli aplikacja jest kierowana na interfejs API na poziomie 28 lub wyższym, #80ff8080 to interpretowany jako 50% przezroczysty jasnozielony (#80ff80).

Wykrywanie typu MIME dla pliku: identyfikatory URI

Wersje Androida starsze niż 9 mogły wywnioskować typy MIME na podstawie zawartości pliku. Począwszy od Androida 9 (poziom interfejsu API 28) aplikacje muszą używać prawidłowej rozszerzenia pliku podczas wczytywania identyfikatorów URI file:WebView.

Wywnioskowanie typów MIME na podstawie zawartości pliku może być źródłem błędów w zabezpieczeniach, co na ogół nie jest dozwolone przez nowoczesne przeglądarki.

Jeśli plik ma rozpoznawane rozszerzenie, takie jak .html, .txt, .js lub .css, typ MIME zostanie określony na podstawie rozszerzenia. Jeśli plik nie ma rozszerzenia lub ma nierozpoznane rozszerzenie, typ MIME będzie miał postać zwykłego tekstu.

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 przypadek, gdy element względny dokumentu jest elementem przewijanym. W wersjach wcześniejszych pozycja przewijania była ustawiana na elemencie body, a element główny miał zerowe wartości przewijania. Android 9 zachowanie zgodne ze standardami, gdzie przewijany element jest elementem głównym. .

Ponadto bezpośredni dostęp do funkcji document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop lub document.documentElement.scrollLeft będzie się zachowywać inaczej w zależności od docelowego pakietu SDK. Aby uzyskać dostęp do widocznego obszaru, przewiń w widocznym obszarze używaj wartości document.scrollingElement, jeśli są dostępne.

Powiadomienia z zawieszonych aplikacji

Przed Androidem 9 powiadomienia z zawieszonych aplikacji były anulowane. Od Androida 9 powiadomienia z zawieszonych aplikacji są ukryte do aplikacja zostanie wznowiona.