Android 9 (poziom 28 interfejsu API) wprowadza nowe 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 różnic w interfejsie API lub w dokumentacji interfejsu Android API. 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 Wi-Fi IEEE 802.11-2016, znanego też jako Wi-Fi Round-Trip-Time (RTT), aby umożliwić korzystanie z pozycjonowania w pomieszczeniach w aplikacjach.
Na urządzeniach z Androidem 9, które obsługują sprzętowo pomiar czasu RTT, 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 sekcji Ustawienia > 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. Zwykle dokładność wyniku wynosi 1–2 metry.
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 w ekranie za pomocą emulatora
Android 9 obsługuje najnowsze ekrany od krawędzi do krawędzi, które mają wycięcia na kamery 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. Możesz ustawić ten atrybut na jedną z tych wartości:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULTLAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGESLAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Wycięcie ekranu 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 poziom interfejsu API 28 i nowszy.
MessagingStyle z załą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 wiadomości
Od Androida 7.0 (API na poziomie 24) możesz dodawać działania, które umożliwiają odpowiadanie na wiadomości lub wpisywanie innego tekstu bezpośrednio z poziomu powiadomienia. Android 9 ulepsza tę funkcję dzięki tym zmianom:
Uproszczona obsługa uczestników rozmowy: klasa
Personsł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, takich jakaddMessage(), korzysta teraz z klasyPersonzamiast z klasyCharSequence. KlasaPersonobsługuje też wzorzec projektowy Builder.Obsługa obrazów: Android 9 wyświetla teraz obrazy w powiadomieniach o wiadomościach na telefonach. Aby wyświetlić obraz, możesz użyć
setData()w wiadomości. Poniższy fragment kodu pokazuje, jak utworzyćPersoni wiadomość zawierającą 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ć wiadomości
EXTRA_REMOTE_INPUT_DRAFTwysł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łaniu znaczenia semantycznego, np. „oznacz jako przeczytane”, „usuń”, „odpowiedz” itp.Inteligentna odpowiedź: Android 9 obsługuje te same sugerowane odpowiedzi, które są dostępne w aplikacji do obsługi wiadomości. Użyj
RemoteInput.setChoices(), aby udostępnić użytkownikowi szereg 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 w zaktualizowanej liście stałych w
NotificationManager. Więcej informacji o reagowaniu na intencje transmisji znajdziesz w rozdziale Transmisje.NotificationManager.Policyma 3 nowe kategorie priorytetów trybu Nie przeszkadzać:PRIORITY_CATEGORY_ALARMSnadaje priorytet alarmom.PRIORITY_CATEGORY_MEDIAnadaje priorytet dźwiękom ze źródeł multimedialnych, takich jak multimedia i nawigacja głosowa.PRIORITY_CATEGORY_SYSTEMtraktuje priorytetowo dźwięki systemowe.
NotificationManager.Policyma też 7 nowych stałych trybu „Nie przeszkadzać”, których możesz używać do wyciszania przerw wizualnych:SUPPRESSED_EFFECT_FULL_SCREEN_INTENTzapobiega uruchamianiu aktywności pełnoekranowej przez powiadomienie.SUPPRESSED_EFFECT_LIGHTSblokuje diody powiadomień.SUPPRESSED_EFFECT_PEEKzapobiega krótkotrwałemu wyświetlaniu powiadomień („podglądaniu”).SUPPRESSED_EFFECT_STATUS_BARuniemożliwia wyświetlanie powiadomień na pasku stanu na urządzeniach, które go obsługują.SUPPRESSED_EFFECT_BADGEblokuje odznaki na urządzeniach obsługujących odznaki. Więcej informacji znajdziesz w artykule Modyfikowanie plakietki powiadomienia.SUPPRESSED_EFFECT_AMBIENTblokuje powiadomienia na urządzeniach obsługujących wygaszacze z powiadomieniami.SUPPRESSED_EFFECT_NOTIFICATION_LISTzapobiega wyświetlaniu 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 aparatów
Na urządzeniach z Androidem 9 możesz jednocześnie uzyskiwać dostęp do strumieni z co najmniej 2 fizycznych kamer. Na urządzeniach z podwójnym aparatem przednim lub tylnym możesz tworzyć innowacyjne funkcje, które nie są możliwe w przypadku pojedynczego aparatu, takie jak płynny zoom, efekt bokeh i widzenie stereoskopowe. 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 strumienia z kamery. Dodaliśmy też interfejsy API do obsługi lampy błyskowej opartej na wyświetlaczu i dostęp do znaczników czasu OIS na potrzeby stabilizacji obrazu na poziomie aplikacji i efektów specjalnych.
W Androidzie 9 interfejs API wielu kamer obsługuje kamery monochromatyczne na urządzeniach z funkcją FULL lub LIMITED.
Monochromatyczne dane wyjściowe są uzyskiwane w formacie YUV_420_888, w którym Y to skala szarości, U (Cb) to 128, a V (Cr) to 128.
Android 9 umożliwia też obsługę zewnętrznych kamer USB/UVC na obsługiwanych urządzeniach.
ImageDecoder do rysowalnych i map bitowych
Android 9 wprowadza 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 utworzenie Drawable lub Bitmap z bufora bajtów, pliku lub identyfikatora URI. Aby zdekodować obraz, najpierw wywołaj
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ż OnHeaderDecodedListener do decodeDrawable() lub decodeBitmap(). ImageDecoder wywołuje funkcję
onHeaderDecoded()
z domyślną szerokością i wysokością obrazu, gdy tylko są one 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ż
truedosetMutableRequired().
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 jak AnimatedVectorDrawable, ponieważ wątek renderowania steruje animacjami AnimatedImageDrawable.
Wątek renderowania używa też wątku instancji roboczej do dekodowania, aby dekodowanie nie zakłócało innych operacji w wątku renderowania. Ta implementacja umożliwia aplikacji wyświetlanie animowanego obrazu bez zarządzania jego aktualizacjami ani zakłócania innych zdarzeń w wątku UI aplikacji.
AnimatedImageDrawable można zdekodować za pomocą instancji ImageDecoder. Poniższy fragment kodu pokazuje, jak użyć 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 umożliwiają dalsze modyfikowanie obrazu.
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ę profilu 2 VP9 High Dynamic Range (HDR), dzięki czemu możesz dostarczać użytkownikom filmy w HDR z YouTube, Filmy 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 poprawia kompresję i zmniejsza zużycie miejsca na dane i transmisji danych w sieci. Próbki nieruchomych obrazów 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). Następnie możesz użyć HeifWriter, aby zapisywać obrazy statyczne HEIF z buforów bajtów YUV lub instancji Surface albo Bitmap.
Dane o mediach 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 bezpieczeństwa i liczby sesji, a także większą kontrolę nad poziomami bezpieczeństwa i bezpiecznymi zatrzymaniami. Szczegółowe informacje znajdziesz w raporcie różnic w interfejsie API.
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 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
Począwszy 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ć pobieranie wstępne 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 przypadku połączenia z siecią bez limitu danych JobScheduler może uruchamiać zadania wstępnego pobierania, aby poprawić wrażenia użytkownika, np. wstępnie pobierając nagłówki.
Podczas dodawania zadań używaj w razie potrzeby tagów setEstimatedNetworkBytes(), setPrefetch() i setRequiredNetwork(), aby usługa JobScheduler mogła prawidłowo wykonać pracę. Po wykonaniu zadania użyj obiektu Network zwróconego przez JobParameters.getNetwork().
W przeciwnym razie będziesz 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 (interfejs 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 nowszym, 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.
Interfejs API wprowadza też nową funkcję ANeuralNetworksModel_relaxComputationFloat32toFloat16(), która umożliwia określenie, czy obliczać ANEURALNETWORKS_TENSOR_FLOAT32 z zakresem i precyzją tak niskimi jak w przypadku 16-bitowej reprezentacji zmiennoprzecinkowej IEEE 754.
Platforma autouzupełniania
Android 9 wprowadza wiele ulepszeń, które mogą być wykorzystywane przez usługi autouzupełniania w celu zwiększenia wygody użytkowników podczas wypełniania formularzy. Więcej informacji o korzystaniu z funkcji autouzupełniania w aplikacji znajdziesz w przewodniku Platforma autouzupełniania.
ulepszenia zabezpieczeń,
Android 9 wprowadza szereg funkcji zabezpieczeń, które zostały podsumowane w kolejnych sekcjach:
Zabezpieczone potwierdzenie w Androidzie
Na obsługiwanych urządzeniach z Androidem 9 lub nowszym możesz korzystać z funkcji Zabezpieczone potwierdzenie w Androidzie. W ramach tego procesu aplikacja wyświetla użytkownikowi 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 uwierzytelniania wiadomości z haszowaniem kluczowym (HMAC). 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 bardzo wysokim prawdopodobieństwem wskazuje, że użytkownik zapoznał się z oświadczeniem i wyraził na nie zgodę.
Uwaga: Zabezpieczone potwierdzenie w 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 przepływu pracy do wyświetlania informacji poufnych, których zwykle nie pokazujesz na urządzeniu użytkownika.
Wskazówki dotyczące dodawania obsługi zabezpieczonego potwierdzenia w Androidzie znajdziesz w przewodniku Zabezpieczone potwierdzenie w 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. BiometricPrompt polega na wyświetlaniu okna uwierzytelniania przez system. Zmienia też swoje działanie, aby dostosować się do wybranego przez użytkownika typu uwierzytelniania biometrycznego.
Moduł zabezpieczeń sprzętowych
Obsługiwane urządzenia z Androidem 9 lub nowszym mogą mieć StrongBox KeyMint (wcześniej Keymaster), czyli implementację KeyMint (wcześniej Keymaster) HAL, która znajduje się w sprzętowym module zabezpieczeń. Moduł zawiera:
- własny procesor,
- Bezpieczne miejsce na dane.
- prawdziwy generator liczb losowych;
- Dodatkowe mechanizmy zapobiegające nieuprawnionym modyfikacjom pakietów i nieautoryzowanemu 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 artykule Moduł zabezpieczeń sprzętowych.
Bezpieczny import 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. KeyMint odszyfrowuje klucze w Keystore, więc 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 podpisywania plików APK z rotacją kluczy
Android 9 wprowadza obsługę schematu podpisywania 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
Android 9 wprowadza flagę unlockedDeviceRequired. Ta opcja określa, czy przed zezwoleniem na odszyfrowanie danych przesyłanych lub przechowywanych przy użyciu określonego klucza Keystore wymaga odblokowania ekranu. Te typy kluczy doskonale nadają się do szyfrowania danych wrażliwych, 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ę. Zablokowane urządzenie wymaga podania kodu PIN, hasła, odcisku palca lub innego zaufanego czynnika, zanim będzie można uzyskać do niego dostęp.
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
Protokół Wi-Fi Protected Setup (WPS) został wycofany 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 sekcjach poniżej.
kopie zapasowe szyfrowane po stronie klienta,
Android 9 wprowadza obsługę szyfrowania kopii zapasowych Androida za pomocą klucza tajnego po stronie klienta. Ta obsługa jest włączana automatycznie, gdy są spełnione te warunki:
- Użytkownik ma włączoną 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 ustawienie 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 zapasowych danych na urządzeniach z Androidem znajdziesz w Przegląd tworzenia kopii zapasowych danych.
Ułatwienia dostępu
Android 9 wprowadza ulepszenia w zakresie ułatwień dostępu, które ułatwiają zapewnianie użytkownikom aplikacji jeszcze lepszych wrażeń.
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ę między różnymi częściami ekranu. Te atrybuty mogą pomóc użytkownikom z wadami wzroku w szybkim poruszaniu się po tekście w interfejsie aplikacji i umożliwić im dokonanie wyboru.
Na przykład w aplikacji do zakupów czytnik ekranu może pomóc użytkownikom w przechodzeniu bezpośrednio z jednej kategorii ofert do drugiej bez konieczności odczytywania wszystkich produktów w danej kategorii przed przejściem do następnej.
Tytuły paneli ułatwień dostępu
W Androidzie 8.1 (interfejs API na poziomie 27) i starszych wersjach usługi ułatwień dostępu nie zawsze mogą określić, kiedy zaktualizowano określony panel ekranu, np. gdy aktywność zastępuje jeden fragment innym. Panele składają się z logicznie pogrupowanych, powiązanych wizualnie 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, za pomocą setAccessibilityPaneTitle().
Możesz na przykład podać tytuł obszaru treści obiektu Fragment.
Nawigacja według nagłówków
Jeśli aplikacja wyświetla treści tekstowe zawierające logiczne nagłówki, ustaw atrybut
android:accessibilityHeading
na true w przypadku wystąpień elementu
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 ułatwić użytkownikom poruszanie się po interfejsie.
Nawigacja po grupach i generowanie danych wyjściowych
Czytniki ekranu tradycyjnie używają atrybutu android:focusable, aby określić, kiedy powinny odczytywać element ViewGroup lub zbiór obiektów View jako jedną całość. 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
skupiają się na wszystkich elementach, w których atrybut android:screenReaderFocusable
lub android:focusable ma wartość true.
Wygodne działania
Android 9 umożliwia wykonywanie wygodnych 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_TOOLTIPiACTION_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_SCREENiGLOBAL_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 zdarzenie
TYPE_WINDOWS_CHANGED, użyj interfejsu API
getWindowChanges(), aby określić, jak zmieniły się przedziały. Podczas aktualizacji w wielu oknach każde okno generuje własny zestaw zdarzeń.
Metoda getSource()
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 platforma 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 włączyć 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 działaniu.
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:
PrecomputedText: klasa
PrecomputedTextzwiększa wydajność renderowania tekstu, umożliwiając obliczanie i buforowanie wymaganych informacji z wyprzedzeniem. Umożliwia też aplikacji wykonywanie układu tekstu poza wątkiem głównym.Lupa: klasa
Magnifierto widżet platformy, który udostępnia interfejs API lupy, co pozwala na spójne działanie funkcji lupy we wszystkich aplikacjach.Inteligentne linkowanie: Android 9 ulepsza klasę
TextClassifier, która wykorzystuje uczenie maszynowe do rozpoznawania niektórych encji w wybranym tekście i sugerowania działań. Na przykładTextClassifiermoż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 wTextClassifierzastę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.
Wcześniejsza kompilacja plików DEX przez ART
Na urządzeniach z Androidem 9 lub nowszym kompilator ART (środowisko wykonawcze Androida) dodatkowo optymalizuje skompresowane pliki wykonywalne Dalvik (DEX), przekształcając pliki DEX w pakiecie aplikacji w bardziej kompaktową postać. Dzięki tej zmianie aplikacja będzie uruchamiać się szybciej 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 typy stanów urządzenia o znaczeniu globalnym.
Więcej informacji o tym narzędziu znajdziesz w artykule Przeprowadzanie śledzenia systemu na urządzeniu.