Android 9 (poziom 28 interfejsu API) wprowadza nowe świetne funkcje i możliwości dla użytkowników i programistów. W tym dokumencie znajdziesz informacje o nowościach dla deweloperów.
Więcej informacji o nowych interfejsach API znajdziesz w raporcie o różnicach w interfejsach API lub w dokumentacji interfejsów API Androida. Zapoznaj się też z zmianami w działaniu Androida 9, aby dowiedzieć się, w jakich obszarach zmiany na platformie mogą wpłynąć na Twoje aplikacje.
Pozycjonowanie w pomieszczeniach za pomocą Wi-Fi RTT

Android 9 dodaje obsługę protokołu IEEE 802.11-2016 Wi-Fi, znanego też jako Wi-Fi Round-Trip-Time (RTT), dzięki czemu możesz korzystać z pozycjonowania w pomieszczeniach w swoich aplikacjach.
Na urządzeniach z Androidem 9 z obsługą sprzętową aplikacje mogą używać interfejsów API RTT do pomiaru odległości od pobliskich punktów dostępu Wi-Fi obsługujących RTT. Na urządzeniu muszą być włączone usługi lokalizacyjne i skanowanie Wi-Fi (w Ustawieniach > Lokalizacja), a aplikacja musi mieć uprawnienie ACCESS_FINE_LOCATION
. Aby korzystać z RTT, urządzenie nie musi łączyć się z punktami dostępu.
Ze względu na ochronę prywatności tylko telefon może określić odległość od punktu dostępu. Punkty dostępu nie mają tych informacji.
Jeśli urządzenie mierzy odległość do co najmniej 3 punktów dostępu, możesz użyć algorytmu multilateracji, aby oszacować pozycję urządzenia, która najlepiej pasuje do tych pomiarów. Wynik jest zwykle dokładny w zakresie 1–2 metrów.
Dzięki tej dokładności możesz tworzyć nowe funkcje, takie jak nawigacja w budynkach i precyzyjne usługi oparte na lokalizacji, np. jednoznaczne sterowanie głosowe (np. „Włącz to światło”) i informacje oparte na lokalizacji (np. „Czy są jakieś oferty specjalne na ten produkt?”).
Zobacz, jak działa interfejs WiFi RTT API w aplikacji demonstracyjnej Android WifiRttScan.
Więcej informacji znajdziesz w artykule Lokalizacja Wi-Fi: pomiar odległości za pomocą RTT.
Obsługa wycięcia w ekranie

Testowanie wycięcia na wyświetlaczu za pomocą emulatora
Android 9 obsługuje najnowsze ekrany bez ramki z wycięciami na aparaty i głośniki. Klasa
DisplayCutout
umożliwia określenie lokalizacji i kształtu obszarów niefunkcjonalnych, w których nie należy wyświetlać treści. Aby określić istnienie i umiejscowienie tych obszarów wycięcia, użyj metody getDisplayCutout()
.
Nowy atrybut układu okna, layoutInDisplayCutoutMode
, umożliwia aplikacji rozmieszczenie treści wokół wycięć na urządzeniu. Ten atrybut może mieć jedną z tych wartości:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Wycięcie na ekranie możesz symulować na dowolnym urządzeniu lub emulatorze z Androidem 9 w ten sposób:
- Włącz opcje programisty.
- Na ekranie Opcje programisty przewiń w dół do sekcji Rysowanie i wybierz Symuluj wyświetlacz z wycięciem.
- Wybierz rozmiar wycięcia.
Powiadomienia
Android 9 wprowadza kilka ulepszeń powiadomień, które są dostępne dla programistów kierujących reklamy na interfejs API na poziomie 28 lub wyższym.

MessagingStyle z dołączonym zdjęciem.

MessagingStyle z odpowiedziami i rozmową.
Przykładowy kod, który korzysta z powiadomień, w tym z funkcji Androida 9, znajdziesz w przykładzie People.
Ulepszone funkcje przesyłania wiadomości
Począwszy od Androida 7.0 (interfejs API na poziomie 24), możesz dodawać działanie, które umożliwia odpowiadanie na wiadomości lub wpisywanie innego tekstu bezpośrednio z poziomu powiadomienia. Android 9 ulepsza tę funkcję, wprowadzając następujące zmiany:
Uproszczona obsługa uczestników rozmowy: klasa
Person
służy do identyfikowania osób biorących udział w rozmowie, w tym ich awatarów i identyfikatorów URI. Wiele innych interfejsów API, np.addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,addMessage()
,�Person
CharSequence
KlasaPerson
obsługuje też wzorzec projektowy Builder.Obsługa obrazów: Android 9 wyświetla teraz obrazy w powiadomieniach o wiadomościach na telefonach. W wiadomości możesz użyć tagu
setData()
, aby wyświetlić obraz. Poniższy fragment kodu pokazuje, jak utworzyćPerson
i komunikat zawierający obraz.
Kotlin
// Create new Person. val sender = Person() .setName(name) .setUri(uri) .setIcon(null) .build() // Create image message. val message = Message("Picture", time, sender) .setData("image/", imageUri) val style = Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message)
Java
// Create new Person. Person sender = new Person() .setName(name) .setUri(uri) .setIcon(null) .build(); // Create image message. Message message = new Message("Picture", time, sender) .setData("image/", imageUri); Notification.MessagingStyle style = new Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message);
Zapisywanie odpowiedzi jako wersji roboczych: aplikacja może pobierać
EXTRA_REMOTE_INPUT_DRAFT
wysłane przez system, gdy użytkownik przypadkowo zamknie powiadomienie o wiadomości. Możesz użyć tego dodatku, aby wstępnie wypełnić pola tekstowe w aplikacji, dzięki czemu użytkownicy będą mogli dokończyć odpowiedź.Określanie, czy rozmowa jest rozmową grupową: możesz użyć
setGroupConversation()
do celowego określenia, czy rozmowa jest rozmową grupową, czy nie.Ustawianie działania semantycznego dla intencji: metoda
setSemanticAction()
umożliwia nadanie działania semantycznego, np. „oznacz jako przeczytane”, „usuń”, „odpowiedz” itp.Inteligentne odpowiedzi: Android 9 obsługuje te same sugerowane odpowiedzi, które są dostępne w aplikacji do przesyłania wiadomości. Użyj elementu
RemoteInput.setChoices()
, aby udostępnić użytkownikowi tablicę standardowych odpowiedzi.
Ustawienia kanału, transmisje i tryb Nie przeszkadzać
W Androidzie 8.0 wprowadzono kanały powiadomień, które umożliwiają tworzenie dostosowywanych przez użytkownika kanałów dla każdego typu powiadomień, które chcesz wyświetlać. Android 9 upraszcza ustawienia kanałów powiadomień dzięki tym zmianom:
Blokowanie grup kanałów: użytkownicy mogą teraz blokować całe grupy kanałów w ustawieniach powiadomień aplikacji. Możesz użyć metody
isBlocked()
, aby określić, kiedy grupa jest zablokowana, i w rezultacie nie wysyłać powiadomień dotyczących kanałów w tej grupie.Dodatkowo aplikacja może wysyłać zapytania o bieżące ustawienia grupy kanałów za pomocą nowej metody
getNotificationChannelGroup()
.Nowe typy intencji rozgłaszania: system Android wysyła teraz intencje rozgłaszania, gdy zmienia się stan blokowania kanałów powiadomień i grup kanałów. Aplikacja, która jest właścicielem zablokowanego kanału lub grupy, może nasłuchiwać tych intencji i odpowiednio reagować. Więcej informacji o tych działaniach i dodatkach znajdziesz na zaktualizowanej liście stałych w
NotificationManager
. Informacje o reagowaniu na intencje transmisji znajdziesz w artykule Transmisje.NotificationManager.Policy
ma 3 nowe kategorie priorytetów trybu Nie przeszkadzać:PRIORITY_CATEGORY_ALARMS
ustala priorytet alarmów.PRIORITY_CATEGORY_MEDIA
nadaje priorytet dźwiękom ze źródeł multimedialnych, takich jak multimedia i nawigacja głosowa.PRIORITY_CATEGORY_SYSTEM
traktuje priorytetowo dźwięki systemowe.
NotificationManager.Policy
ma też 7 nowych stałych trybu Nie przeszkadzać, których możesz używać do tłumienia zakłóceń wizualnych:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
uniemożliwia uruchomienie aktywności pełnoekranowej przez powiadomienie.SUPPRESSED_EFFECT_LIGHTS
blokuje diody powiadomień.SUPPRESSED_EFFECT_PEEK
zapobiega krótkotrwałemu wyświetlaniu powiadomień („podgląd”).SUPPRESSED_EFFECT_STATUS_BAR
uniemożliwia wyświetlanie powiadomień na pasku stanu na urządzeniach, które go obsługują.SUPPRESSED_EFFECT_BADGE
blokuje plakietki na urządzeniach, które je obsługują. Więcej informacji znajdziesz w artykule Modyfikowanie plakietki powiadomienia.SUPPRESSED_EFFECT_AMBIENT
blokuje powiadomienia na urządzeniach obsługujących wygaszacze z powiadomieniami.SUPPRESSED_EFFECT_NOTIFICATION_LIST
uniemożliwia wyświetlanie powiadomień w widoku listy na urządzeniach, które obsługują taki widok, np. w obszarze powiadomień lub na ekranie blokady.
Obsługa wielu aparatów i aktualizacje aparatu
Na urządzeniach z Androidem 9 możesz jednocześnie uzyskiwać dostęp do strumieni z co najmniej 2 fizycznych aparatów. Na urządzeniach z dwoma aparatami przednimi lub tylnymi możesz tworzyć innowacyjne funkcje, które nie są możliwe przy użyciu tylko jednego aparatu, takie jak płynne powiększanie, bokeh i stereoskopia. Interfejs API umożliwia też wywoływanie logicznego lub połączonego strumienia z kamery, który automatycznie przełącza się między 2 lub większą liczbą kamer.
Inne ulepszenia aparatu obejmują dodatkowe parametry sesji, które pomagają zmniejszyć opóźnienia podczas początkowego rejestrowania obrazu, oraz udostępnianie powierzchni, które umożliwia klientom aparatu obsługę różnych przypadków użycia bez konieczności zatrzymywania i uruchamiania strumieniowania z kamery. Dodaliśmy też interfejsy API do obsługi lampy błyskowej opartej na wyświetlaczu i dostęp do sygnatur czasowych OIS na potrzeby stabilizacji obrazu na poziomie aplikacji i efektów specjalnych.
W Androidzie 9 interfejs API wielu aparatów obsługuje aparaty monochromatyczne na urządzeniach z funkcją FULL
lub LIMITED
.
Dane wyjściowe w skali szarości są uzyskiwane w formacieYUV_420_888
z Y jako skalą szarości, U (Cb) jako 128 i V (Cr) jako 128.
Android 9 obsługuje też zewnętrzne kamery USB/UVC na obsługiwanych urządzeniach.
ImageDecoder do rysowania i map bitowych
W Androidzie 9 wprowadzono klasę
ImageDecoder
, która zapewnia nowoczesne podejście do dekodowania obrazów. Używaj tej klasy zamiast interfejsów API BitmapFactory
i BitmapFactory.Options
.
ImageDecoder
umożliwia tworzenie Drawable
lub Bitmap
z bufora bajtów, pliku lub identyfikatora URI. Aby zdekodować obraz, najpierw wywołaj funkcję
createSource()
ze źródłem zakodowanego obrazu. Następnie wywołaj
decodeDrawable()
lub decodeBitmap()
przekazując obiekt ImageDecoder.Source
, aby utworzyć Drawable
lub Bitmap
. Aby zmienić ustawienia domyślne, przekaż wartość OnHeaderDecodedListener
do parametru decodeDrawable()
lub decodeBitmap()
. ImageDecoder
wywołania
onHeaderDecoded()
z domyślną szerokością i wysokością obrazu, gdy tylko będą znane.
Jeśli zakodowany obraz jest animowanym GIF-em lub plikiem WebP, funkcja decodeDrawable()
zwraca wartość Drawable
, która jest instancją klasy AnimatedImageDrawable
.
Właściwości obrazu można ustawić na różne sposoby:
- Aby przeskalować zdekodowany obraz do dokładnego rozmiaru, przekaż wymiary docelowe do funkcji
setTargetSize()
. Możesz też skalować obrazy za pomocą rozmiaru próbki. Przekaż rozmiar próbki bezpośrednio do funkcjisetTargetSampleSize()
. - Aby przyciąć obraz w zakresie przeskalowanego obrazu, wywołaj
setCrop()
. - Aby utworzyć zmienną mapę bitową, przekaż wartość
true
do funkcjisetMutableRequired()
.
ImageDecoder
umożliwia też dodawanie do obrazu niestandardowych i skomplikowanych efektów, takich jak zaokrąglone rogi czy maski w kształcie koła. Użyj
setPostProcessor()
z instancją klasy
PostProcessor
do wykonania dowolnych poleceń rysowania.
Animacja
W Androidzie 9 wprowadzono klasę
AnimatedImageDrawable
do rysowania i wyświetlania animowanych obrazów GIF i WebP.
AnimatedImageDrawable
działa podobnie do
AnimatedVectorDrawable
w tym sensie, że wątek renderowania steruje animacjami AnimatedImageDrawable
.
Wątek renderowania używa też wątku roboczego do dekodowania, aby dekodowanie nie zakłócało innych operacji w tym wątku. Ta implementacja umożliwia wyświetlanie animowanego obrazu w aplikacji bez zarządzania jego aktualizacjami i bez zakłócania innych zdarzeń w wątku interfejsu aplikacji.
AnimatedImageDrawable
można dekodować za pomocą instancji ImageDecoder
. Poniższy fragment kodu pokazuje, jak używać funkcji ImageDecoder
do dekodowania AnimatedImageDrawable
:
Kotlin
@Throws(IOException::class) private fun decodeImage() { val decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(resources, R.drawable.my_drawable)) // Prior to start(), the first frame is displayed. (decodedAnimation as? AnimatedImageDrawable)?.start() }
Java
private void decodeImage() throws IOException { Drawable decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(getResources(), R.drawable.my_drawable)); if (decodedAnimation instanceof AnimatedImageDrawable) { // Prior to start(), the first frame is displayed. ((AnimatedImageDrawable) decodedAnimation).start(); } }
ImageDecoder
oferuje kilka metod, które pozwalają dodatkowo modyfikować obraz.
Możesz na przykład użyć metody setPostProcessor()
, aby zmodyfikować wygląd obrazu, np. zastosować maskę w kształcie koła lub zaokrąglone rogi.
Wideo HDR VP9, kompresja obrazów HEIF i interfejsy API multimediów
Android 9 ma wbudowaną obsługę High Dynamic Range (HDR) VP9 Profile 2, dzięki czemu możesz dostarczać filmy HDR użytkownikom z YouTube, Filmów Play i innych źródeł na urządzeniach obsługujących HDR.
Android 9 obsługuje też kodowanie obrazów w formacie HEIF (High Efficiency Image File) lub HEIC, co zwiększa kompresję i zmniejsza ilość miejsca na dane oraz zużycie danych sieciowych. Przykłady zdjęć HEIF są obsługiwane w klasach MediaMuxer
i MediaExtractor
. Dzięki obsłudze platformy na urządzeniach z Androidem 9 możesz łatwo wysyłać i wykorzystywać obrazy HEIF z serwera backendu. Po upewnieniu się, że aplikacja jest zgodna z tym formatem danych do udostępniania i wyświetlania, wypróbuj HEIF jako format przechowywania obrazów w aplikacji. Możesz przekonwertować plik JPEG na HEIC za pomocą ImageDecoder
lub BitmapFactory
(który uzyskuje bitmapę z pliku JPEG). Możesz wtedy użyć HeifWriter
do zapisywania statycznych obrazów HEIF z buforów bajtowych YUV lub instancji Surface
lub Bitmap
.
Wskaźniki dotyczące multimediów są też dostępne w klasach AudioTrack
, AudioRecord
i MediaDrm
.
Android 9 wprowadza metody do klasy MediaDRM
, które umożliwiają uzyskiwanie danych, poziomów HDCP, poziomów zabezpieczeń i liczby sesji, a także większą kontrolę nad poziomami zabezpieczeń i bezpiecznymi zatrzymaniami. Szczegółowe informacje znajdziesz w raporcie API Diff.
W Androidzie 9 interfejs AAudio API dodaje obsługę kilku dodatkowych atrybutów AAudioStream, w tym użycia, typu treści i ustawienia wstępnego wejścia. Za pomocą tych atrybutów możesz tworzyć strumienie dostosowane do aplikacji VoIP lub kamery. Możesz też ustawić identyfikator sesji, aby powiązać strumień AAudio z podmiksem, który może zawierać efekty. Użyj interfejsu API AudioEffect
, aby sterować efektami.
W Androidzie 9 wprowadzono interfejs AudioEffect
API do przetwarzania dynamiki.
Ta klasa umożliwia tworzenie efektów audio opartych na kanałach, w tym korekcji, kompresji wielopasmowej i limitera, na wielu etapach. Liczbę pasm i aktywnych etapów można skonfigurować, a większość parametrów można kontrolować w czasie rzeczywistym.
Wrażliwość na koszty danych w JobScheduler
Od Androida 9 JobScheduler
może używać sygnałów stanu sieci dostarczanych przez operatorów, aby usprawnić obsługę zadań związanych z siecią.
Zadania mogą deklarować szacowany rozmiar danych, sygnalizować wstępne pobieranie i określać szczegółowe wymagania sieciowe. JobScheduler
zarządza pracą w zależności od stanu sieci. Na przykład gdy sieć sygnalizuje, że jest przeciążona, JobScheduler
może odraczać duże żądania sieciowe. W sieci bez limitu danych JobScheduler
może uruchamiać zadania wstępnego pobierania, aby poprawić komfort użytkowania, np. wstępnie pobierać nagłówki.
Podczas dodawania zadań używaj w razie potrzeby tagów setEstimatedNetworkBytes()
, setPrefetch()
i setRequiredNetwork()
, aby JobScheduler
mogła prawidłowo wykonać pracę. Gdy zadanie zostanie wykonane, użyj obiektu Network
zwróconego przez JobParameters.getNetwork()
.
W przeciwnym razie będziesz niejawnie korzystać z domyślnej sieci urządzenia, która może nie spełniać Twoich wymagań i powodować niezamierzone zużycie danych.
Neural Networks API 1.1
Interfejs Neural Networks API został wprowadzony w Androidzie 8.1 (API na poziomie 27), aby przyspieszyć uczenie maszynowe na urządzeniach z Androidem. Android 9 rozszerza i ulepsza interfejs API, dodając obsługę 9 nowych operacji:
- Operacje matematyczne na poszczególnych elementach:
- Operacje na tablicach:
Znany problem: podczas przekazywania tensorów ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
do operacji ANEURALNETWORKS_PAD
, która jest dostępna na Androidzie 9 i nowszych, dane wyjściowe z NNAPI mogą nie odpowiadać danym wyjściowym z frameworków uczenia maszynowego wyższego poziomu, takich jak TensorFlow Lite. Zamiast tego przesyłaj tylko
ANEURALNETWORKS_TENSOR_FLOAT32
, dopóki problem nie zostanie rozwiązany.
Dodatkowo interfejs API wprowadza nową funkcję ANeuralNetworksModel_relaxComputationFloat32toFloat16()
, która pozwala określić, czy obliczać ANEURALNETWORKS_TENSOR_FLOAT32
z zakresem i precyzją tak niskimi jak w przypadku 16-bitowego formatu zmiennoprzecinkowego IEEE 754.
Platforma autouzupełniania
Android 9 wprowadza wiele ulepszeń, które mogą wdrożyć usługi autouzupełniania, aby jeszcze bardziej zwiększyć wygodę użytkowników podczas wypełniania formularzy. Więcej informacji o korzystaniu z funkcji autouzupełniania w aplikacji znajdziesz w przewodniku Autofill Framework (w języku angielskim).
Ulepszenia zabezpieczeń
Android 9 wprowadza wiele funkcji zabezpieczeń, które podsumowano w sekcjach poniżej:
Zabezpieczone potwierdzenie w Androidzie
Na obsługiwanych urządzeniach z Androidem 9 lub nowszym możesz korzystać z potwierdzenia chronionego przez Androida. W tym procesie aplikacja wyświetla użytkownikowi prompt z prośbą o zatwierdzenie krótkiego oświadczenia. To oświadczenie pozwala aplikacji potwierdzić, że użytkownik chce dokonać transakcji wymagającej szczególnej ostrożności, np. płatności.
Jeśli użytkownik zaakceptuje oświadczenie, usługa Android Keystore otrzyma i zapisze podpis kryptograficzny chroniony przez kod uwierzytelniający wiadomości przy użyciu wartości hash (HMAC) w formie kluczy. Gdy usługa Android Keystore potwierdzi ważność wiadomości, aplikacja może użyć klucza wygenerowanego na podstawie trustedConfirmationRequired
w zaufanym środowisku wykonawczym (TEE) do podpisania wiadomości zaakceptowanej przez użytkownika. Podpis z dużą dozą pewności wskazuje, że użytkownik zapoznał się z oświadczeniem i je zaakceptował.
Ostrzeżenie: potwierdzenie chronione na Androidzie nie zapewnia użytkownikowi bezpiecznego kanału informacji. Aplikacja nie może zakładać żadnych gwarancji poufności poza tymi, które oferuje platforma Android. W szczególności nie używaj tego procesu do wyświetlania informacji poufnych, których zwykle nie pokazujesz na urządzeniu użytkownika.
Wskazówki dotyczące dodawania obsługi potwierdzenia chronionego na Androidzie znajdziesz w przewodniku Potwierdzenie chronione na Androidzie.
Ujednolicone okno uwierzytelniania biometrycznego
W Androidzie 9 system wyświetla okna uwierzytelniania biometrycznego w imieniu aplikacji. Ta funkcja zapewnia standardowy wygląd, działanie i umiejscowienie okna, dzięki czemu użytkownicy mają większą pewność, że uwierzytelniają się za pomocą zaufanego narzędzia do sprawdzania danych biometrycznych.
Jeśli Twoja aplikacja używa
FingerprintManager
do wyświetlania użytkownikom okna uwierzytelniania odciskiem palca, zacznij używać
BiometricPrompt
zamiast niego. BiometricPrompt
polega na wyświetlaniu okna uwierzytelniania przez system. Zmienia też swoje działanie, aby dostosować się do wybranego przez użytkownika rodzaju uwierzytelniania biometrycznego.
Moduł zabezpieczeń sprzętowych
Na obsługiwanych urządzeniach z Androidem 9 lub nowszym może być zainstalowany KeyMint (wcześniej Keymaster) StrongBox, czyli implementacja interfejsu HAL KeyMint (wcześniej Keymaster) znajdująca się w sprzętowym module zabezpieczeń. Moduł zawiera:
- własny procesor,
- Bezpieczne przechowywanie.
- prawdziwy generator liczb losowych,
- Dodatkowe mechanizmy zapobiegające nieuprawnionym modyfikacjom pakietów i instalowaniu aplikacji z zewnętrznych źródeł.
Podczas sprawdzania kluczy przechowywanych w StrongBox KeyMint system potwierdza integralność klucza w zaufanym środowisku wykonawczym (TEE).
Więcej informacji o używaniu StrongBox KeyMint znajdziesz w sekcji Moduł zabezpieczeń sprzętowych.
Bezpieczne importowanie klucza do magazynu kluczy
Android 9 zapewnia dodatkowe zabezpieczenia odszyfrowywania kluczy, ponieważ umożliwia bezpieczne importowanie zaszyfrowanych kluczy do magazynu kluczy za pomocą formatu klucza zakodowanego w ASN.1. Następnie KeyMint odszyfrowuje klucze w Keystore, dzięki czemu zawartość kluczy nigdy nie pojawia się w pamięci hosta urządzenia w postaci zwykłego tekstu.
Dowiedz się więcej o bezpieczniejszym importowaniu zaszyfrowanych kluczy.
Schemat podpisu plików APK z rotacją kluczy
Android 9 obsługuje schemat podpisu plików APK w wersji 3. Ten schemat umożliwia uwzględnienie w bloku podpisu rekordu potwierdzającego rotację dla każdego certyfikatu podpisu. Ta funkcja umożliwia podpisanie aplikacji nowym certyfikatem podpisywania przez powiązanie poprzednich certyfikatów podpisywania pliku APK z certyfikatem, którym jest on teraz podpisany.
Dowiedz się więcej o wykonywaniu rotacji kluczy za pomocą apksigner
.
Opcja zezwalania na odszyfrowywanie klucza tylko na odblokowanych urządzeniach
W Androidzie 9 wprowadzono flagę unlockedDeviceRequired
. Ta opcja określa, czy przed zezwoleniem na odszyfrowanie danych przesyłanych lub przechowywanych przy użyciu określonego klucza magazyn kluczy wymaga odblokowania ekranu. Te typy kluczy doskonale nadają się do szyfrowania poufnych danych, takich jak dane dotyczące zdrowia lub dane firmowe, które mają być przechowywane na dysku. Flaga zapewnia użytkownikom większą pewność, że dane nie mogą zostać odszyfrowane, gdy urządzenie jest zablokowane, w przypadku zgubienia lub kradzieży telefonu.
Aby zabezpieczyć klucz przed odszyfrowaniem, gdy urządzenie jest zablokowane, włącz flagę, przekazując wartość true
do metody setUnlockedDeviceRequired()
. Po wykonaniu tego kroku, gdy ekran użytkownika jest zablokowany, wszelkie próby odszyfrowania lub podpisania danych za pomocą tego klucza nie powiodą się. Aby uzyskać dostęp do zablokowanego urządzenia, musisz podać kod PIN, hasło, odcisk palca lub inny zaufany czynnik.
Obsługa starszego szyfrowania
Urządzenia z Androidem 9, które są dostarczane z Keymasterem 4, obsługują algorytm Triple Data Encryption Algorithm, czyli Triple DES. Jeśli Twoja aplikacja współpracuje ze starszymi systemami, które wymagają algorytmu Triple DES, używaj tego typu szyfrowania do szyfrowania poufnych danych logowania.
Więcej informacji o tym, jak zwiększyć bezpieczeństwo aplikacji, znajdziesz w artykule Bezpieczeństwo dla deweloperów aplikacji na Androida.
Wycofanie WPS
Funkcja WPS została wycofana ze względów bezpieczeństwa.
Kopie zapasowe Androida
Android 9 wprowadza nowe funkcje i opcje dla programistów związane z tworzeniem i przywracaniem kopii zapasowych. Szczegółowe informacje o tych zmianach znajdziesz w kolejnych sekcjach.
kopie zapasowe szyfrowane po stronie klienta,
Android 9 umożliwia szyfrowanie kopii zapasowych Androida z użyciem zabezpieczenia po stronie klienta. Ta funkcja jest włączana automatycznie, gdy spełnione są te warunki:
- Użytkownik włączył kopię zapasową na urządzeniu z Androidem 9 lub nowszym.
- Użytkownik ustawił blokadę ekranu na urządzeniu, która wymaga podania kodu PIN, wzoru lub hasła do odblokowania.
Gdy to zabezpieczenie prywatności jest włączone, do przywrócenia danych z kopii zapasowych utworzonych na urządzeniu użytkownika wymagany jest kod PIN, wzór lub hasło urządzenia. Więcej informacji o technologii, która stoi za tą funkcją, znajdziesz w dokumencie Google Cloud Key Vault Service.
Określanie warunków, które muszą być spełnione na urządzeniu, aby można było utworzyć kopię zapasową
Jeśli dane aplikacji zawierają informacje lub preferencje o charakterze poufnym, Android 9 umożliwia określenie warunków urządzenia, w których dane aplikacji są uwzględniane w kopii zapasowej użytkownika, np. gdy włączone jest szyfrowanie po stronie klienta lub gdy odbywa się lokalne przesyłanie danych z urządzenia na urządzenie.
Więcej informacji o tworzeniu kopii zapasowej danych na urządzeniach z Androidem znajdziesz w artykule Omówienie kopii zapasowej danych.
Ułatwienia dostępu
Android 9 wprowadza ulepszenia w zakresie ułatwień dostępu, które pozwalają zapewnić użytkownikom aplikacji jeszcze lepsze wrażenia.
Semantyka nawigacji
Atrybuty dodane w Androidzie 9 ułatwiają określanie, w jaki sposób usługi ułatwień dostępu, zwłaszcza czytniki ekranu, poruszają się po ekranie. Te atrybuty mogą pomóc użytkownikom z wadami wzroku szybko poruszać się po tekście w interfejsie aplikacji i dokonywać wyboru.
Na przykład w aplikacji zakupowej czytnik ekranu może pomóc użytkownikom w przechodzeniu bezpośrednio z jednej kategorii ofert do drugiej bez konieczności odczytywania wszystkich elementów w kategorii przed przejściem do następnej.
Tytuły paneli ułatwień dostępu
W Androidzie 8.1 (poziom interfejsu API 27) i starszych wersjach usługi ułatwień dostępu nie zawsze mogą określić, kiedy zaktualizowano określony panel ekranu, np. gdy działanie zastępuje jeden fragment innym. Panele składają się z logicznie pogrupowanych, wizualnie powiązanych elementów interfejsu, które zwykle tworzą fragment.
W Androidzie 9 możesz podać tytuły paneli ułatwień dostępu lub tytuły, które można indywidualnie zidentyfikować. Jeśli panel ma tytuł panelu ułatwień dostępu, usługi ułatwień dostępu otrzymują bardziej szczegółowe informacje, gdy panel się zmienia. Ta funkcja umożliwia usługom przekazywanie użytkownikowi bardziej szczegółowych informacji o zmianach w interfejsie.
Aby określić tytuł panelu, użyj atrybutu
android:accessibilityPaneTitle
. Możesz też zaktualizować tytuł panelu interfejsu, który jest zastępowany w czasie działania programu, za pomocą funkcji setAccessibilityPaneTitle()
.
Możesz na przykład podać tytuł obszaru treści obiektu Fragment
.
Nawigacja oparta na nagłówkach
Jeśli aplikacja wyświetla treści tekstowe zawierające logiczne nagłówki, ustaw atrybut
android:accessibilityHeading
na wartość true
w przypadku wystąpień
View
, które reprezentują te nagłówki. Dodając te nagłówki, umożliwiasz usługom ułatwień dostępu pomaganie użytkownikom w przechodzeniu bezpośrednio od jednego nagłówka do drugiego. Każda usługa ułatwień dostępu może korzystać z tej funkcji, aby zwiększyć komfort nawigacji po interfejsie.
Nawigacja i generowanie mowy w grupach
Czytniki ekranu tradycyjnie używają atrybutu android:focusable
, aby określić, kiedy powinny odczytywać element ViewGroup
lub kolekcję obiektów View
jako pojedynczą jednostkę. Dzięki temu użytkownicy będą wiedzieć, że widoki są ze sobą logicznie powiązane.
W Androidzie 8.1 i starszych musisz oznaczyć każdy obiekt View
w ViewGroup
jako nieprzeznaczony do zaznaczania, a sam element ViewGroup
jako przeznaczony do zaznaczania. W niektórych przypadkach powodowało to, że element View
był oznaczany jako element, na którym można ustawić fokus, co utrudniało nawigację za pomocą klawiatury.
Od Androida 9 możesz używać atrybutu android:screenReaderFocusable
zamiast atrybutu android:focusable
w sytuacjach, w których ustawienie obiektu View
jako elementu, na którym można ustawić fokus, ma niepożądane konsekwencje. Czytniki ekranu zaznaczają wszystkie elementy, w których atrybut android:screenReaderFocusable
lub android:focusable
ma wartość true
.
Wygodne działania
Android 9 umożliwia wykonywanie działań w imieniu użytkowników:
- Interakcja z etykietkami
- Dodane funkcje w platformie ułatwień dostępu zapewniają dostęp do dymków w interfejsie aplikacji. Użyj
getTooltipText()
, aby odczytać tekst etykietki, orazACTION_SHOW_TOOLTIP
iACTION_HIDE_TOOLTIP
, aby poinstruować instancjeView
, aby wyświetlały lub ukrywały etykietki. - Dodano działania globalne
- Android 9 wprowadza obsługę 2 dodatkowych działań na urządzeniu w klasie
AccessibilityService
Usługa może pomagać użytkownikom w blokowaniu urządzeń i robieniu zrzutów ekranu za pomocą działańGLOBAL_ACTION_LOCK_SCREEN
iGLOBAL_ACTION_TAKE_SCREENSHOT
.
Szczegóły zmiany okna
Android 9 ułatwia śledzenie aktualizacji okien aplikacji, gdy aplikacja ponownie rysuje wiele okien jednocześnie. Gdy wystąpi zdarzenieTYPE_WINDOWS_CHANGED
, użyj interfejsu APIgetWindowChanges()
, aby określić, jak zmieniły się okna. Podczas aktualizacji w wielu oknach każde okno generuje własny zestaw zdarzeń.
getSource()
Metoda zwraca widok główny okna powiązanego z każdym zdarzeniem.
Jeśli aplikacja ma zdefiniowane tytuły paneli ułatwień dostępu dla obiektów View
, usługa może rozpoznawać, kiedy interfejs aplikacji jest aktualizowany. Gdy wystąpi zdarzenie TYPE_WINDOW_STATE_CHANGED
, użyj typów zwracanych przez getContentChangeTypes()
, aby określić, jak zmieniło się okno. Na przykład może wykrywać, kiedy panel ma nowy tytuł lub kiedy zniknął.
Obrót
Aby wyeliminować przypadkowe obracanie, dodaliśmy tryb, który blokuje bieżącą orientację nawet wtedy, gdy pozycja urządzenia się zmieni. Użytkownicy mogą w razie potrzeby ręcznie wywołać obracanie, naciskając przycisk na pasku systemowym.
W większości przypadków wpływ na zgodność aplikacji jest minimalny. Jeśli jednak Twoja aplikacja ma niestandardowe zachowanie związane z obracaniem ekranu lub używa nietypowych ustawień orientacji ekranu, możesz napotkać problemy, które wcześniej byłyby niezauważalne, gdy preferencje użytkownika dotyczące obracania ekranu były zawsze ustawione na orientację pionową. Zachęcamy do sprawdzenia zachowania rotacji we wszystkich kluczowych aktywnościach aplikacji i upewnienia się, że wszystkie ustawienia orientacji ekranu nadal zapewniają optymalne wrażenia.
Więcej informacji znajdziesz w artykule o zmianach w zachowaniu.

Nowy tryb obracania umożliwia użytkownikom ręczne włączanie obracania w razie potrzeby za pomocą przycisku na pasku systemowym.
Tekst
Android 9 wprowadza na platformę te funkcje związane z tekstem:
Wstępnie obliczony tekst: klasa
PrecomputedText
zwiększa wydajność renderowania tekstu, umożliwiając wcześniejsze obliczanie i buforowanie wymaganych informacji. Umożliwia też aplikacji wykonywanie układu tekstu poza głównym wątkiem.Lupa: klasa
Magnifier
to widżet platformy, który udostępnia interfejs API lupy, co pozwala na spójne korzystanie z funkcji lupy we wszystkich aplikacjach.Inteligentne linkowanie: Android 9 rozszerza klasę
TextClassifier
, która wykorzystuje uczenie maszynowe do rozpoznawania niektórych encji w wybranym tekście i sugerowania działań. Na przykładTextClassifier
może umożliwić aplikacji wykrycie, że użytkownik wybrał numer telefonu. Aplikacja może wtedy zasugerować użytkownikowi wykonanie połączenia telefonicznego przy użyciu tego numeru. Funkcje wTextClassifier
zastępują funkcjonalność klasyLinkify
.Układ tekstu: kilka wygodnych metod i atrybutów ułatwia implementację projektu interfejsu. Szczegółowe informacje znajdziesz w dokumentacji referencyjnej dotyczącej
TextView
.
Konwersja plików DEX z wyprzedzeniem w ART
Na urządzeniach z Androidem 9 lub nowszym kompilator ART (Android Runtime) dodatkowo optymalizuje skompresowane pliki wykonywalne Dalvik (DEX), przekształcając je w bardziej kompaktową postać. Dzięki tej zmianie aplikacja będzie się szybciej uruchamiać i zajmować mniej miejsca na dysku oraz pamięci RAM.
Ta zmiana jest szczególnie korzystna w przypadku urządzeń z niższej półki, które mają wolniejsze prędkości wejścia/wyjścia dysku.
Śledzenie systemu na urządzeniu
Android 9 umożliwia nagrywanie śladów systemowych na urządzeniu, a następnie udostępnianie raportu z tymi nagraniami zespołowi deweloperów. Ten raport obsługuje wiele formatów, w tym HTML.
Zbierając te ślady, możesz rejestrować dane o czasie związane z procesami i wątkami aplikacji oraz wyświetlać inne rodzaje stanów urządzenia o znaczeniu globalnym.
Więcej informacji o tym narzędziu znajdziesz w artykule Przeprowadzanie śledzenia systemu na urządzeniu.