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 WebView
i CookieManager
, 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:
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 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.