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). W przypadku większości programistów optymalizacja istniejącego pliku APK lub korzystanie w Google Play funkcję wielu plików APK, by kierować wersję APK na urządzenia z małą ilością pamięci RAM. to najlepszy sposób na przygotowanie się 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.
BaseAdapter
klasa zawiera teraz setAutofillOptions()
, która umożliwia podanie ciągu znaków jako reprezentacji wartości w funkcji
przejściówkę. 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 obiekty niewirtualne zwykle nie wymagają
bezpośrednio powiadomić platformę, ponieważ metoda jest już wywołana przez
View
zajęcia.
Android 8.1 daje Usługom autouzupełniania większe możliwości dostosowywania interfejsu zapisywania
afordancja przez dodanie obsługi funkcji CustomDescription
and
Validator
w ciągu SaveInfo
.
Niestandardowe opisy są przydatne, gdy usługa autouzupełniania może wyjaśnić, czym jest
zapisywanie danych; Na przykład jeśli ekran zawiera kartę kredytową,
wyświetlać logo banku karty kredytowej, ostatnie 4 cyfry numeru karty;
i jego numerem ważności. Więcej informacji:
CustomDescription
zajęcia.
Validator
są używane, aby uniknąć wyświetlania UI zapisywania autouzupełniania, gdy Walidator
nie jest spełniony. Aby dowiedzieć się więcej, przeczytaj
klasa walidatora wraz z jej podklasami,
LuhnChecksumValidator i RegexValidator.
Powiadomienia
W Androidzie 8.1 wprowadziliśmy te zmiany w powiadomieniach:
- Teraz aplikacja może odtwarzać alert powiadomienia tylko raz na sekundę. Dźwięki alertu, które przekraczają tę wartość które nie są umieszczane w kolejce i 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
; poprzednio
zwraca wartość CharSequence
. Ta zmiana jest
zgodna wstecznie, zgodnie z implementacją Editable
CharSequence
Interfejs Editable
zawiera przydatne informacje dodatkowe
funkcji. Na przykład, ponieważ Editable
również
implementuje interfejs Spannable
, możesz zastosować znaczniki
treści w instancji EditText
.
Działania zautomatyzowanego bezpiecznego przeglądania
Za pomocą funkcji
WebView
interfejsu API Bezpiecznego przeglądania, aplikacja może
wykrywaj, kiedy instancja WebView
próbuje nawigować
prowadzi do adresu URL, który został sklasyfikowany przez Google jako znane zagrożenie. Domyślnie atrybut
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 automatycznie określić sposób reaguje na znane zagrożenie:
- Możesz określić, czy aplikacja będzie zgłaszać znane zagrożenia bezpieczeństwa Przeglądanie.
- Aplikacja może automatycznie wykonywać określone działanie, np. powrót do zabezpieczeń – za każdym razem, gdy natrafi na adres URL, który Bezpieczne przeglądanie jest klasyfikowane jako znane zagrożenie.
Uwaga: aby uzyskać optymalną ochronę przed znanymi zagrożeniami, poczekaj
dopóki nie zainicjujesz funkcji Bezpieczne przeglądanie, a potem wywołasz
Metoda loadUrl()
obiektu WebView
.
Poniższe fragmenty kodu pokazują, jak możesz przekazać instrukcje instancji aplikacji
WebView
, aby zawsze wrócić do zabezpieczeń po napotkaniu
znane zagrożenie:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
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!"); } } }); }
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ębnianie miniatur filmu
Klasa MediaMetadataRetriever
ma nową metodę (getScaledFrameAtTime()
), która znajduje
klatka w pobliżu określonej pozycji w czasie i zwraca bitmapę o tym samym aspekcie
jak w ramce źródłowej, lecz przeskalowane w celu dopasowania do prostokąta o danej szerokości
wysokość. Przydaje się to do generowania miniatur na podstawie filmów.
Zalecamy używanie tej metody zamiast metody getFrameAtTime()
, ponieważ może ona marnować pamięć
ponieważ zwraca bitmapę o tej samej rozdzielczości co film źródłowy. Dla:
Na przykład klatka z filmu 4K to mapa bitowa o rozmiarze 16 MB, znacznie większa od obrazu.
obrazu miniatury.
Interfejs API pamięci współdzielonej
Android 8.1 (poziom API 27) wprowadza
SharedMemory
API. Te zajęcia pozwalają tworzyć i mapować anonimowe konta oraz nimi zarządzać
SharedMemory
instancji. 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.
SharedMemory
Interfejs API współdziała z
Obiekt ASharedMemory
w NDK.
ASharedMemory
przyznaje dostęp
do deskryptora pliku, który można zmapować 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.
Interfejs TapColors 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ć:
WallpaperColors
używając 3 kolorów, utwórz instancjęWallpaperColors
. klasy, przekazując kolor podstawowy, dodatkowy i trzeciorzędny. Podstawowy color nie może mieć wartości null. - Aby utworzyć:
WallpaperColors
z bitmapy, wywołajfromBitmap()
przez przekazanie źródła mapy bitowej jako parametru. - Aby utworzyć:
WallpaperColors
obiekt rysowalny należy wywołać funkcjęfromDrawable()
przez przekazanie źródła możliwego do rysowania jako parametru.
Aby pobrać szczegóły koloru podstawowego, dodatkowego lub trzeciorzędnego z funkcji tapety, wywołaj te metody:
getPrimaryColor()
zwraca najbardziej reprezentatywny kolor tapety.getSecondaryColor()
zwraca drugi najbardziej dominujący kolor tapety.getTertiaryColor()
zwraca trzeci najbardziej dominujący kolor tapety.
Aby powiadomić system o wszelkich istotnych zmianach kolorów animowanej tapety,
Zadzwoń na 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()
. Dostępne opcje
wywołaj też metodę getWallpaperColors()
aby pobrać podstawowe kolory tapety.
Aktualizacje odcisku palca
Zajęcia FingerprintManager
mają
wprowadzono następujące kody błędów:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
– użytkownik próbował zbyt wiele razy, aby odblokować urządzenie za pomocą czytnika linii papilarnych. -
FINGERPRINT_ERROR_VENDOR
– odcisk cyfrowy specyficzny dla dostawcy wystąpił błąd czytnika.
Nowości związane z kryptografią
W Androidzie 8.1 wprowadzono szereg zmian związanych z szyfrowaniem:
- W aplikacji Conscrypt zostały zaimplementowane nowe algorytmy. Conscrypt
preferowana jest implementacja, a nie istniejący Bouncy Castle.
implementacji. 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żyjgetParameterSpec(GCMParameterSpec.class)
- Wiele wewnętrznych klas Conscrypt powiązanych z TLS zostało refaktoryzowanych. Od
czasami dostęp do tych podkładek jest luźna, ale zostały one
obsługują wcześniejsze przypadki użycia, ale niektóre szczegóły się zmieniły. Na przykład gniazda
były typu
OpenSSLSocketImpl
, ale teraz są tego typuConscryptFileDescriptorSocket
lubConscryptEngineSocket
, które obejmująOpenSSLSocketImpl
SSLSession
metod używanych do rzucaniaIllegalArgumentException
po przekazaniu pustego odwołania rzutNullPointerException
.- RSA
KeyFactory
nie umożliwia już generowania kluczy z tablic bajtów, które są większe niż zakodowany klucz. Połączenia zgeneratePrivate()
igeneratePublic()
, które zapewniająKeySpec
, gdzie struktura klucza nie wypełnia dla całego bufora otrzymaszInvalidKeySpecException
. - Gdy odczyt gniazda zostanie przerwany przez zamknięcie gniazda, użyto protokołu Conscrypt.
w celu zwrócenia -1 na podstawie odczytu. Odczyt wskazuje teraz
SocketException
- Zestaw certyfikatów głównych CA został zmieniony – głównie usunięto dużą liczbę nieaktualnych certyfikatów, a także usunąć certyfikaty główne dla WoSign i StartCom. Więcej informacji na temat tej decyzji znajdziesz na stronie post na blogu o bezpieczeństwie, Koniec usunięcie zaufania do certyfikatów WoSign i StartCom.