Funkcje i interfejsy API Androida 8.1

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.
  • NotificationListenerService i ConditionProviderService nie są obsługiwane na urządzeniach z Androidem z małą ilością pamięci RAM, które zwracają true po wywołaniu ActivityManager.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 WallpaperColors za pomocą 3 kolorów, utwórz instancję klasy WallpaperColors, przekazując kolor podstawowy, dodatkowy i trzeci. Kolor podstawowy nie może być pusty.
  • Aby utworzyć obiekt WallpaperColors z bitmapy, wywołaj metodę fromBitmap(), przekazując źródło mapy bitowej jako parametr.
  • Aby utworzyć obiekt WallpaperColors z 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:

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: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 już w przypadku algorytmów korzystających z GCM. Zamiast tego użyj zasady getParameterSpec(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ą typu ConscryptFileDescriptorSocket lub ConscryptEngineSocket, które rozszerzają typ OpenSSLSocketImpl.
  • SSLSession metody używane do zgłaszania wyjątku IllegalArgumentException po przekazaniu odwołania o wartości null, teraz zgłaszają wyjątek NullPointerException.
  • RSA KeyFactory nie pozwala już na generowanie kluczy z tablic bajtów większych niż zakodowany klucz. Wywołania funkcji generatePrivate() i generatePublic(), które zwracają KeySpec, gdzie struktura klucza nie wypełnia całego bufora, spowodują zwrócenie wartości InvalidKeySpecException.
  • 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.