Panduan ini menjelaskan manfaat library Jetpack Webkit, cara kerjanya, dan cara mengimplementasikannya di project Anda.
Ringkasan
WebView adalah bagian penting dari pengembangan Android, tetapi terkadang sulit dikelola karena inkonsistensi fitur di berbagai versi OS Android. Setiap versi OS Android menyediakan serangkaian API WebView tetap. Karena Android dikirimkan dengan irama yang lebih lambat daripada WebView, Android API mungkin tidak mencakup setiap fitur WebView yang tersedia. Hal ini menyebabkan peluncuran fitur yang lebih lambat dan peningkatan biaya pengujian.
Jetpack Webkit memecahkan masalah ini dengan bertindak sebagai lapisan kompatibilitas dan memanfaatkan APK WebView terbaru di perangkat pengguna. Library ini juga berisi API baru dan modern yang hanya tersedia di library ini.
Mengapa menggunakan Jetpack Webkit?
Selain menawarkan kompatibilitas lintas versi, Jetpack Webkit juga menawarkan API baru dan modern yang dapat menyederhanakan pengembangan dan meningkatkan fungsionalitas aplikasi Anda:
Mengaktifkan autentikasi modern: WebView dapat menangani standar autentikasi web modern seperti WebAuthn dengan lancar, sehingga memungkinkan login berbasis kunci sandi. Library
androidx.webkit
memberi Anda kontrol penuh atas integrasi ini menggunakan metodeWebSettingsCompat.setWebAuthenticationSupport()
, yang dapat Anda gunakan untuk mengonfigurasi tingkat dukungan yang diperlukan aplikasi Anda.Meningkatkan performa: Sesuaikan performa WebView untuk kasus penggunaan aplikasi Anda menggunakan API seperti
prefetchUrlAsync
,prerenderUrlAsync
, dansetBackForwardCacheEnabled
.Meningkatkan stabilitas: Memulihkan proses perender yang terhenti atau tidak responsif tanpa mengalami error. Untuk informasi selengkapnya, lihat
WebViewRenderProcess#terminate()
.Menawarkan kontrol terperinci atas data penjelajahan: Untuk menghapus data penjelajahan yang disimpan oleh WebView untuk origin tertentu, gunakan class
WebStorageCompat
.
Memahami komponen
Untuk menggunakan Jetpack Webkit secara efektif, Anda harus memahami hubungan antara komponen berikut:
Android System WebView: Ini adalah mesin rendering berbasis Chromium yang diupdate secara rutin oleh Google melalui Google Play Store dengan irama yang sama seperti Chrome. Library ini berisi fitur terbaru dan menyediakan kode implementasi dasar untuk semua WebView API.
Framework API (
android.webkit
): API ini ditetapkan ke versi OS Android tertentu. Misalnya, aplikasi di Android 10 hanya dapat mengakses API yang tersedia saat versi tersebut dirilis. Jadi, aplikasi tidak dapat menggunakan fitur baru yang ditambahkan ke APK WebView dalam update yang lebih baru. Misalnya, untuk mendapatkan handle pada perender yang tidak responsif denganWebView#getWebViewRenderProcess()
, Anda hanya dapat memanggilnya di Android 10 dan yang lebih tinggi.Jetpack Webkit Library (
androidx.webkit
): Ini adalah library kecil yang disertakan dalam aplikasi Anda. Library ini berfungsi sebagai jembatan yang memanggil APK WebView, bukan memanggil API yang ditentukan di platform Android, yang memiliki versi OS tetap. Dengan begitu, meskipun aplikasi diinstal di perangkat yang menjalankan versi OS lama seperti Android 10, aplikasi dapat menggunakan fitur WebView terbaru. Misalnya,WebViewCompat.getWebViewRenderProcess()
berfungsi mirip dengan Framework API, tetapi ini juga dapat dipanggil di semua versi OS sebelum Android 10.
Jika API tersedia di framework dan Jetpack Webkit, sebaiknya Anda memilih versi Jetpack Webkit. Hal ini membantu memastikan perilaku dan kompatibilitas yang konsisten di berbagai perangkat.
Interaksi Jetpack Webkit dan APK
API di Jetpack Webkit diimplementasikan dalam dua bagian:
Static Jetpack Webkit: Library Jetpack Webkit statis berisi sebagian kecil kode yang bertanggung jawab untuk mengimplementasikan API.
APK WebView: APK WebView berisi sebagian besar kode.
Aplikasi Anda memanggil Jetpack Webkit API, yang kemudian memanggil APK WebView.
Meskipun Anda mengontrol versi Jetpack Webkit di aplikasi, Anda tidak dapat mengontrol update APK WebView di perangkat pengguna. Umumnya, sebagian besar pengguna memiliki versi APK WebView yang terbaru, tetapi aplikasi Anda tetap harus berhati-hati agar tidak memanggil API yang tidak didukung oleh versi APK WebView tersebut.
Jetpack Webkit juga menghilangkan kebutuhan untuk memeriksa versi WebView secara manual.
Untuk menentukan apakah suatu fitur tersedia, periksa konstanta fiturnya. Misalnya, WebViewFeature.WEB_AUTHENTICATION
.
Cara fitur tersebut bekerja bersama
Jetpack Webkit menjembatani kesenjangan antara Framework API statis dan APK WebView yang sering diupdate. Saat Anda menggunakan Jetpack Webkit API dengan pola deteksi fitur, library akan melakukan pemeriksaan untuk melihat apakah fitur tersebut didukung oleh APK WebView yang diinstal di perangkat pengguna. Hal ini memberikan manfaat karena tidak perlu memeriksa versi Android OS (framework).
Jika APK WebView adalah versi yang cukup baru, library akan memanggil fitur tersebut. Jika tidak, fitur akan melaporkan bahwa fitur tidak tersedia, sehingga mencegah aplikasi Anda mengalami error dan memungkinkan Anda menangani situasi dengan baik.
Membandingkan Jetpack Webkit dan Framework API
Bagian ini membandingkan metode penerapan dengan dan tanpa library Jetpack Webkit:
Mengaktifkan autentikasi modern (WebAuthn)
Tanpa Jetpack Webkit
Tidak dapat dilakukan melalui framework API.
Dengan Jetpack Webkit
Memanfaatkan WebViewFeature.WEB_AUTHENTICATION
untuk pemeriksaan kompatibilitas.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
WebSettingsCompat.setWebAuthenticationSupport(
webView.settings,
WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
)
}
Menghapus data untuk asal (penyimpanan khusus situs)
Tanpa Jetpack WebKit
Tidak ada API langsung untuk menghapus data origin tertentu. Sering kali memerlukan penghapusan semua data.
Dengan Jetpack WebKit
Menggunakan API kompatibilitas untuk penghapusan data yang akurat. Anda dapat menggunakan salah satu opsi berikut:
WebStorageCompat.getInstance().deleteBrowsingData()
Atau
WebStorageCompat.getInstance().deleteBrowsingDataForSite()
Mendapatkan versi WebView
Tanpa Jetpack WebKit
Menggunakan class framework standar.
val webViewPackage = WebView.getCurrentWebViewPackage()
Dengan Jetpack WebKit
Menggunakan lapisan kompatibilitas untuk pengambilan yang lebih aman.
val webViewPackage = WebViewCompat.getCurrentWebViewPackage()
Menangani perender yang tidak responsif (klien perender)
Tanpa Jetpack WebKit
Menggunakan metode framework standar.
webView.setWebViewRenderProcessClient(myClient)
Dengan Jetpack WebKit
Menggunakan WebViewCompat dan pemeriksaan fitur untuk menyetel klien.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}
Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi androidx.webkit
.
Mengintegrasikan Jetpack Webkit ke dalam kode Anda
Penggunaan Jetpack Webkit meningkatkan kemampuan class WebView standar, tetapi tidak sepenuhnya menggantikan class WebView asli.
Anda dapat terus menggunakan class android.webkit.WebView
. Anda dapat menambahkannya ke tata letak XML, dan mendapatkan referensi ke instance dalam kode Anda. Untuk
mengakses fitur framework standar, Anda tetap dapat memanggil metode secara langsung di
instance WebView atau objek setelannya.
Untuk mengakses fitur modern, Anda menggunakan metode helper statis yang disediakan oleh
Jetpack Webkit, seperti WebViewCompat
dan WebSettingsCompat
. Anda
meneruskan instance WebView yang ada ke metode ini.
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);
}
Mengimplementasikan Jetpack Webkit
Untuk menerapkan Jetpack Webkit, gunakan prosedur berikut.
Langkah 1: Tambahkan dependensi
Dalam file build.gradle.kts
atau build.gradle
modul Anda, sertakan dependensi berikut untuk menambahkan Jetpack Webkit:
Groovy
dependencies { implementation "androidx.webkit:webkit:1.14.0" }
Kotlin
dependencies { implementation("androidx.webkit:webkit:1.14.0") }
Jetpack Webkit berisi wrapper tipis, sehingga dampak pada ukuran aplikasi Anda sangat kecil.
Langkah 2: Terapkan pola deteksi fitur
Untuk mencegah error saat memanggil API yang tidak tersedia, gunakan pemeriksaan fitur. Sebaiknya sertakan pemeriksaan fitur di setiap pemanggilan API, dan pertimbangkan logika penggantian jika API tidak tersedia.
Kami merekomendasikan pola berikut untuk menggunakan WebView API modern:
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.
}
Pola ini membantu memastikan aplikasi memiliki ketahanan yang baik. Karena pemeriksaan fitur
dijalankan terlebih dahulu, aplikasi tidak akan error jika fitur tidak tersedia. Overhead performa pemeriksaan WebViewFeature#isFeatureSupported()
dapat diabaikan.