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. Podane niżej zmiany w działaniu dotyczą tylko aplikacji kierowanych na interfejs API na poziomie 28 lub wyższym. Aplikacje z ustawieniem targetSdkVersion na poziomie API 28 lub wyższym muszą w stosownych przypadkach modyfikować swoje aplikacje, aby prawidłowo obsługiwały te zachowania.

Informacje o zmianach, które mają wpływ na wszystkie aplikacje działające na Androidzie 9, niezależnie od tego, na jaki poziom interfejsu API 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 i korzystające z usług działających na pierwszym planie muszą prosić o uprawnienie FOREGROUND_SERVICE. Jest to normalne uprawnienie, więc system automatycznie przyznaje je aplikacji, która wysłała żądanie.

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

Zmiany w ochronie 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 danych DNS zwiększają prywatność użytkowników.

Wycofanie numeru seryjnego kompilacji

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

Jeśli aplikacja wymaga dostępu do numeru seryjnego sprzętu, poproś o uprawnienie READ_PHONE_STATE, a potem wywołaj getSerial().

Prywatność DNS

Aplikacje kierowane na Androida 9 powinny obsługiwać interfejsy API prywatnych DNS. W szczególności aplikacje powinny upewnić się, że jeśli resolver systemu używa funkcji DNS-over-TLS, każdy wbudowany klient DNS używa zaszyfrowanego DNS dla tej samej nazwy hosta co system lub jest wyłączony na rzecz resolvera systemu.

Zmiany zabezpieczeń platformy

Android 9 wprowadza kilka zmian w działaniu, które poprawiają bezpieczeństwo aplikacji. Zmiany te obowiązują tylko wtedy, gdy aplikacja jest kierowana na interfejs API na poziomie 28 lub wyższym.

Sieciowy protokół TLS jest włączony domyślnie

Jeśli aplikacja jest kierowana na Androida w wersji 9 lub nowszej, metoda isCleartextTrafficPermitted() domyślnie zwraca wartość false. Jeśli Twoja aplikacja musi włączyć tekst nieszyfrowany w przypadku określonych domen, musisz ustawić dla tych domen wartość cleartextTrafficPermitted w konfiguracji zabezpieczeń sieci aplikacji.true

Internetowe katalogi danych rozdzielone procesami

Aby zwiększyć stabilność aplikacji i integralność danych na Androidzie 9, aplikacje nie mogą udostępniać jednego katalogu danych WebView przez wiele procesów. Katalogi danych zawierają zwykle pliki cookie, pamięci podręczne HTTP oraz inną trwałą i tymczasową pamięć związaną z przeglądaniem internetu.

W większości przypadków aplikacja powinna używać klas z pakietu android.webkit, takich jak WebView i CookieManager, w tylko jednym procesie. Na przykład wszystkie obiekty Activity korzystające z WebView należy przenieść do tego samego procesu. Możesz bardziej rygorystycznie egzekwować regułę „tylko jeden proces”, wywołując metodę disableWebView() w pozostałych procesach aplikacji. To wywołanie zapobiega omyłkowemu inicjowaniu procesu WebView w tych innych procesach, nawet jeśli jest wywoływane z biblioteki zależnej.

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

Domeny SELinux dla poszczególnych aplikacji

Aplikacje kierowane na Androida 9 lub nowszego nie mogą udostępniać danych innym aplikacjom przy użyciu dostępnych na całym świecie uprawnień uniksowych. Ta zmiana poprawia integralność piaskownicy aplikacji na Androida, w szczególności wymaga, aby prywatne dane aplikacji były dostępne tylko dla niej.

Aby udostępnić pliki innym aplikacjom, skorzystaj z dostawcy treści.

Zmiany w połączeniach

Zliczanie danych o połączeniach i ścieżki wielościeżkowe

W przypadku aplikacji kierowanych na Androida 9 lub nowszego system liczy ruch sieciowy w sieciach innych niż domyślne, np. ruch z komórek, gdy urządzenie jest połączone z Wi-Fi, i udostępnia metody w klasie NetworkStatsManager służące do wysyłania zapytań dotyczących tego ruchu.

W szczególności getMultipathPreference() zwraca teraz wartość na podstawie wspomnianego ruchu w sieci. Począwszy od Androida 9 ta metoda zwraca wartość true dla danych komórki, ale gdy w ciągu dnia nagromadzi się więcej niż określona ilość ruchu, zwraca wartość 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 informacje o sieciach VPN do aplikacji. Ta zmiana znacznie ułatwi aplikacjom nasłuchiwanie zdarzeń połączenia bez konieczności łączenia wywołań synchronicznych z asynchronicznymi i korzystania z ograniczonych interfejsów API. Oznacza to też, że przenoszenie informacji działa zgodnie z oczekiwaniami, gdy urządzenie jest połączone z wieloma sieciami Wi-Fi lub wieloma sieciami komórkowymi jednocześnie.

Wycofanie klienta HTTP Apache

W Androidzie 6.0 usunęliśmy obsługę klienta HTTP Apache. Począwszy od Androida 9 ta biblioteka jest usuwana z metody bootclasspath i domyślnie nie jest dostępna dla aplikacji.

Aby można było nadal używać klienta HTTP Apache, aplikacje kierowane na Androida 9 lub nowszego mogą dodać do strony AndroidManifest.xml te elementy:

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

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

Zmiany interfejsu

Wyświetl zaznaczenie

W widokach z 0 obszarem (szerokość lub wysokość ma wartość 0) nie można już zaznaczyć.

Poza tym aktywności nie przypisują już początkowego zaznaczenia w trybie dotykowym. W razie potrzeby to Ty musisz wyraźnie poprosić o początkowe zaznaczenie.

Obsługa wartości szesnastkowych RGBA CSS

Aplikacje kierowane na Androida w wersji 9 lub nowszej muszą mieć włączone działanie modułu kolorów CSS – poziom 4 w wersji roboczej, aby mogły obsługiwać od 4 do 8 szesnastkowych szesnastkowych kolorów CSS.

Moduł kolorów CSS na poziomie 4 jest obsługiwany w Chrome od wersji 52. Jednak obecnie WebView wyłącza tę funkcję, ponieważ w istniejących aplikacjach na Androida znaleziono 32-bitowe szesnastkowe porządkowanie kolorów w systemie Android (ARGB), co może powodować błędy renderowania.

Na przykład kolor #80ff8080 jest obecnie renderowany w komponencie WebView jako nieprzezroczysty, jasnoczerwony (#ff8080) w przypadku aplikacji kierowanych na interfejs API na poziomie 27 lub niższym. Składnik na początku (który zostałby zinterpretowany przez Androida jako komponent alfa) jest obecnie ignorowany. Jeśli aplikacja jest kierowana na interfejs API na poziomie 28 lub wyższym, wartość #80ff8080 jest interpretowana jako 50% przezroczystości jasnozielonej (#80ff80).

Przechwytywanie typu MIME pliku: identyfikatory URI

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

Użycie zawartości pliku do ustalenia typów MIME może być źródłem błędów w zabezpieczeniach, które zwykle nie są dozwolone w nowoczesnych przeglądarkach.

Jeśli plik ma rozpoznawane rozszerzenie, takie jak .html, .txt, .js lub .css, typ MIME jest określany przez rozszerzenie. Jeśli plik nie ma rozszerzenia lub nie został rozpoznany, typ MIME będzie zwykłym tekstem.

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

Element przewijany dokumentu

Android 9 prawidłowo obsługuje przypadek, w którym elementem głównym dokumentu jest element przewijany. We wcześniejszych wersjach pozycję przewijania była ustawiona w elemencie treści, a element główny miał zerowe wartości przewijania. Android 9 umożliwia zachowanie zgodne ze standardami, w którym elementem głównym jest przewijanie.

Poza tym bezpośredni dostęp do document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop lub document.documentElement.scrollLeft będzie działać różnie w zależności od docelowego pakietu SDK. Aby uzyskać dostęp do wartości przewijania widocznego obszaru, użyj elementu document.scrollingElement, jeśli jest dostępny.

Powiadomienia z zawieszonych aplikacji

Przed Androidem 9 powiadomienia z zawieszonych aplikacji były anulowane. Począwszy od Androida 9 powiadomienia z zawieszonych aplikacji są ukryte, dopóki nie zostaną wznowione.