Zmiany w działaniu: aplikacje kierowane na interfejs API na poziomie 28 lub wyższym

Android 9 (poziom interfejsu API 28) wprowadza szereg 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. To normalne uprawnienie, aby system automatycznie przyznał go aplikacji, która wysłała żądanie.

Jeśli aplikacja kierowana na Androida 9 lub nowszego próbuje utworzyć usługę na pierwszym planie bez prosi o FOREGROUND_SERVICE, system wysyła SecurityException.

Zmiany w ochronie prywatności

Jeśli Twoja aplikacja jest kierowana na Androida 9, pamiętaj o tych kwestiach: do zmian w Twoim zachowaniu. Te aktualizacje danych seryjnych urządzenia i danych DNS zwiększyć prywatność użytkowników.

Wycofanie numeru seryjnego kompilacji

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 zagwarantować, że jeśli resolver systemu korzysta z uwierzytelniania DNS-over-TLS, wbudowany klient DNS używa zaszyfrowanego DNS dla tej samej nazwy hosta system lub jest wyłączony na rzecz resolvera systemu.

Zmiany zabezpieczeń platformy

W Androidzie 9 wprowadziliśmy kilka zmian w działaniu, bezpieczeństwa aplikacji, ale zmiany te zostaną zastosowane tylko wtedy, gdy aplikacja jest kierowana na poziom API 28 lub więcej.

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

Jeśli Twoja aplikacja jest kierowana na Androida 9 lub nowszego, isCleartextTrafficPermitted() zwraca domyślnie false. Jeśli w aplikacji musisz włączyć tekst nieszyfrowany dla: w określonych domenach musisz ustawić cleartextTrafficPermitted na true dla tych domen w sekcji Bezpieczeństwo sieciowe aplikacji Konfiguracja.

Sieciowe katalogi danych rozdzielone według procesów

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 klasy android.webkit, takie jak jako WebView i CookieManager, tylko w jednym proces tworzenia konta. Na przykład przenieś wszystkie Activity obiektów, które używają WebView w ramach tego samego procesu. Możesz ściślej egzekwować stosowanie „tylko jednego procesu”. reguła Połączenie disableWebView() in na inne procesy aplikacji. To wywołanie uniemożliwia zainicjowanie WebView w tych innych procesach przez pomyłkę, nawet jeśli jest ona wywoływana z poziomu bibliotece.

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

Domeny SELinux według 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ępnić pliki innym aplikacjom, użyj treści Google Cloud Platform.

Zmiany połączeń

Liczenie danych połączeń i wielościeżki

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 Android 9 musi wywołać tę metodę i uznać tę wskazówkę.

ConnectivityManager.NetworkCallback klasa wysył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 sieci Wi-Fi lub wiele sieci komórkowych jednocześnie.

Wycofanie klienta HTTP Apache

W Androidzie 6.0 wyłączyliśmy obsługę klienta Apache HTTP. 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 przepakować bibliotekę (za pomocą narzędzia takiego jak Jar Jar), aby uniknąć problemów ze zgodnością klas. z klasami dostępnymi w środowisku wykonawczym.

Zmiany w interfejsie

Wyświetl fokus

Nie można już zaznaczyć widoków z zerowym obszarem (czyli o szerokości lub wysokości wynosi 0).

Co więcej, działania nie powodują już bezpośredniego ukierunkowania tryb dotykowy. Możesz samodzielnie poprosić o ukierunkowanie, jeśli pożądaną.

Obsługa wartości szesnastkowych CSS RGBA

Aplikacje kierowane na Androida 9 lub nowszego muszą mieć włączoną wersję roboczą Moduł kolorów CSS – poziom 4 dla obsługi 4- i 8-cyfrowych szesnastkowych kolorów CSS.

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. Na czele (który zostałby zinterpretowany przez Androida jako komponent alfa) to obecnie ignorowane. 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 w przypadku pliku: identyfikatory URI

Wersje Androida starsze niż Android 9 mogą określać typy MIME na podstawie pliku treści. Począwszy od Androida 9 (poziom interfejsu API 28) aplikacje muszą używać poprawne rozszerzenie pliku podczas wczytywania identyfikatorów URI file: w 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 rozpoznane rozszerzenie, takie jak .html, .txt, .js lub .css typ MIME zostanie określony przez rozszerzenie. Jeśli plik nie ma rozszerzenia lub nie został rozpoznany, typ MIME będzie miał tryb zwykły. tekstu.

Na przykład identyfikator URI taki jak file:///sdcard/test.html będzie renderowany jako HTML, ale identyfikator URI taki jak file:///sdcard/test zostanie wyświetlony jako zwykły tekst, nawet jeśli plik zawiera dane HTML.

Element przewijany dokumentu

Android 9 prawidłowo obsługuje przypadki, w których katalog główny dokumentu jest przewijany. We wcześniejszych wersjach pozycja przewijania została ustawiona w elemencie body, a element główny ma zerowe wartości przewijania. Android 9 zachowanie zgodne ze standardami, gdzie przewijany element jest elementem głównym. .

Oprócz tego bezpośredni dostęp do usług document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop lub document.documentElement.scrollLeft będą działać różnie 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.