Bu rehberde, Jetpack Webkit kitaplığının avantajları, işleyiş şekli ve projelerinizde nasıl uygulayabileceğiniz açıklanmaktadır.
Genel Bakış
WebView'lar Android geliştirmenin önemli bir parçasıdır ancak farklı Android OS sürümlerindeki özelliklerde tutarsızlıklar olabileceğinden bazen yönetilmesi zor olabilir. Her Android OS sürümü, sabit bir WebView API'leri grubu sağlar. Android, WebView'dan daha yavaş bir sıklıkta gönderildiğinden Android API'leri, mevcut tüm WebView özelliklerini kapsamayabilir. Bu durum, özelliklerin daha yavaş kullanıma sunulmasına ve test maliyetlerinin artmasına neden olur.
Jetpack Webkit, uyumluluk katmanı olarak hareket ederek ve kullanıcının cihazındaki güncel WebView APK'sinden yararlanarak bu sorunları çözer. Ayrıca, yalnızca bu kitaplıkta bulunan yeni ve modern API'ler de içerir.
Neden Jetpack Webkit kullanılmalı?
Jetpack Webkit, sürümler arası uyumluluk sunmanın yanı sıra geliştirme sürecini basitleştirebilecek ve uygulamanızın işlevselliğini artırabilecek yeni ve modern API'ler de sunar:
Modern kimlik doğrulamayı etkinleştirir: WebView, WebAuthn gibi modern web kimlik doğrulama standartlarını sorunsuz bir şekilde işleyerek geçiş anahtarı tabanlı oturum açma işlemlerine olanak tanır.
androidx.webkitkitaplığı, uygulamanızın gerektirdiği destek düzeyini yapılandırmak için kullanabileceğinizWebSettingsCompat.setWebAuthenticationSupportyöntemini kullanarak bu entegrasyon üzerinde tam kontrol sahibi olmanızı sağlar.Performansı artırır:
setBackForwardCacheEnabledgibi API'leri kullanarak WebView'un performansını hassas bir şekilde ayarlayın veyaprefetchUrlAsyncveprerenderUrlAsyncgibi tahmine dayalı içerik API'lerini kullanarak gezinme gecikmesini azaltın. Daha fazla bilgi için WebView'da tahmine dayalı içerik konusuna bakın.Kararlılığı artırır: Donan veya yanıt vermeyen oluşturucu işlemlerini kilitlenmeden kurtarır. Daha fazla bilgi için
WebViewRenderProcess#terminatekonusuna bakın.Tarama verileri üzerinde ayrıntılı kontrol sunar: WebView tarafından belirli kaynaklar için depolanan tarama verilerini silmek üzere
WebStorageCompatsınıfını kullanın.Gelişmiş sayfa gezinme olanağı sunar: Ayrıntılı gezinme kontrolü, geçmiş girişi değiştirme, kayıtlı durum başlığı desteği ve
NavigationListenerkullanılarak ilişkili yaşam döngüsü takibi içinWebView.loadUrlyerineWebViewCompat.navigatekullanın. Daha fazla bilgi için WebViewCompat.navigate ile gelişmiş sayfa gezinme başlıklı makaleyi inceleyin.Durum yönetimini optimize eder: Durum serileştirme sırasında maksimum bayt sınırları belirleyerek
TransactionTooLargeExceptionkarşı koruma sağlar. Daha fazla bilgi için WebView durumunu verimli bir şekilde yönetme başlıklı makaleyi inceleyin.
Bileşenleri anlama
Jetpack Webkit'i etkili bir şekilde kullanmak için aşağıdaki bileşenler arasındaki ilişkiyi anlamanız gerekir:
Android System WebView: Bu, Google'ın Google Play Store üzerinden Chrome ile aynı sıklıkta düzenli olarak güncellediği Chromium tabanlı oluşturma motorudur. En güncel özellikleri içerir ve tüm WebView API'leri için temel uygulama kodunu sağlar.
Framework API'leri (
android.webkit): Bunlar belirli bir Android OS sürümüne sabitlenmiş API'lerdir. Örneğin, Android 10'daki bir uygulama yalnızca bu sürüm yayınlandığında kullanılabilen API'lere erişebilir. Bu nedenle, WebView APK'sına daha yeni güncellemelerde eklenen yeni özellikleri kullanamaz. Örneğin,WebView#getWebViewRenderProcess()ile yanıt vermeyen bir oluşturucuyu kontrol etmek için bu işlevi yalnızca Android 10 ve sonraki sürümlerde çağırabilirsiniz.Jetpack Webkit Library (
androidx.webkit): Bu, uygulamanızda paketlenmiş küçük bir kitaplıktır. Bu kitaplık, sabit bir işletim sistemi sürümüne sahip olan Android platformunda tanımlanan API'leri çağırmak yerine WebView APK'sını çağıran bir köprü görevi görür. Bu sayede, Android 10 gibi eski bir işletim sistemi sürümünün yüklü olduğu cihazlara uygulamalar yüklendiğinde bile bu uygulamalar en yeni WebView özelliklerini kullanabilir. Örneğin,WebViewCompat.getWebViewRenderProcess(), Framework API'ye benzer şekilde çalışır ancak Android 10'dan önceki tüm işletim sistemi sürümlerinde de çağrılabilir.
Bir API hem çerçevede hem de Jetpack Webkit'te kullanılabiliyorsa Jetpack Webkit sürümünü seçmenizi öneririz. Bu, en geniş cihaz yelpazesinde tutarlı davranış ve uyumluluk sağlar.
Jetpack Webkit ve APK etkileşimi
Jetpack Webkit'teki API'ler iki bölüm halinde uygulanır:
Statik Jetpack Webkit: Statik Jetpack Webkit kitaplığı, API'nin uygulanmasından sorumlu kodun küçük bir bölümünü içerir.
WebView APK'sı: Kodun büyük bir kısmı WebView APK'sında bulunur.
Uygulamanız, Jetpack Webkit API'yi çağırır. Bu API de WebView APK'sını çağırır.
Uygulamanızdaki Jetpack Webkit sürümünü kontrol edebilirsiniz ancak kullanıcıların cihazlarındaki WebView APK güncellemelerini kontrol edemezsiniz. Genellikle çoğu kullanıcı WebView APK'sının güncel sürümlerini kullanır ancak uygulamanız, WebView APK'sının söz konusu sürümünün desteklemediği API'leri çağırmamaya dikkat etmelidir.
Jetpack Webkit, WebView sürümlerini manuel olarak kontrol etme ihtiyacını da ortadan kaldırır.
Bir özelliğin kullanılabilir olup olmadığını belirlemek için özelliğin sabit değerini kontrol edin. Örneğin, WebViewFeature.WEB_AUTHENTICATION.
Birlikte işleyiş şekli
Jetpack Webkit, statik Framework API ile sık sık güncellenen WebView APK arasındaki boşluğu doldurur. Jetpack Webkit API'yi feature-detection (özellik algılama) deseniyle kullandığınızda kitaplık, özelliğin kullanıcının cihazına yüklenen WebView APK'sı tarafından desteklenip desteklenmediğini kontrol eder. Bu, Android OS (çerçeve) sürümünü kontrol etme ihtiyacını ortadan kaldırır.
WebView APK'sı yeterince yeni bir sürümse kitaplık özelliği çağırır. Aksi takdirde, özelliğin kullanılamadığını bildirerek uygulamanızın kilitlenmesini önler ve durumu sorunsuz bir şekilde yönetmenizi sağlar.
Jetpack Webkit ve Framework API'lerini karşılaştırma
Bu bölümde, Jetpack Webkit kitaplığıyla ve kitaplık olmadan kullanılan uygulama yöntemleri karşılaştırılmaktadır:
Modern kimlik doğrulamayı (WebAuthn) etkinleştirme
Without Jetpack Webkit
Çerçeve API'leri aracılığıyla mümkün değildir.
Jetpack Webkit ile
Uyumluluk kontrolleri için WebViewFeature.WEB_AUTHENTICATION'dan yararlanır.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
WebSettingsCompat.setWebAuthenticationSupport(
webView.settings,
WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
)
}
Bir kaynakla ilgili verileri silme (siteye özgü depolama)
Without Jetpack WebKit
Belirli kaynak verilerini temizlemek için doğrudan bir API yoktur. Genellikle tüm verilerin temizlenmesi gerekir.
Jetpack WebKit ile
Verilerin tam olarak silinmesi için uyumluluk API'lerini kullanır. Aşağıdaki seçeneklerden birini kullanabilirsiniz:
WebStorageCompat.getInstance().deleteBrowsingData()
Veya
WebStorageCompat.getInstance().deleteBrowsingDataForSite()
WebView sürümünü alma
Without Jetpack WebKit
Standart çerçeve sınıfını kullanır.
val webViewPackage = WebView.getCurrentWebViewPackage()
Jetpack WebKit ile
Daha güvenli bir şekilde almak için uyumluluk katmanını kullanır.
val webViewPackage = WebViewCompat.getCurrentWebViewPackage()
Yanıt vermeyen oluşturucuyu (oluşturucu istemcisi) işleme
Without Jetpack WebKit
Standart çerçeve yöntemini kullanır.
webView.setWebViewRenderProcessClient(myClient)
Jetpack WebKit ile
İstemciyi ayarlamak için WebViewCompat ve özellik kontrolü kullanılır.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}
Kilitlenme kurtarma stratejilerini uygulama hakkında bilgi edinmek için WebView sonlandırmasını işleme başlıklı makaleyi inceleyin. API ayrıntıları için androidx.webkit
referans belgelerine bakın.
Kayıtlı durumu ve işlem boyutunu yönetme
WebViewCompat.saveState API, serileştirme sırasında bayt sınırlarını zorlamanıza ve geçmişi budamanıza olanak tanır. Bu sayede, temel gezinme geçmişini korurken TransactionTooLargeException kilitlenmeleri önlenir.
Without Jetpack WebKit
Boyut sınırı olmadan gezinme yığınını tamamen serileştiren ve yük Android'in 1 MB'lık işlem sınırını aşarsa TransactionTooLargeException'ı tetikleyebilen standart çerçeve yöntemini kullanır.
webView.saveState(outState)
Jetpack WebKit ile
Maksimum bayt sınırını zorunlu kılmak veya ileri yönlendirme girişlerini bırakmak için WebViewCompat kullanır ve işlem taşmalarına karşı koruma sağlar.
WebViewCompat.saveState(webView, outState, maxSizeBytes)
Daha fazla bilgi için WebView durumunu verimli bir şekilde yönetme başlıklı makaleyi inceleyin.
Sayfalarda gezinme ve yaşam döngüsünü izleme
Geçmiş girişi değiştirme, kaydedilmiş durum başlığı desteği ve ilişkili yaşam döngüsü geri çağırmaları destekleyen web sayfalarında gezinmek için WebView.loadUrl yerine WebViewCompat.navigate kullanın.
Without Jetpack WebKit
Geçmiş girişi değiştirme veya ilişkili yaşam döngüsü geri çağırma yöntemi izlemeyi desteklemeyen WebView.loadUrl kullanır.
webView.loadUrl("https://www.example.com")
Jetpack WebKit ile
Geçmiş girişlerini değiştirmek, kaydedilen durumda özel başlıkları korumak ve gezinme durumlarını izlemek için WebViewCompat.navigate ile NavigationParameters kullanır.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEBVIEW_NAVIGATE_EXPERIMENTAL_V1)) {
val params = NavigationParameters.Builder()
.setShouldReplaceCurrentEntry(true)
.build()
val navigation = WebViewCompat.navigate(webView, "https://www.example.com", params)
} else {
webView.loadUrl("https://www.example.com")
}
Gezinme izleme ve parametre yapılandırması hakkında daha fazla bilgi için WebViewCompat.navigate ile gelişmiş sayfa gezinme başlıklı makaleyi inceleyin.
Jetpack Webkit'i kodunuza entegre etme
Jetpack Webkit'i kullanmak, standart WebView sınıfının özelliklerini artırır ancak orijinal WebView sınıfının yerini tamamen almaz.
android.webkit.WebView sınıfını kullanmaya devam edebilirsiniz. Bunu XML düzenlerinize ekleyebilir ve kodunuzda örneğe referans alabilirsiniz. Standart çerçeve özelliklerine erişmek için yöntemleri doğrudan WebView örneğinde veya ayarlar nesnesinde çağırmaya devam edebilirsiniz.
Modern özelliklere erişmek için Jetpack Webkit'in sağladığı statik yardımcı yöntemleri (ör. WebViewCompat ve WebSettingsCompat) kullanırsınız. Mevcut WebView örneğinizi bu yöntemlere iletirsiniz.
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'i uygulama
Jetpack Webkit'i uygulamak için aşağıdaki prosedürü kullanın.
1. adım: Bağımlılığı ekleyin
Jetpack Webkit'i eklemek için modülünüzün build.gradle.kts veya build.gradle dosyasına aşağıdaki bağımlılığı ekleyin:
Eski
dependencies { implementation "androidx.webkit:webkit:1.16.0" }
Kotlin
dependencies { implementation("androidx.webkit:webkit:1.16.0") }
Jetpack Webkit, ince sarmalayıcılar içerdiğinden uygulamanızın boyutu üzerindeki etkisi minimum düzeydedir.
2. adım: Özellik algılama modelini benimseyin
Kullanılamayan API'ler çağrıldığında kilitlenmeleri önlemek için özellik kontrollerini kullanın. Her API çağrısını bir özellik kontrolüyle sarmalamanızı ve API kullanılamadığında yedek mantığı kullanmayı düşünmenizi öneririz.
Modern WebView API'yi kullanmak için aşağıdaki kalıbı öneririz:
Kotlin
import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature
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.
}
Java
import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;
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.getSettings(), WebSettingsCompat.FORCE_DARK_ON);
} else {
// Optionally, provide a fallback for older WebView versions.
}
Bu kalıp, uygulamanın sağlam olmasını sağlar. Özellik kontrolü önce yapıldığından, özellik kullanılamıyorsa uygulama kilitlenmez. WebViewFeature#isFeatureSupported kontrolünün performans ek yükü ihmal edilebilir düzeydedir.