Android 8.1 (poziom API 27) wprowadza różne nowe funkcje i możliwości dla użytkowników oraz deweloperów. W tym dokumencie opisujemy nowości dla deweloperów.
Android Oreo (wersja Go)
Android Go to nasza inicjatywa, która ma na celu optymalizację wygody korzystania z Androida miliardy ludzi na całym świecie korzystają z internetu. Począwszy od Androida 8.1, zmieniamy Androida w świetną platformę dla podstawowych urządzeń. Funkcje Androida Oreo Konfiguracja (wersja Go) obejmuje:
- Optymalizacje pamięci. Zwiększyliśmy wykorzystanie pamięci na całej platformie, aby zapewnić że aplikacje mogą działać sprawnie na urządzeniach z maksymalnie 1 GB pamięci RAM.
- Elastyczne opcje kierowania. Nowość funkcja sprzętowa , które pozwalają kierować aplikacje na normalne lub mało pamięci RAM Google Play.
- Google Play. Wszystkie aplikacje będą dostępne na urządzeniach z Androidem Oreo. (wersja Go), Google Play będzie wyświetlać widoczność aplikacji zoptymalizowanych przez deweloperów. i dostarczają miliardom ludzi doskonałych wrażeń wytycznych.
Zaktualizowaliśmy budynek dla miliardów użytkowników z dodatkowymi wskazówkami, zoptymalizować aplikację pod kątem urządzeń działających na urządzeniach Android Oreo (wersja Go). Większość deweloperów woli optymalizować istniejące pliki APK lub korzystać z funkcji Google Play dotyczącej wielu plików APK, aby kierować wersję pliku APK na urządzenia z małą ilością pamięci RAM. Jest to najlepszy sposób na przygotowanie aplikacji na urządzenia z Androidem Oreo (wersja Go). Pamiętaj, że przygotowanie aplikacja lżejsze i wydajniejsze, są korzystne dla wszystkich odbiorców, niezależnie od urządzenia.
Neural Networks API
Interfejs Neural Networks API zapewnia szybsze obliczenia i wnioskowanie w przypadku maszyn na urządzeniu platformy edukacyjne, takie jak TensorFlow Lite – wieloplatformowa biblioteka ML Google do aplikacji mobilnych: Caffe2 i inne. Odwiedź TensorFlow Lite oprogramowanie open source w repozytorium z pobranymi plikami i dokumentami. TensorFlow Lite współpracuje z interfejsem Neural Networks API, aby uruchamiać modele takie jak MobileNets, Inception v3, i Inteligentna odpowiedź na urządzeniu mobilnym.
Aktualizacje platformy autouzupełniania
Android 8.1 (poziom interfejsu API 27) oferuje kilka ulepszeń autouzupełniania Struktura, którą możesz zastosować w swoich aplikacjach.
Klasa BaseAdapter
zawiera teraz metodę setAutofillOptions()
, która umożliwia podawanie ciągów znaków z wartościami w adapterze. Jest to przydatne w przypadku elementu spinner
które dynamicznie generują wartości w swoich adapterach. Przykład:
możesz użyć metody setAutofillOptions()
, aby podać ciąg znaków
reprezentująca listę lat, którą użytkownicy mogą wybrać w ramach
datę ważności karty kredytowej. Usługi autouzupełniania mogą używać reprezentacji ciągu znaków
do prawidłowego wypełniania widoków, które wymagają tych danych.
Dodatkowo AutofillManager
klasa zawiera metodę notifyViewVisibilityChanged(View, int, boolean)
.
który można wywołać, aby powiadomić organizację o zmianach w widoczności
w wirtualnej strukturze. Przeciążenie tej metody wymaga też
za pomocą wirtualnych struktur. Jednak w przypadku struktur niewirtualnych nie musisz wyraźnie informować frameworku, ponieważ metoda jest już wywoływana przez klasę View
.
Android 8.1 daje też usługom autouzupełniania więcej możliwości dostosowywania interfejsu zapisywania, ponieważ umożliwia dodanie obsługi CustomDescription
and
Validator
w ramach SaveInfo
.
Opisy niestandardowe pomagają usłudze autouzupełniania wyjaśnić, co jest zapisywane. Jeśli na przykład ekran zawiera kartę kredytową, może wyświetlać logo banku, 4 ostatnie cyfry numeru karty i datę jej ważności. Więcej informacji znajdziesz na zajęciach
CustomDescription
.
Validator
są używane, aby uniknąć wyświetlania UI zapisywania autouzupełniania, gdy Walidator
nie jest spełniony. Więcej informacji znajdziesz w klasie Validator oraz jej podklasach LuhnChecksumValidator i RegexValidator.
Powiadomienia
Android 8.1 wprowadza następujące zmiany w powiadomieniach:
- Aplikacje mogą teraz odtwarzać dźwięk powiadomienia tylko raz na sekundę. Dźwięki alertów, które przekraczają tę wartość, nie są umieszczane w kole i są tracone. Ta zmiana nie ma wpływu na inne aspekty powiadomień zachowanie i powiadomienia będą nadal publikowane zgodnie z oczekiwaniami.
-
NotificationListenerService
i UrządzeniaConditionProviderService
nie są obsługiwane w przypadku małej ilości pamięci RAM Urządzenia z Androidem, które zwracają wartośćtrue
, gdy: FunkcjaActivityManager.isLowRamDevice()
jest wywoływana.
Aktualizacja EditText
Począwszy od poziomu interfejsu API 27 metoda EditText.getText()
zwraca Editable
; wcześniej zwracała CharSequence
. Ta zmiana jest
zgodna wstecznie, zgodnie z implementacją Editable
CharSequence
Interfejs Editable
zapewnia cenne dodatkowe funkcje. Ponieważ Editable
implementuje też interfejs Spannable
, możesz zastosować znaczniki do treści w instancji EditText
.
Automatyczne działania Bezpiecznego przeglądania
Dzięki użyciu
WebView
implementacji interfejsu Safe Browsing API aplikacja może wykryć, kiedy instancja WebView
próbuje przejść do adresu URL, który Google zaklasyfikował jako znane zagrożenie. Domyślnie aplikacja
WebView
wyświetla reklamę pełnoekranową, która ostrzega użytkowników o znanym zagrożeniu.
Użytkownicy mogą na nim załadować URL mimo to lub wrócić do
jest bezpieczna.
W Androidzie 8.1 możesz za pomocą programowania określić, jak Twoja aplikacja ma reagować na znane zagrożenie:
- Możesz określić, czy aplikacja będzie zgłaszać znane zagrożenia bezpieczeństwa Przeglądanie.
- Możesz skonfigurować aplikację tak, aby automatycznie wykonywała określone działanie (np. wracała do bezpiecznego stanu) za każdym razem, gdy napotka adres URL, który Bezpieczne przeglądanie zaklasyfikuje jako znane zagrożenie.
Uwaga: aby zapewnić optymalną ochronę przed znanymi zagrożeniami, przed wywołaniem metody loadUrl()
obiektu WebView
odczekaj, aż inicjalizacja Bezpiecznego przeglądania się zakończy.
Poniższe fragmenty kodu pokazują, jak możesz polecić instancjom WebView
w aplikacji, aby zawsze wracały do bezpiecznego stanu po napotkaniu znanego zagrożenia:
AndroidManifest.xml
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:valu>e=&qu<ot;true">;< / /a>pplication /manifest
MyWebActivity.java
Kotlin
private var superSafeWebView: WebView? = null private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this).apply { webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false startSafeBrowsing(this@SafeBrowsingActivity, { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
Java
private WebView superSafeWebView; private boolean safeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); superSafeWebView = new WebView(this); superSafeWebView.setWebViewClient(new MyWebViewClient()); safeBrowsingIsInitialized = false; superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { safeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); }
MyWebViewClient.java
Kotlin
class MyWebViewClient : WebViewClient() { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponse ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } }
Java
public class MyWebViewClient extends WebViewClient { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. @Override public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true); Toast.makeText(view.getContext(), "Unsafe web page blocked.", Toast.LENGTH_LONG).show(); } }
Wyodrębniacz miniatur filmów
Klasa MediaMetadataRetriever
ma nową metodę getScaledFrameAtTime()
, która znajduje kadr w pobliżu danej pozycji czasowej i zwraca bitmapę o tym samym współczynniku proporcji co kadr źródłowy, ale przeskalowaną tak, aby zmieściła się w prostokącie o danej szerokości i wysokości. Jest to przydatne przy generowaniu miniatur z filmów.
Zalecamy użycie tej metody zamiast getFrameAtTime()
, która może zużywać pamięć, ponieważ zwraca bitmapę o tej samej rozdzielczości co wideo źródłowe. Na przykład kadr z filmu 4K to bitmapa o rozmiarze 16 MB, czyli znacznie większym niż potrzebujesz na miniaturę.
Interfejs API pamięci współdzielonej
Android 8.1 (poziom interfejsu API 27) wprowadza nowy interfejs API SharedMemory
. Ta klasa umożliwia tworzenie, mapowanie i zarządzanie anonimową instancją SharedMemory
. Ty ustawiasz ochronę pamięci
w
SharedMemory
obiektu do odczytu lub zapisu, a
SharedMemory
jest obiektem Parcelable, można go łatwo przekazać do innego procesu za pomocą AIDL.
Interfejs API SharedMemory
współdziała z biblioteką ASharedMemory
w NDK.
ASharedMemory
zapewnia dostęp do deskryptora pliku, który można następnie mapować na odczyt i zapis. To świetnie
sposób na udostępnianie dużych ilości
danych między aplikacjami lub
między wieloma procesami w jednej aplikacji.
WallpaperColors API
Android 8.1 (poziom interfejsu API 27) umożliwia dostosowywanie kolorów animowanej tapety
do interfejsu systemowego. Aby to zrobić, utwórz WallpaperColors
z bitmapy, obiektu rysowalnego lub za pomocą trzech ręcznie wybranych kolorów.
Możesz także pobrać informacje o tym kolorze.
Aby utworzyć: WallpaperColors
wykonaj jedną z tych czynności:
- Aby utworzyć obiekt
WallpaperColors
za pomocą 3 kolorów, utwórz instancję klasyWallpaperColors
, przekazując kolor podstawowy, dodatkowy i trzeciorzędowy. Główny kolor nie może być pusty. - Aby utworzyć obiekt
WallpaperColors
z bitmapy, wywołaj metodęfromBitmap()
, podając jako parametr źródło bitmapy. - Aby utworzyć obiekt
WallpaperColors
z elementu rysowanego, wywołaj metodęfromDrawable()
, podając jako parametr źródło elementu rysowanego.
Aby pobrać szczegóły koloru podstawowego, dodatkowego lub dodatkowego z tapety, wywołaj te metody:
getPrimaryColor()
zwraca najbardziej reprezentatywny wizualnie kolor tapety.getSecondaryColor()
zwraca drugi najbardziej dominujący kolor tapety.getTertiaryColor()
Metoda zwraca trzeci najwyraźniejszy kolor tapety.
Aby powiadomić system o istotnych zmianach kolorów w żywym tapecie, wywołaj metodę notifyColorsChanged()
. Ta metoda aktywuje cykl życia onComputeColors()
wydarzenie, w ramach którego możesz podać nowe WallpaperColors
obiektu.
Aby dodać odbiornik zmian kolorów, możesz wywołać metodę addOnColorsChangedListener()
. Możesz też wywołać metodę getWallpaperColors()
, aby pobrać kolory podstawowe tapety.
Aktualizacje odcisku palca
Klasa FingerprintManager
wprowadziła te kody błędów:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
– użytkownik zbyt wiele razy próbował odblokować urządzenie za pomocą czytnika linii papilarnych. -
FINGERPRINT_ERROR_VENDOR
– wystąpił błąd czytnika odcisków palców specyficzny dla dostawcy.
Nowości związane z kryptografią
W Androidzie 8.1 wprowadzono szereg zmian związanych z szyfrowaniem:
- W Conscrypt zostały zaimplementowane nowe algorytmy. Implementacja Conscrypt jest preferowana w stosunku do dotychczasowej implementacji Bouncy Castle. Nowe algorytmy:
AlgorithmParameters:GCM
KeyGenerator:AES
KeyGenerator:DESEDE
KeyGenerator:HMACMD5
KeyGenerator:HMACSHA1
KeyGenerator:HMACSHA224
KeyGenerator:HMACSHA256
KeyGenerator:HMACSHA384
KeyGenerator:HMACSHA512
SecretKeyFactory:DESEDE
Signature:NONEWITHECDSA
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)
nie działa w algorytmach korzystających z GCM. Zamiast tego użyj elementugetParameterSpec(GCMParameterSpec.class)
.- Wiele wewnętrznych klas Conscrypt powiązanych z TLS zostało refaktoryzowanych. Ponieważ deweloperzy czasami korzystają z tych funkcji bez zastanowienia, pozostawiliśmy je w miejscu, aby umożliwić obsługę poprzedniego użycia, ale niektóre szczegóły uległy zmianie. Na przykład gniazda były wcześniej typu
OpenSSLSocketImpl
, ale teraz są typuConscryptFileDescriptorSocket
lubConscryptEngineSocket
, które rozszerzają typOpenSSLSocketImpl
. SSLSession
metod używanych do rzucania Po przekazaniu pustego odwołaniaIllegalArgumentException
staje się ono rzutNullPointerException
.- RSA
KeyFactory
nie umożliwia już generowania kluczy z tablic bajtów, które są większe niż zakodowany klucz. Wywołania dogeneratePrivate()
igeneratePublic()
, które podająKeySpec
, gdzie struktura klucza nie wypełnia całego bufora, spowodują błądInvalidKeySpecException
. - Gdy odczyt gniazda został przerwany przez zamknięcie gniazda, Conscrypt zwracał -1. Funkcja odczytu teraz powoduje błąd
SocketException
. - Zmieniono zestaw głównych certyfikatów urzędów certyfikacji, usuwając głównie dużą liczbę przestarzałych certyfikatów, ale także certyfikaty główne WoSign i StartCom. Więcej informacji o tej decyzji znajdziesz w poście na blogu Google o bezpieczeństwie Ostateczne wycofanie zaufania do certyfikatów WoSign i StartCom.