In dieser Anleitung werden die Vorteile der Jetpack Webkit-Bibliothek beschrieben. Außerdem wird erläutert, wie sie funktioniert und wie Sie sie in Ihren Projekten implementieren können.
Übersicht
WebViews sind ein wesentlicher Bestandteil der Android-Entwicklung, können aber aufgrund von Inkonsistenzen bei den Funktionen in verschiedenen Android-Betriebssystemversionen manchmal schwierig zu verwalten sein. Jede Android-Betriebssystemversion bietet einen festen Satz von WebView-APIs. Da Android langsamer als WebView ausgeliefert wird, decken Android-APIs möglicherweise nicht alle verfügbaren WebView-Funktionen ab. Dies führt zu einer langsameren Einführung von Funktionen und höheren Testkosten.
Jetpack Webkit löst diese Probleme, indem es als Kompatibilitätsebene fungiert und das aktuelle WebView-APK auf dem Gerät des Nutzers verwendet. Sie enthält auch neue und moderne APIs, die ausschließlich in dieser Bibliothek verfügbar sind.
Warum Jetpack Webkit verwenden?
Jetpack Webkit bietet nicht nur versionsübergreifende Kompatibilität, sondern auch neue und moderne APIs, die die Entwicklung vereinfachen und die Funktionalität Ihrer App verbessern können:
Ermöglicht moderne Authentifizierung: WebView kann moderne Webauthentifizierungsstandards wie WebAuthn nahtlos verarbeiten und ermöglicht so die Anmeldung mit Passkeys. Mit der
androidx.webkit
-Bibliothek haben Sie mit der MethodeWebSettingsCompat.setWebAuthenticationSupport()
die vollständige Kontrolle über diese Integration. Damit können Sie den Grad der Unterstützung konfigurieren, den Ihre App benötigt.Leistungssteigerung: Mit APIs wie
prefetchUrlAsync
,prerenderUrlAsync
undsetBackForwardCacheEnabled
können Sie die Leistung von WebView für die Anwendungsfälle Ihrer App optimieren.Erhöht die Stabilität: Angehaltene oder nicht reagierende Renderer-Prozesse können wiederhergestellt werden, ohne dass es zu einem Absturz kommt. Weitere Informationen finden Sie unter
WebViewRenderProcess#terminate()
.Granulare Kontrolle über Browserdaten: Wenn Sie Browserdaten löschen möchten, die von WebView für bestimmte Ursprünge gespeichert wurden, verwenden Sie die Klasse
WebStorageCompat
.
Komponenten
Damit Sie Jetpack Webkit effektiv nutzen können, müssen Sie die Beziehung zwischen den folgenden Komponenten verstehen:
Android System WebView: Dies ist die auf Chromium basierende Rendering-Engine, die Google regelmäßig über den Google Play Store aktualisiert, und zwar im selben Rhythmus wie Chrome. Sie enthält die neuesten Funktionen und den zugrunde liegenden Implementierungscode für alle WebView APIs.
Framework-APIs (
android.webkit
): Diese APIs sind an eine bestimmte Android-Betriebssystemversion gebunden. Eine App unter Android 10 kann beispielsweise nur auf die APIs zugreifen, die bei der Veröffentlichung dieser Version verfügbar waren. Daher kann sie keine neuen Funktionen nutzen, die in neueren Updates zum WebView-APK hinzugefügt wurden. Wenn Sie beispielsweise mitWebView#getWebViewRenderProcess()
einen nicht reagierenden Renderer steuern möchten, können Sie diese Funktion nur unter Android 10 und höher aufrufen.Jetpack Webkit Library (
androidx.webkit
): Dies ist eine kleine Bibliothek, die in Ihrer Anwendung enthalten ist. Diese Bibliothek fungiert als Brücke, die das WebView-APK aufruft, anstatt die in der Android-Plattform definierten APIs aufzurufen, die eine feste Betriebssystemversion haben. So kann die Anwendung auch dann die neuesten WebView-Funktionen nutzen, wenn sie auf einem Gerät mit einer älteren Betriebssystemversion wie Android 10 installiert ist.WebViewCompat.getWebViewRenderProcess()
funktioniert beispielsweise ähnlich wie die Framework-API, kann aber auch für alle Betriebssystemversionen vor Android 10 aufgerufen werden.
Wenn eine API sowohl im Framework als auch in Jetpack Webkit verfügbar ist, empfehlen wir, die Jetpack Webkit-Version zu verwenden. So wird ein einheitliches Verhalten und eine einheitliche Kompatibilität auf einer Vielzahl von Geräten gewährleistet.
Jetpack Webkit und APK-Interaktion
Die APIs in Jetpack Webkit sind in zwei Teile unterteilt:
Statisches Jetpack-Webkit: Die statische Jetpack-Webkit-Bibliothek enthält einen Großteil des Codes, der für die Implementierung der API verantwortlich ist.
WebView-APK: Das WebView-APK enthält den Großteil des Codes.
Ihre App ruft die Jetpack Webkit API auf, die dann das WebView-APK aufruft.
Sie können zwar die Jetpack Webkit-Version in Ihrer App steuern, aber nicht die WebView APK-Updates auf den Geräten der Nutzer. Im Allgemeinen haben die meisten Nutzer aktuelle Versionen des WebView-APKs, aber Ihre App muss trotzdem darauf achten, keine APIs aufzurufen, die von der jeweiligen Version des WebView-APKs nicht unterstützt werden.
Jetpack Webkit macht auch die manuelle Überprüfung von WebView-Versionen überflüssig.
Um festzustellen, ob eine Funktion verfügbar ist, prüfen Sie die zugehörige Funktionskonstante. Beispiel: WebViewFeature.WEB_AUTHENTICATION
.
Funktionsweise in Kombination
Jetpack Webkit schließt die Lücke zwischen der statischen Framework API und dem häufig aktualisierten WebView APK. Wenn Sie die Jetpack Webkit API mit dem Muster zur Funktionserkennung verwenden, prüft die Bibliothek, ob die Funktion von der auf dem Gerät des Nutzers installierten WebView-APK unterstützt wird. Dadurch entfällt die Notwendigkeit, die Android-Betriebssystemversion (Framework) zu prüfen.
Wenn das WebView-APK eine aktuelle Version ist, wird die Funktion von der Bibliothek aufgerufen. Andernfalls wird gemeldet, dass die Funktion nicht verfügbar ist. So wird verhindert, dass Ihre App abstürzt, und Sie können die Situation angemessen behandeln.
Jetpack Webkit- und Framework-APIs vergleichen
In diesem Abschnitt werden Implementierungsmethoden mit und ohne die Jetpack Webkit-Bibliothek verglichen:
Moderne Authentifizierung (WebAuthn) aktivieren
Ohne Jetpack Webkit
Über Framework-APIs nicht möglich.
Mit Jetpack Webkit
Nutzt WebViewFeature.WEB_AUTHENTICATION
für Kompatibilitätsprüfungen.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
WebSettingsCompat.setWebAuthenticationSupport(
webView.settings,
WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
)
}
Daten für einen Ursprung löschen (standortspezifischer Speicher)
Ohne Jetpack WebKit
Es gibt keine direkte API zum Löschen bestimmter Ursprungsdaten. Häufig müssen alle Daten gelöscht werden.
Mit Jetpack WebKit
Verwendet Kompatibilitäts-APIs für das präzise Löschen von Daten. Sie haben die folgenden Möglichkeiten:
WebStorageCompat.getInstance().deleteBrowsingData()
Oder
WebStorageCompat.getInstance().deleteBrowsingDataForSite()
WebView-Version abrufen
Ohne Jetpack WebKit
Verwendet die Standard-Framework-Klasse.
val webViewPackage = WebView.getCurrentWebViewPackage()
Mit Jetpack WebKit
Verwendet die Kompatibilitätsebene für einen sichereren Abruf.
val webViewPackage = WebViewCompat.getCurrentWebViewPackage()
Umgang mit nicht reagierenden Renderern (Renderer-Client)
Ohne Jetpack WebKit
Verwendet die Standard-Framework-Methode.
webView.setWebViewRenderProcessClient(myClient)
Mit Jetpack WebKit
Verwendet WebViewCompat und eine Funktionsprüfung zum Festlegen des Clients.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}
Weitere Informationen finden Sie in der Referenzdokumentation zu androidx.webkit
.
Jetpack Webkit in Ihren Code einbinden
Durch die Verwendung von Jetpack Webkit werden die Funktionen der Standard-WebView-Klasse erweitert, sie wird jedoch nicht vollständig ersetzt.
Sie können den Kurs android.webkit.WebView
weiterhin verwenden. Sie können es Ihren XML-Layouts hinzufügen und eine Referenz zur Instanz in Ihrem Code abrufen. Um auf Standardfunktionen des Frameworks zuzugreifen, können Sie weiterhin Methoden direkt für die WebView-Instanz oder das zugehörige Einstellungsobjekt aufrufen.
Für den Zugriff auf moderne Funktionen verwenden Sie die statischen Hilfsmethoden, die von Jetpack Webkit bereitgestellt werden, z. B. WebViewCompat
und WebSettingsCompat
. Sie übergeben Ihre vorhandene WebView-Instanz an diese Methoden.
Kotlin
import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature
// You still get your WebView instance the standard way.
val webView: WebView = findViewById(R.id.my_webview)
// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
}
Java
import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;
// You still get your WebView instance the standard way.
WebView webView = findViewById(R.id.my_webview);
// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON);
}
Jetpack Webkit implementieren
So implementieren Sie Jetpack Webkit:
Schritt 1: Abhängigkeit hinzufügen
Fügen Sie in die Datei build.gradle.kts
oder build.gradle
Ihres Moduls die folgende Abhängigkeit ein, um Jetpack Webkit hinzuzufügen:
Cool
dependencies { implementation "androidx.webkit:webkit:1.14.0" }
Kotlin
dependencies { implementation("androidx.webkit:webkit:1.14.0") }
Jetpack Webkit enthält schlanke Wrapper, sodass die Auswirkungen auf die Größe Ihrer Anwendung minimal sind.
Schritt 2: Muster für die Funktionserkennung übernehmen
Verwenden Sie Funktionsprüfungen, um Abstürze beim Aufrufen nicht verfügbarer APIs zu verhindern. Wir empfehlen, jeden API-Aufruf mit einer Funktionsprüfung zu umgeben und möglicherweise eine Fallback-Logik zu berücksichtigen, wenn die API nicht verfügbar ist.
Wir empfehlen das folgende Muster für die Verwendung einer modernen WebView API:
import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature
// In your Kotlin code where you configure your WebView
val webView: WebView = findViewById(R.id.my_webview)
// Before you use a modern API, first check if it is supported.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
// If the check passes, it is safe to call the API.
WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
} else {
// Optionally, provide a fallback for older WebView versions.
}
Dieses Muster trägt dazu bei, dass die Anwendung robust ist. Da die Funktionsprüfung zuerst ausgeführt wird, stürzt die Anwendung nicht ab, wenn die Funktion nicht verfügbar ist. Der Leistungsaufwand der WebViewFeature#isFeatureSupported()
-Prüfung ist vernachlässigbar.