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 Neuigkeiten für Entwickler hervorgehoben.

Android Oreo (Go-Edition)

Android Go ist unsere Initiative, die Nutzung von Android für Milliarden von Menschen weltweit zu optimieren. Mit Android 8.1 machen wir Android zu einer hervorragenden Plattform für Einsteigergeräte. Zu den Funktionen in der Konfiguration für Android Oreo (Go-Edition) gehören:

  • Speicheroptimierungen Die Speichernutzung wurde plattformübergreifend verbessert, damit Apps auf Geräten mit 1 GB RAM oder weniger 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 sind auf Geräten mit Android Oreo (Go-Edition) verfügbar. Bei Google Play werden jedoch Apps präsentiert, die von Entwicklern speziell gemäß den Richtlinien für die Entwicklung von Apps für Milliarden von Nutzern optimiert wurden, um Milliarden von Nutzern eine optimale Nutzererfahrung zu bieten.

Wir haben die Richtlinien für die Entwicklung von Apps für Milliarden von Nutzern um zusätzliche Informationen zur Optimierung Ihrer App für Geräte mit Android Oreo (Go-Edition) ergänzt. 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 leihtgewichtiger und effizienter gestalten, profitieren alle Nutzer – unabhängig von ihrem Gerät.

Neural Networks API

Die Neural Networks API bietet beschleunigte Berechnungen und Inferenzen für On-Device-Maschinenlernen-Frameworks wie TensorFlow Lite, die plattformübergreifende ML-Bibliothek von Google für Mobilgeräte, sowie Caffe2 und andere. Im Open-Source-Repository von TensorFlow Lite finden Sie Downloads und Dokumentationen. 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.

Die Klasse BaseAdapter enthält jetzt die Methode setAutofillOptions(), mit der Sie Stringdarstellungen der Werte in einem Adapter angeben können. Dies ist nützlich für das Kreiselsymbol Steuerelemente, die die Werte in ihren Adaptern dynamisch generieren. Mit der Methode setAutofillOptions() können Sie beispielsweise eine Stringdarstellung der Liste der Jahre bereitstellen, die Nutzer als Ablaufdatum einer Kreditkarte auswählen können. Autofill-Dienste können die Zeichenfolgendarstellung um die Datenansichten, für die die Daten erforderlich sind, entsprechend auszufüllen.

Außerdem enthält die Klasse AutofillManager die Methode notifyViewVisibilityChanged(View, int, boolean), die Sie aufrufen können, um das Framework über Änderungen an der Sichtbarkeit einer Ansicht in einem virtuellen Gebäude zu informieren. Es gibt auch eine Überlastung der Methode für virtuelle Strukturen erstellen. Bei nicht virtuellen Strukturen müssen Sie das Framework jedoch in der Regel nicht explizit benachrichtigen, da die Methode bereits von der View-Klasse aufgerufen wird.

Mit Android 8.1 können Autofill-Dienste die Benutzeroberfläche für das Speichern weiter anpassen, da CustomDescription and Validator in SaveInfo unterstützt wird.

Benutzerdefinierte Beschreibungen sind nützlich, um dem Autofill-Dienst zu verdeutlichen, was gespeichert wird. Wenn der Bildschirm beispielsweise eine Kreditkarte enthält, kann ein Logo der Kreditkartenbank, die letzten vier Ziffern der Kreditkartennummer und das Ablaufdatum angezeigt werden. 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 Klasse Validator und ihren Unterklassen LuhnChecksumValidator und RegexValidator.

Benachrichtigungen

Android 8.1 enthält die folgenden Änderungen an Benachrichtigungen:

  • Apps können jetzt nur einmal pro Sekunde einen Benachrichtigungston auslösen. Benachrichtigungstöne, die diese Rate überschreiten, werden nicht in die Warteschlange aufgenommen und gehen verloren. Diese Änderung hat keine Auswirkungen auf andere Aspekte des Benachrichtigungsverhaltens. Benachrichtigungen werden weiterhin wie erwartet gesendet.
  • NotificationListenerService und ConditionProviderService werden auf Android-Geräten mit wenig RAM nicht unterstützt, die beim Aufruf von ActivityManager.isLowRamDevice() true zurückgeben.

Update für EditText

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

Die Editable-Oberfläche bietet wertvolle zusätzliche Funktionalität. Da Editable beispielsweise auch die Spannable-Oberfläche implementiert, können Sie Markup auf Inhalte innerhalb einer Instanz von EditText anwenden.

Programmatisch auslösbare Safe Browsing-Maßnahmen

Wenn Sie die WebView-Implementierung der Safe Browsing API verwenden, kann Ihre App erkennen, wenn eine Instanz von WebView versucht, eine URL aufzurufen, die von Google als bekannte Bedrohung eingestuft wurde. 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.

Unter Android 8.1 können Sie programmatisch festlegen, wie Ihre App auf eine bekannte Bedrohung reagiert:

  • Sie können festlegen, ob Ihre App bekannte Bedrohungen an Safe Browsing meldet.
  • Sie können festlegen, dass Ihre App automatisch eine bestimmte Aktion ausführt, z. B. zur sicheren Seite zurückkehrt, wenn eine URL gefunden wird, die von Safe Browsing als bekannte Bedrohung eingestuft wird.

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

Video-Thumbnail-Extractor

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(), da dadurch Speicher verschwendet werden kann, da eine Bitmap mit derselben Auflösung wie das Quellvideo zurückgegeben wird. Für Ein Frame aus einem 4K-Video wäre eine Bitmap von 16 MB, also deutlich größer Thumbnail-Bild fehlt.

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. Sie legen den Speicherschutz für ein SharedMemory-Objekt zum Lesen und/oder Schreiben fest. Da das SharedMemory-Objekt verpackbar ist, können Sie es ganz einfach über AIDL an einen anderen Prozess übergeben.

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

WallpaperColors API

Unter Android 8.1 (API-Level 27) kann Ihr Live-Hintergrund der System-UI Farbinformationen zur Verfügung stellen. 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.
  • Wenn Sie ein WallpaperColors-Objekt aus einer Bitmap erstellen möchten, rufen Sie die Methode fromBitmap() auf und übergeben Sie die Bitmapquelle als Parameter.
  • Wenn Sie ein WallpaperColors-Objekt aus einem drawable erstellen möchten, rufen Sie die Methode fromDrawable() auf und übergeben Sie die 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 ein onComputeColors()-Lebenszyklusereignis aus, bei dem Sie ein neues WallpaperColors-Objekt angeben können.

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.

Updates für 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: Es ist ein anbieterspezifischer Fehler beim Fingerabdrucklesegerät aufgetreten.

Kryptografie-Updates

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:
    • 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. Da Entwickler manchmal reflektiv darauf zugreifen, wurden die Shims beibehalten, um die bisherige Nutzung zu unterstützen. Einige Details haben sich jedoch geändert. So hatten Sockets beispielsweise früher den Typ OpenSSLSocketImpl, jetzt aber den Typ ConscryptFileDescriptorSocket oder ConscryptEngineSocket, die beide von OpenSSLSocketImpl abgeleitet sind.
  • Bei SSLSession-Methoden wurde früher IllegalArgumentException geworfen, wenn ein Nullbezug übergeben wurde. Jetzt wird NullPointerException geworfen.
  • Mit RSA KeyFactory können keine Schlüssel mehr aus Byte-Arrays generiert werden, 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 wurde, gab Conscrypt bisher -1 zurück. Die Leseaktion gibt jetzt SocketException zurück.
  • Die Stamm-CA-Zertifikate wurden geändert. Dabei wurden vor allem eine große Anzahl von veralteten Zertifikaten entfernt, aber auch die Stammzertifikate 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