Android 8.1 (poziom API 27) wprowadza wiele nowych funkcji i możliwości dla użytkowników i programistów. W tym dokumencie znajdziesz informacje o nowościach dla deweloperów.
Android Oreo (wersja Go)
Android Go to nasza inicjatywa mająca na celu optymalizację Androida dla miliardów osób na całym świecie, które dopiero zaczynają korzystać z internetu. Od Androida 8.1 sprawiamy, że Android staje się świetną platformą dla urządzeń z niższej półki. Funkcje konfiguracji Androida Oreo (wersja Go):
- Optymalizacja pamięci Ulepszone wykorzystanie pamięci na całej platformie, aby aplikacje mogły wydajnie działać na urządzeniach z 1 GB pamięci RAM lub mniejszą.
- Elastyczne opcje kierowania. Nowe stałe wartości funkcji sprzętowych, które umożliwiają kierowanie dystrybucji aplikacji na urządzenia z normalną lub małą ilością pamięci RAM za pomocą Google Play.
- Google Play. Wszystkie aplikacje będą dostępne na urządzeniach z Androidem Oreo (wersja Go), ale Google Play będzie promować aplikacje specjalnie zoptymalizowane przez deweloperów, aby zapewnić miliardom użytkowników jak najlepsze wrażenia. W tym celu będą stosowane wytyczne dotyczące tworzenia aplikacji dla miliardów użytkowników.
Zaktualizowaliśmy wytyczne dotyczące tworzenia aplikacji dla miliardów użytkowników, dodając do nich wskazówki na temat optymalizacji aplikacji na urządzenia z Androidem Oreo (wersja Go). W przypadku większości deweloperów najlepszym sposobem na przygotowanie się do obsługi urządzeń z Androidem Oreo (Go edition) jest zoptymalizowanie istniejącego pliku APK lub użycie funkcji wielu plików APK w Google Play, aby kierować wersję pliku APK na urządzenia z małą ilością pamięci RAM. Pamiętaj, że mniejszy rozmiar i większa wydajność aplikacji przynoszą korzyści wszystkim użytkownikom, niezależnie od urządzenia.
Neural Networks API
Interfejs Neural Networks API zapewnia przyspieszone obliczenia i wnioskowanie w przypadku platform uczenia maszynowego na urządzeniu, takich jak TensorFlow Lite – wieloplatformowa biblioteka ML Google na urządzenia mobilne – oraz Caffe2 i inne. Pobierz pakiet i zapoznaj się z dokumentacją w repozytorium open source TensorFlow Lite. TensorFlow Lite współpracuje z interfejsem Neural Networks API, aby wydajnie uruchamiać na urządzeniu mobilnym modele takie jak MobileNets, Inception v3 i Smart Reply.
Aktualizacje platformy autouzupełniania
Android 8.1 (interfejs API na poziomie 27) wprowadza kilka ulepszeń w ramach automatycznego wypełniania, które możesz zaimplementować w swoich aplikacjach.
Klasa BaseAdapter zawiera teraz metodę setAutofillOptions(), która umożliwia podawanie reprezentacji ciągów znaków wartości w adapterze. Jest to przydatne w przypadku elementów sterujących spinner, które dynamicznie generują wartości w swoich adapterach. Możesz na przykład użyć metody setAutofillOptions(), aby podać ciąg znaków reprezentujący listę lat, które użytkownicy mogą wybrać jako część daty ważności karty kredytowej. Usługi autouzupełniania mogą używać reprezentacji w postaci ciągu znaków do prawidłowego wypełniania widoków, które wymagają tych danych.
Dodatkowo klasa AutofillManager
zawiera metodę notifyViewVisibilityChanged(View, int, boolean), której możesz użyć, aby powiadomić platformę o zmianach widoczności widoku w strukturze wirtualnej. Istnieje też przeciążenie metody dla struktur niewirtualnych. Jednak struktury niewirtualne zwykle nie wymagają wyraźnego powiadamiania platformy, ponieważ metoda jest już wywoływana przez klasę View.
Android 8.1 daje też usługom autouzupełniania większe możliwości dostosowywania interfejsu zapisywania, ponieważ dodaje obsługę CustomDescription
and Validator
w ramach SaveInfo.
Niestandardowe opisy pomagają usłudze autouzupełniania wyjaśnić, co jest zapisywane. Na przykład, gdy na ekranie znajduje się karta kredytowa, może wyświetlać logo banku, który ją wydał, 4 ostatnie cyfry numeru karty kredytowej i datę jej ważności. Więcej informacji znajdziesz w
CustomDescription.
Validator
są używane, aby uniknąć wyświetlania interfejsu zapisywania autouzupełniania, gdy warunek Validator
nie jest spełniony. Więcej informacji znajdziesz w klasie
Validator oraz jej podklasach
LuhnChecksumValidator i RegexValidator.
Powiadomienia
Android 8.1 wprowadza te zmiany w powiadomieniach:
- Aplikacje mogą teraz odtwarzać alert z powiadomieniem tylko raz na sekundę. Dźwięki alertów, które przekraczają tę częstotliwość, nie są umieszczane w kolejce i są tracone. Ta zmiana nie wpływa na inne aspekty działania powiadomień, a wiadomości z powiadomieniami nadal są publikowane zgodnie z oczekiwaniami.
-
NotificationListenerServiceiConditionProviderServicenie są obsługiwane na urządzeniach z Androidem z małą ilością pamięci RAM, które zwracajątruepo wywołaniuActivityManager.isLowRamDevice().
Aktualizacja EditText
Od poziomu API 27 metoda EditText.getText() zwraca Editable, a wcześniej zwracała CharSequence. Ta zmiana jest zgodna wstecznie, ponieważ Editable implementuje CharSequence.
Interfejs Editable zapewnia cenne dodatkowe funkcje. Na przykład ponieważ Editable implementuje też interfejs Spannable, możesz zastosować oznaczenia do treści w instancji EditText.
Działania związane z bezpiecznym przeglądaniem wykonywane automatycznie
Dzięki użyciu
WebView implementacji interfejsu Bezpieczne przeglądanie API Twoja aplikacja może wykrywać, kiedy instancja WebView próbuje przejść do adresu URL, który Google zaklasyfikowało jako znane zagrożenie. Domyślnie WebView wyświetla reklamę pełnoekranową, która ostrzega użytkowników o znanym zagrożeniu.
Na tym ekranie użytkownicy mogą wczytać adres URL lub wrócić do bezpiecznej strony.
W Androidzie 8.1 możesz programowo określić, jak aplikacja ma reagować na znane zagrożenie:
- Możesz określić, czy Twoja aplikacja ma zgłaszać znane zagrożenia do Bezpiecznego przeglądania.
- 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 klasyfikuje jako znane zagrożenie.
Uwaga: aby zapewnić optymalną ochronę przed znanymi zagrożeniami, przed wywołaniem metody loadUrl() obiektu WebView poczekaj, aż zainicjujesz Bezpieczne przeglądanie.
Poniższe fragmenty kodu pokazują, jak poinstruować instancje aplikacji
WebView, aby po napotkaniu znanego zagrożenia zawsze wracały do trybu bezpiecznego:
AndroidManifest.xml
<manifest>
<application>
...
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
</application>
</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(); } }
Ekstraktor miniatur filmów
Klasa MediaMetadataRetriever ma nową metodę getScaledFrameAtTime(), która znajduje klatkę w pobliżu danego czasu i zwraca bitmapę o takim samym współczynniku proporcji jak klatka źródłowa, ale przeskalowaną tak, aby zmieściła się w prostokącie o podanej szerokości i wysokości. Przydaje się to do generowania miniatur z filmów.
Zalecamy używanie tej metody zamiast metody getFrameAtTime(), która może marnować pamięć, ponieważ zwraca bitmapę o takiej samej rozdzielczości jak film źródłowy. Na przykład klatka z filmu 4K to bitmapa o rozmiarze 16 MB, czyli znacznie większa niż potrzebna miniatura.
Interfejs Shared Memory API
Android 8.1 (poziom interfejsu API 27) wprowadza nowy interfejs API SharedMemory. Ta klasa umożliwia tworzenie, mapowanie i zarządzanie anonimową instancją SharedMemory. Ochronę pamięci ustawiasz na obiekcie SharedMemory do odczytu lub zapisu, a ponieważ obiekt SharedMemory jest typu Parcelable, możesz go łatwo przekazać do innego procesu za pomocą AIDL.
Interfejs SharedMemory API współpracuje z ASharedMemory w NDK.
ASharedMemory zapewnia dostęp do deskryptora pliku, który można następnie zmapować w celu odczytu i zapisu. To świetny sposób na udostępnianie dużych ilości danych między aplikacjami lub między wieloma procesami w ramach jednej aplikacji.
WallpaperColors API
Android 8.1 (poziom interfejsu API 27) umożliwia animowanym tapetom przekazywanie informacji o kolorach do interfejsu systemu. Możesz to zrobić, tworząc WallpaperColorsobiekt z mapy bitowej, elementu rysowalnego lub za pomocą 3 ręcznie wybranych kolorów.
Możesz też pobrać te informacje o kolorze.
Aby utworzyć WallpaperColors
obiekt, wykonaj jedną z tych czynności:
- Aby utworzyć obiekt
WallpaperColorsza pomocą 3 kolorów, utwórz instancję klasyWallpaperColors, przekazując kolor podstawowy, dodatkowy i trzeci. Kolor podstawowy nie może być pusty. - Aby utworzyć obiekt
WallpaperColorsz bitmapy, wywołaj metodęfromBitmap(), przekazując źródło mapy bitowej jako parametr. - Aby utworzyć obiekt
WallpaperColorsz obiektu rysowalnego, wywołaj metodęfromDrawable(), przekazując źródło obiektu rysowalnego jako parametr.
Aby pobrać szczegóły koloru podstawowego, dodatkowego lub trzeciorzędowego z tapety, wywołaj te metody:
getPrimaryColor()zwraca kolor tapety, który najlepiej ją reprezentuje.getSecondaryColor()zwraca drugi najbardziej dominujący kolor tapety.getTertiaryColor()metoda zwraca trzeci najbardziej dominujący kolor tapety.
Aby powiadomić system o istotnych zmianach kolorów w animowanej tapecie, wywołaj metodę notifyColorsChanged(). Ta metoda wywołuje zdarzenie cyklu życia onComputeColors(), w którym możesz podać nowy obiekt WallpaperColors.
Aby dodać detektor zmian koloru, możesz wywołać metodę addOnColorsChangedListener(). Możesz też wywołać metodę getWallpaperColors(), aby pobrać główne kolory tapety.
Aktualizacje odcisków cyfrowych
W klasie FingerprintManager wprowadzono 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 linii papilarnych specyficzny dla dostawcy.
Aktualizacje kryptografii
W Androidzie 8.1 wprowadziliśmy kilka zmian w kryptografii:
- W bibliotece Conscrypt wdrożono nowe algorytmy. Implementacja Conscrypt jest preferowana przed istniejącą implementacją Bouncy Castle. Nowe algorytmy obejmują:
AlgorithmParameters:GCMKeyGenerator:AESKeyGenerator:DESEDEKeyGenerator:HMACMD5KeyGenerator:HMACSHA1KeyGenerator:HMACSHA224KeyGenerator:HMACSHA256KeyGenerator:HMACSHA384KeyGenerator:HMACSHA512SecretKeyFactory:DESEDESignature:NONEWITHECDSA
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)nie działa już w przypadku algorytmów korzystających z GCM. Zamiast tego użyj zasadygetParameterSpec(GCMParameterSpec.class).- Wiele wewnętrznych klas Conscrypt powiązanych z TLS zostało zmodyfikowanych. Deweloperzy czasami uzyskują do nich dostęp za pomocą refleksji, więc pozostawiliśmy w miejscu elementy shim, aby obsługiwać poprzednie użycie, ale niektóre szczegóły uległy zmianie. Na przykład gniazda były wcześniej typu
OpenSSLSocketImpl, ale teraz są typuConscryptFileDescriptorSocketlubConscryptEngineSocket, które rozszerzają typOpenSSLSocketImpl. SSLSessionmetody używane do zgłaszania wyjątkuIllegalArgumentExceptionpo przekazaniu odwołania o wartości null, teraz zgłaszają wyjątekNullPointerException.- RSA
KeyFactorynie pozwala już na generowanie kluczy z tablic bajtów większych niż zakodowany klucz. Wywołania funkcjigeneratePrivate()igeneratePublic(), które zwracająKeySpec, gdzie struktura klucza nie wypełnia całego bufora, spowodują zwrócenie wartościInvalidKeySpecException. - Gdy odczyt z gniazda jest przerywany przez jego zamknięcie, Conscrypt zwracał wartość -1. Odczyt teraz zgłasza wyjątek
SocketException. - Zmieniliśmy zestaw głównych certyfikatów CA, 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 usunięcie zaufania do certyfikatów WoSign i StartCom.