Questa guida descrive i vantaggi della libreria Jetpack Webkit, spiega come funziona e come puoi implementarla nei tuoi progetti.
Panoramica
I componenti WebView sono una parte essenziale dello sviluppo Android, ma a volte possono essere difficili da gestire a causa delle incongruenze nelle funzionalità tra le diverse versioni del sistema operativo Android. Ogni versione del sistema operativo Android fornisce un insieme fisso di API WebView. Poiché Android viene rilasciato con una cadenza più lenta rispetto a WebView, le API Android potrebbero non coprire tutte le funzionalità di WebView disponibili. Ciò comporta un'implementazione più lenta delle funzionalità e un aumento dei costi di test.
Jetpack Webkit risolve questi problemi fungendo da livello di compatibilità e sfruttando l'APK WebView aggiornato sul dispositivo dell'utente. Contiene anche API nuove e moderne disponibili esclusivamente in questa libreria.
Perché utilizzare Jetpack Webkit?
Oltre a offrire la compatibilità tra le versioni, Jetpack Webkit offre anche API nuove e moderne che possono semplificare lo sviluppo e migliorare la funzionalità dell'app:
Attiva l'autenticazione moderna: WebView può gestire senza problemi gli standard di autenticazione web moderni come WebAuthn, consentendo accessi basati su passkey. La libreria
androidx.webkit
ti offre il controllo completo di questa integrazione utilizzando il metodoWebSettingsCompat.setWebAuthenticationSupport()
, che puoi utilizzare per configurare il livello di supporto richiesto dalla tua app.Migliora il rendimento: ottimizza il rendimento di WebView per i casi d'uso della tua app utilizzando API come
prefetchUrlAsync
,prerenderUrlAsync
esetBackForwardCacheEnabled
.Aumenta la stabilità: recupera i processi di rendering bloccati o che non rispondono senza arresti anomali. Per ulteriori informazioni, vedi
WebViewRenderProcess#terminate()
.Offre un controllo granulare sui dati di navigazione: per eliminare i dati di navigazione archiviati da WebView per origini specifiche, utilizza la classe
WebStorageCompat
.
Informazioni sui componenti
Per utilizzare Jetpack Webkit in modo efficace, devi comprendere la relazione tra i seguenti componenti:
Android System WebView: è il motore di rendering basato su Chromium che Google aggiorna regolarmente tramite il Google Play Store con la stessa cadenza di Chrome. Contiene le funzionalità più aggiornate e fornisce il codice di implementazione sottostante per tutte le API WebView.
API framework (
android.webkit
): queste sono le API associate a una versione specifica del sistema operativo Android. Ad esempio, un'app su Android 10 può accedere solo alle API disponibili al momento del rilascio di questa versione. Pertanto, non può utilizzare le nuove funzionalità aggiunte all'APK WebView negli aggiornamenti più recenti. Ad esempio, per gestire un renderer che non risponde conWebView#getWebViewRenderProcess()
, puoi chiamare questo metodo solo su Android 10 e versioni successive.Libreria Jetpack Webkit (
androidx.webkit
): si tratta di una piccola libreria inclusa nell'applicazione. Questa libreria funge da ponte che chiama l'APK WebView anziché le API definite nella piattaforma Android, che ha una versione del sistema operativo fissa. In questo modo, anche quando un'applicazione è installata su un dispositivo con una versione del sistema operativo precedente, come Android 10, l'applicazione può utilizzare le funzionalità WebView più recenti. Ad esempio,WebViewCompat.getWebViewRenderProcess()
funziona in modo simile all'API Framework, ma può essere chiamata anche su tutte le versioni del sistema operativo precedenti ad Android 10.
Se un'API è disponibile sia nel framework sia in Jetpack Webkit, ti consigliamo di scegliere la versione Jetpack Webkit. Ciò contribuisce a garantire un comportamento e una compatibilità coerenti con la più ampia gamma di dispositivi.
Interazione tra Jetpack Webkit e APK
Le API in Jetpack Webkit sono implementate in due parti:
Jetpack Webkit statico: la libreria Jetpack Webkit statica contiene una parte minoritaria del codice responsabile dell'implementazione dell'API.
APK WebView: l'APK WebView contiene la maggior parte del codice.
La tua app chiama l'API Jetpack Webkit, che a sua volta chiama l'APK WebView.
Sebbene tu controlli la versione di Jetpack Webkit nella tua app, non puoi controllare gli aggiornamenti dell'APK WebView sui dispositivi degli utenti. In genere, la maggior parte degli utenti dispone di versioni aggiornate dell'APK WebView, ma la tua app deve comunque fare attenzione a non chiamare API non supportate da quella particolare versione dell'APK WebView.
Jetpack Webkit elimina anche la necessità di controllare manualmente le versioni di WebView.
Per determinare se una funzionalità è disponibile, controlla la relativa costante. Ad
esempio, WebViewFeature.WEB_AUTHENTICATION
.
Come interagiscono tra loro
Jetpack Webkit colma il divario tra l'API Framework statica e l'APK WebView aggiornato di frequente. Quando utilizzi l'API Jetpack Webkit con il pattern di rilevamento delle funzionalità, la libreria esegue un controllo per verificare se la funzionalità è supportata dall'APK WebView installato sul dispositivo dell'utente. In questo modo non è necessario controllare la versione del sistema operativo Android (framework).
Se l'APK WebView è una versione sufficientemente recente, la libreria richiama la funzionalità. In caso contrario, segnala che la funzionalità non è disponibile, impedendo l'arresto anomalo dell'app e consentendoti di gestire la situazione in modo appropriato.
Confronta le API Jetpack Webkit e Framework
Questa sezione confronta i metodi di implementazione con e senza la libreria Jetpack Webkit:
Abilitare l'autenticazione moderna (WebAuthn)
Senza Jetpack Webkit
Non è possibile tramite le API del framework.
Con Jetpack Webkit
Sfrutta WebViewFeature.WEB_AUTHENTICATION
per i controlli di compatibilità.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
WebSettingsCompat.setWebAuthenticationSupport(
webView.settings,
WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
)
}
Eliminare i dati per un'origine (spazio di archiviazione specifico per il sito)
Senza Jetpack WebKit
Nessuna API diretta per cancellare dati di origine specifici. Spesso richiede la cancellazione di tutti i dati.
Con Jetpack WebKit
Utilizza API di compatibilità per l'eliminazione precisa dei dati. Puoi utilizzare una delle seguenti opzioni:
WebStorageCompat.getInstance().deleteBrowsingData()
Oppure
WebStorageCompat.getInstance().deleteBrowsingDataForSite()
Recuperare la versione di WebView
Senza Jetpack WebKit
Utilizza la classe del framework standard.
val webViewPackage = WebView.getCurrentWebViewPackage()
Con Jetpack WebKit
Utilizza il livello di compatibilità per un recupero più sicuro.
val webViewPackage = WebViewCompat.getCurrentWebViewPackage()
Gestire il renderer che non risponde (client renderer)
Senza Jetpack WebKit
Utilizza il metodo del framework standard.
webView.setWebViewRenderProcessClient(myClient)
Con Jetpack WebKit
Utilizza WebViewCompat e un controllo delle funzionalità per impostare il client.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}
Per saperne di più, consulta la documentazione di riferimento di androidx.webkit
.
Integra Jetpack Webkit nel tuo codice
L'utilizzo di Jetpack Webkit aumenta le funzionalità della classe WebView standard, ma non sostituisce completamente la classe WebView originale.
Puoi continuare a utilizzare la classe android.webkit.WebView
. Puoi aggiungerlo
ai layout XML e ottenere un riferimento all'istanza nel codice. Per
accedere alle funzionalità del framework standard, puoi comunque chiamare i metodi direttamente sull'istanza
WebView o sul relativo oggetto delle impostazioni.
Per accedere alle funzionalità moderne, utilizza i metodi helper statici forniti da
Jetpack Webkit, come WebViewCompat
e WebSettingsCompat
. Passa l'istanza WebView esistente a questi metodi.
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);
}
Implementare Jetpack Webkit
Per implementare Jetpack Webkit, utilizza la seguente procedura.
Passaggio 1: aggiungi la dipendenza
Nel file build.gradle.kts
o build.gradle
del modulo, includi la
seguente dipendenza per aggiungere Jetpack Webkit:
Alla moda
dependencies { implementation "androidx.webkit:webkit:1.14.0" }
Kotlin
dependencies { implementation("androidx.webkit:webkit:1.14.0") }
Jetpack Webkit contiene wrapper sottili, quindi l'impatto sulle dimensioni dell'applicazione è minimo.
Passaggio 2: adotta il pattern di rilevamento delle funzionalità
Per evitare arresti anomali durante la chiamata di API non disponibili, utilizza i controlli delle funzionalità. Ti consigliamo di racchiudere ogni chiamata API in un controllo delle funzionalità e, se possibile, di prendere in considerazione una logica di fallback per i casi in cui l'API non è disponibile.
Ti consigliamo di utilizzare il seguente pattern per l'utilizzo di un'API WebView moderna:
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.
}
Questo pattern contribuisce a garantire la robustezza dell'applicazione. Poiché il controllo delle funzionalità
viene eseguito per primo, l'applicazione non si arresta in modo anomalo se la funzionalità non è disponibile. Il
sovraccarico delle prestazioni del controllo WebViewFeature#isFeatureSupported()
è
trascurabile.