Funktionen und APIs unter Android 8.1

Mit Android 8.1 (API-Level 27) werden neuen Funktionen für Nutzer und Entwickler. In diesem Dokument werden die Neuerungen für Entwickler beschrieben.

Android Oreo (Go-Edition)

<ph type="x-smartling-placeholder"></ph> Android Go ist unsere Initiative zur Optimierung von Android auf der ganzen Welt online gehen. Ab Android 8.1 machen wir Android zu einer tollen Plattform für Einsteigergeräte. Funktionen in Android Oreo Die Konfiguration (Go-Edition) umfasst:

  • Arbeitsspeicheroptimierung: Optimierte Speichernutzung auf der Plattform, um damit Apps auf Geräten mit maximal 1 GB RAM effizient ausgeführt werden können.
  • Flexible Ausrichtungsoptionen: Neu Hardware-Funktion , um die Verteilung Ihrer Apps auf Geräte mit normalem oder niedrigem RAM über Google Play
  • Google Play: Alle Apps werden auf Geräten mit Android Oreo verfügbar sein. Go-Edition erhalten, bietet Google Play einen Einblick in Apps, die speziell von Entwicklern optimiert wurden. um Milliarden von Menschen ein großartiges Erlebnis zu bieten. <ph type="x-smartling-placeholder"></ph> Richtlinien.

Wir haben das Gebäude für Milliarden Nutzer saniert <ph type="x-smartling-placeholder"></ph> Richtlinien mit zusätzlichen Informationen zur <ph type="x-smartling-placeholder"></ph> Optimierung deiner App für Geräte mit Android Oreo (Go-Edition) Für die meisten Entwickler ist es sinnvoll, von Google Play Funktion für mehrere APK-Dateien, mit der du eine Version deines APK auf Geräte mit wenig RAM ausrichten kannst ist die beste Vorbereitung für Geräte, auf denen Android Oreo (Go-Edition) ausgeführt wird. Wenn Sie Ihre App leichter und effizienter ist, profitieren alle Nutzer auf allen Geräten.

Neural Networks API

Die Neural Networks API ermöglicht eine beschleunigte Berechnung und Inferenz für On-Device-Maschinen Lern-Frameworks wie TensorFlow Lite: die plattformübergreifende ML-Bibliothek von Google für Mobilgeräte – sowie Caffe2 und andere. Zur TensorFlow Lite Open Source Repository für Downloads und Dokumente. TensorFlow Lite arbeitet mit der Neural Networks API zusammen, um Modelle wie MobileNets Inception v3, und Intelligente Antworten effizient über dein Mobilgerät erstellen.

Updates für das Autofill-Framework

Android 8.1 (API-Level 27) bietet mehrere Verbesserungen für die Funktion „Autofill“ Framework, das Sie in Ihre Apps integrieren können.

Das BaseAdapter Klasse enthält jetzt die setAutofillOptions() , mit der Sie Zeichenfolgendarstellungen der Werte in einer Adapter. Dies ist nützlich für das Kreiselsymbol Steuerelemente, die die Werte in ihren Adaptern dynamisch generieren. Beispiel: können Sie mit der Methode setAutofillOptions() einen String Darstellung der Liste von Jahren, die die Nutzenden im Rahmen eines Gültigkeitsdatum der Kreditkarte. Autofill-Dienste können die Zeichenfolgendarstellung um die Datenansichten, für die die Daten erforderlich sind, entsprechend auszufüllen.

Außerdem enthält die AutofillManager Klasse enthält die Methode notifyViewVisibilityChanged(View, int, boolean) den Sie aufrufen können, um das Framework über Änderungen in der Sichtbarkeit eines in einer virtuellen Struktur ansehen. Es gibt auch eine Überlastung der Methode für virtuelle Strukturen erstellen. Bei nicht virtuellen Strukturen ist es jedoch normalerweise nicht erforderlich, das Framework explizit benachrichtigen, da die Methode bereits vom View .

Mit Android 8.1 haben die Autofill-Dienste außerdem mehr Möglichkeiten, die Benutzeroberfläche zum Speichern anzupassen. durch die Unterstützung von CustomDescription and Validator innerhalb von SaveInfo.

Benutzerdefinierte Beschreibungen helfen dem Autofill-Service zu verdeutlichen, wird gespeichert; Enthält der Bildschirm beispielsweise eine Kreditkarte, Das Logo der Kreditkartenbank, die letzten vier Ziffern der Kreditkartennummer und die Ablaufnummer. Weitere Informationen findest du in der CustomDescription. .

Validator -Objekten wird verwendet, um zu verhindern, dass die Benutzeroberfläche zum Speichern von Autofill-Daten beim Validator Zustand nicht erfüllt ist. Weitere Informationen finden Sie in der Validator und den zugehörigen abgeleiteten Klassen, LuhnChecksumValidator und RegexValidator.

Benachrichtigungen

In Android 8.1 wurden die folgenden Änderungen bei Benachrichtigungen vorgenommen:

  • Apps können jetzt nur einmal pro Sekunde einen Benachrichtigungston auslösen. Warntöne, die diesen Wert überschreiten nicht in die Warteschlange gestellt und gehen verloren. Diese Änderung hat keine Auswirkungen auf andere Aspekte der Benachrichtigung und Benachrichtigungen weiterhin wie erwartet gepostet werden.
  • NotificationListenerService und ConditionProviderService werden bei niedrigem RAM nicht unterstützt Android-Geräte, die true zurückgeben, wenn ActivityManager.isLowRamDevice() wird aufgerufen.

EditText-Update

Ab API-Level 27 gibt die Methode EditText.getText() ein Editable zurück. zuvor wurde ein CharSequence zurückgegeben. Diese Änderung ist abwärtskompatibel, da Editable implementiert CharSequence.

Die Editable-Oberfläche bietet wertvolle zusätzliche Funktionalität. Zum Beispiel, weil Editable auch Spannable-Schnittstelle implementiert, kannst du Markup auf Inhalt innerhalb einer Instanz von EditText.

Programmatische Safe Browsing-Aktionen

Mit der Methode WebView der Safe Browsing API implementiert hat, kann deine App erkennen, wenn eine Instanz von WebView versucht, zu navigieren auf eine URL verweist, die Google als bekannte Bedrohung klassifiziert hat. Standardmäßig enthält der Parameter WebView zeigt ein Interstitial an, das Nutzer vor der bekannten Bedrohung warnt. In diesem Bildschirm haben Nutzer die Möglichkeit, die URL trotzdem zu laden oder zu einem auf der vorherigen Seite verwendet.

In Android 8.1 können Sie programmatisch definieren, wie Ihre Anwendung auf eine bekannte Bedrohung reagiert:

  • Du kannst festlegen, ob deine App bekannte Bedrohungen an Safe meldet Surfen.
  • Sie können festlegen, dass Ihre App eine bestimmte Aktion automatisch ausführt, z. B. wenn sie auf eine URL stößt, die Safe Browsing als bekannte Bedrohung klassifiziert.

Hinweis:Für einen optimalen Schutz vor bekannten Bedrohungen bis Sie Safe Browsing initialisiert haben, bevor Sie ein Die Methode loadUrl() des WebView-Objekts.

Die folgenden Code-Snippets zeigen, wie Sie die Instanzen Ihrer App WebView, um nach dem Auftreten einer bekannte Bedrohung:

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();
    }
}

Video-Thumbnail-Extraktor

Die Klasse MediaMetadataRetriever hat eine neue Methode, getScaledFrameAtTime(), die Frame in der Nähe einer bestimmten Zeitposition und gibt eine Bitmap mit demselben Seitenverhältnis zurück. Verhältnis als Quell-Frame, aber so skaliert, dass er in ein Rechteck mit vorgegebener Breite und Höhe. Dies ist nützlich, um Thumbnails aus Videos zu generieren.

Wir empfehlen, diese Methode anstelle von getFrameAtTime() zu verwenden, da sonst Arbeitsspeicher verschwendet wird da es eine Bitmap mit derselben Auflösung wie das Quellvideo zurückgibt. Für Ein Frame aus einem 4K-Video wäre eine Bitmap von 16 MB, also deutlich größer Thumbnail-Bild wäre.

Shared Memory API

Mit Android 8.1 (API-Level 27) wird eine neue SharedMemory der API erstellen. Mit dieser Klasse können Sie anonyme SharedMemory Instanz. Du legst den Speicherschutz fest auf einer SharedMemory Objekt zum Lesen und/oder Schreiben und, da das SharedMemory parcelable-Objekt ist, können Sie es über AIDL problemlos an einen anderen Prozess übergeben.

Die SharedMemory Die API interagiert mit dem ASharedMemory-Einrichtung im NDK. ASharedMemory gewährt Zugriff an einen Dateideskriptor, der dann Lese- und Schreibvorgänge zugeordnet werden kann. Es ist eine großartige große Mengen an Daten zwischen Apps oder zwischen mehreren Prozessen innerhalb einer App.

HintergründeColors API

Mit Android 8.1 (API-Level 27) kann dein Live-Hintergrund farbig dargestellt werden an die System-UI senden. Dazu erstellen Sie eine WallpaperColors aus einer Bitmap, einem Drawable oder mithilfe von drei manuell ausgewählten Farben. Sie können diese Farbinformationen auch abrufen.

So erstellen Sie eine WallpaperColors führen Sie einen der folgenden Schritte aus:

  • So erstellen Sie eine WallpaperColors mithilfe von drei Farben erstellen, erstellen Sie eine Instanz von WallpaperColors. indem Sie die primäre, die sekundäre und die tertiäre Farbe übergeben. Die primäre Farbe darf nicht null sein.
  • So erstellen Sie eine WallpaperColors aus einer Bitmap abrufen möchten, rufen Sie die Methode fromBitmap() durch Übergeben der Bitmapquelle als Parameter.
  • So erstellen Sie eine WallpaperColors aus einem Drawable zu erstellen, rufe die Funktion fromDrawable() auf durch Übergeben der Drawable-Quelle als Parameter.

Um die primären, sekundären oder tertiären Farbdetails aus der die folgenden Methoden auf:

Um das System über wesentliche Farbänderungen in Ihrem Live-Hintergrund zu informieren, notifyColorsChanged() aufrufen . Diese Methode löst einen onComputeColors()-Lebenszyklus aus Veranstaltung, bei der Sie die Möglichkeit haben, eine neue WallpaperColors -Objekt enthält.

Um einen Listener für Farbänderungen hinzuzufügen, können Sie die Methode addOnColorsChangedListener() aufrufen. Sie können auch die Methode getWallpaperColors() aufrufen um die Primärfarben eines Hintergrunds abzurufen.

Aktualisierung der Fingerabdrücke

Die Klasse FingerprintManager hat die folgenden Fehlercodes eingeführt:

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT: Der Nutzer hat versucht, zu oft verwendet wird, um das Gerät mit dem Fingerabdrucksensor zu entsperren.
  • FINGERPRINT_ERROR_VENDOR: ein anbieterspezifischer Fingerabdruck Lesefehler ist aufgetreten.

Neuigkeiten zu Kryptografie

Bei Android 8.1 wurden einige Änderungen an der Kryptografie vorgenommen:

  • In Conscrypt wurden neue Algorithmen implementiert. Conscrypt -Implementierung wird bevorzugt gegenüber dem bestehenden Bouncy Castle verwendet. Implementierung. Zu den neuen Algorithmen gehören: <ph type="x-smartling-placeholder">
      </ph>
    • 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) nein funktioniert bei Algorithmen, die GCM verwenden, länger. Verwenden Sie stattdessen getParameterSpec(GCMParameterSpec.class)
  • Viele mit TLS verknüpfte interne Conscrypt-Klassen wurden refaktoriert. Seit Entwickler greifen manchmal auf diese Informationen zu. unterstützen die vorherige Nutzung, einige Details haben sich jedoch geändert. Beispiel: Sockets früher vom Typ OpenSSLSocketImpl, jetzt sind sie jedoch vom Typ ConscryptFileDescriptorSocket oder ConscryptEngineSocket, die beide auch auf OpenSSLSocketImpl
  • SSLSession-Methoden zum Auslösen IllegalArgumentException bei der Übergabe einer Nullreferenz. NullPointerException werfen.
  • Für die RSA KeyFactory ist das Generieren von Schlüsseln nicht mehr zulässig aus Byte-Arrays, die größer als der codierte Schlüssel sind. Anrufe an generatePrivate() und generatePublic(), die ein KeySpec, bei denen die Schlüsselstruktur das Feld Gesamter Puffer führt zu InvalidKeySpecException.
  • Wenn ein Socket-Lesevorgang durch das Schließen des Sockets unterbrochen wird, hat Conscrypt verwendet um -1 aus dem Lesevorgang zurückzugeben. Der Lesevorgang SocketException
  • Der Satz der Root-CA-Zertifikate wurde geändert. Dabei wurde größtenteils der veralteten Zertifikate, wobei die Root-Zertifikate für WoSign und StartCom. Weitere Informationen zu dieser Entscheidung findest du in den Blogpost zum Thema Sicherheit, Finale Aufhebung des Vertrauens in WoSign- und StartCom-Zertifikate