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.