이 가이드에서는 Jetpack Webkit 라이브러리의 이점을 설명하고, 작동 방식과 프로젝트에서 구현하는 방법을 설명합니다.
개요
WebView는 Android 개발의 필수적인 부분이지만, 다양한 Android OS 버전 간의 기능 불일치로 인해 관리하기 어려울 수 있습니다. 각 Android OS 버전은 고정된 WebView API 집합을 제공합니다. Android는 WebView보다 느린 속도로 제공되므로 Android API가 사용 가능한 모든 WebView 기능을 다루지 않을 수 있습니다. 이로 인해 기능 출시가 느려지고 테스트 비용이 증가합니다.
Jetpack Webkit은 호환성 레이어 역할을 하고 사용자 기기의 최신 WebView APK를 활용하여 이러한 문제를 해결합니다. 또한 이 라이브러리에서만 사용할 수 있는 새롭고 최신 API도 포함되어 있습니다.
Jetpack Webkit을 사용해야 하는 이유
버전 간 호환성을 제공하는 것 외에도 Jetpack Webkit은 개발을 간소화하고 앱의 기능을 개선할 수 있는 새롭고 최신 API를 제공합니다.
최신 인증 지원: WebView는 WebAuthn과 같은 최신 웹 인증 표준을 원활하게 처리하여 패스키 기반 로그인을 지원합니다.
androidx.webkit
라이브러리를 사용하면WebSettingsCompat.setWebAuthenticationSupport()
메서드를 사용하여 이 통합을 완전히 제어할 수 있습니다. 이 메서드를 사용하여 앱에 필요한 지원 수준을 구성할 수 있습니다.성능 개선:
prefetchUrlAsync
,prerenderUrlAsync
,setBackForwardCacheEnabled
과 같은 API를 사용하여 앱의 사용 사례에 맞게 WebView의 성능을 미세 조정합니다.안정성 향상: 비정상 종료 없이 정체되거나 응답하지 않는 렌더러 프로세스를 복구합니다. 자세한 내용은
WebViewRenderProcess#terminate()
를 참고하세요.탐색 데이터에 대한 세부적인 제어 제공: 특정 출처에 대해 WebView에서 저장한 탐색 데이터를 삭제하려면
WebStorageCompat
클래스를 사용하세요.
구성요소 이해
Jetpack Webkit을 효과적으로 사용하려면 다음 구성요소 간의 관계를 이해해야 합니다.
Android 시스템 WebView: Chromium 기반 렌더링 엔진으로, Google에서 Chrome과 동일한 주기로 Google Play 스토어를 통해 정기적으로 업데이트합니다. 최신 기능이 포함되어 있으며 모든 WebView API의 기본 구현 코드를 제공합니다.
프레임워크 API (
android.webkit
): 특정 Android OS 버전에 고정된 API입니다. 예를 들어 Android 10의 앱은 해당 버전이 출시되었을 때 제공된 API에만 액세스할 수 있습니다. 따라서 최근 업데이트에서 WebView APK에 추가된 새 기능을 사용할 수 없습니다. 예를 들어WebView#getWebViewRenderProcess()
로 응답하지 않는 렌더러를 처리하려면 Android 10 이상에서만 이를 호출할 수 있습니다.Jetpack Webkit 라이브러리 (
androidx.webkit
): 애플리케이션에 번들로 제공되는 작은 라이브러리입니다. 이 라이브러리는 고정된 OS 버전이 있는 Android 플랫폼에 정의된 API를 호출하는 대신 WebView APK를 호출하는 브리지 역할을 합니다. 이렇게 하면 Android 10과 같은 이전 OS 버전을 실행하는 기기에 애플리케이션이 설치된 경우에도 애플리케이션이 최신 WebView 기능을 사용할 수 있습니다. 예를 들어WebViewCompat.getWebViewRenderProcess()
은 프레임워크 API와 유사하게 작동하지만 Android 10 이전의 모든 OS 버전에서도 호출할 수 있습니다.
프레임워크와 Jetpack Webkit 모두에서 API를 사용할 수 있는 경우 Jetpack Webkit 버전을 선택하는 것이 좋습니다. 이렇게 하면 다양한 기기에서 일관된 동작과 호환성을 보장할 수 있습니다.
Jetpack Webkit 및 APK 상호작용
Jetpack Webkit의 API는 다음 두 부분으로 구현됩니다.
정적 Jetpack Webkit: 정적 Jetpack Webkit 라이브러리에는 API 구현을 담당하는 코드의 일부가 포함되어 있습니다.
WebView APK: WebView APK에는 대부분의 코드가 포함되어 있습니다.
앱이 Jetpack Webkit API를 호출하고 이 API가 WebView APK를 호출합니다.
앱에서 Jetpack Webkit 버전을 제어할 수 있지만 사용자 기기의 WebView APK 업데이트는 제어할 수 없습니다. 일반적으로 대부분의 사용자는 최신 버전의 WebView APK를 사용하지만 앱은 특정 버전의 WebView APK가 지원하지 않는 API를 호출하지 않도록 주의해야 합니다.
Jetpack Webkit은 WebView 버전을 수동으로 확인할 필요도 추상화합니다.
기능이 사용 가능한지 확인하려면 기능 상수를 확인하세요. 예를 들면 WebViewFeature.WEB_AUTHENTICATION
입니다.
작동 방식
Jetpack Webkit은 정적 프레임워크 API와 자주 업데이트되는 WebView APK 간의 격차를 해소합니다. 기능 감지 패턴과 함께 Jetpack Webkit API를 사용하면 라이브러리에서 사용자 기기에 설치된 WebView APK가 기능을 지원하는지 확인합니다. 이렇게 하면 Android OS (프레임워크) 버전을 확인할 필요가 없습니다.
WebView APK가 충분히 최신 버전인 경우 라이브러리가 기능을 호출합니다. 그렇지 않으면 기능을 사용할 수 없다고 보고하여 앱이 비정상 종료되지 않도록 하고 상황을 적절하게 처리할 수 있습니다.
Jetpack Webkit과 프레임워크 API 비교
이 섹션에서는 Jetpack Webkit 라이브러리를 사용하는 구현 방법과 사용하지 않는 구현 방법을 비교합니다.
최신 인증 (WebAuthn) 사용 설정
Jetpack Webkit 없이
프레임워크 API를 통해 불가능합니다.
Jetpack Webkit 사용
호환성 검사를 위해 WebViewFeature.WEB_AUTHENTICATION
활용
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
WebSettingsCompat.setWebAuthenticationSupport(
webView.settings,
WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
)
}
출처의 데이터 삭제 (사이트별 저장소)
Jetpack WebKit 없이
특정 출처 데이터를 삭제하는 직접 API가 없습니다. 모든 데이터를 삭제해야 하는 경우가 많습니다.
Jetpack WebKit 사용
정확한 데이터 삭제를 위해 호환성 API를 사용합니다. 다음 옵션 중 하나를 사용할 수 있습니다.
WebStorageCompat.getInstance().deleteBrowsingData()
또는
WebStorageCompat.getInstance().deleteBrowsingDataForSite()
WebView 버전 가져오기
Jetpack WebKit 없이
표준 프레임워크 클래스를 사용합니다.
val webViewPackage = WebView.getCurrentWebViewPackage()
Jetpack WebKit 사용
더 안전한 검색을 위해 호환성 레이어를 사용합니다.
val webViewPackage = WebViewCompat.getCurrentWebViewPackage()
응답하지 않는 렌더러 (렌더러 클라이언트) 처리
Jetpack WebKit 없이
표준 프레임워크 메서드를 사용합니다.
webView.setWebViewRenderProcessClient(myClient)
Jetpack WebKit 사용
WebViewCompat 및 기능 확인을 사용하여 클라이언트를 설정합니다.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}
자세한 내용은 androidx.webkit
참조 문서를 확인하세요.
코드에 Jetpack Webkit 통합
Jetpack Webkit을 사용하면 표준 WebView 클래스의 기능이 보강되지만 원래 WebView 클래스를 완전히 대체하지는 않습니다.
android.webkit.WebView
클래스를 계속 사용할 수 있습니다. XML 레이아웃에 추가하고 코드에서 인스턴스를 참조할 수 있습니다. 표준 프레임워크 기능에 액세스하려면 WebView 인스턴스 또는 설정 객체에서 직접 메서드를 호출하면 됩니다.
최신 기능에 액세스하려면 Jetpack Webkit에서 제공하는 정적 도우미 메서드(예: WebViewCompat
및 WebSettingsCompat
)를 사용합니다. 기존 WebView 인스턴스를 이러한 메서드에 전달합니다.
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)
}
자바
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 구현
Jetpack Webkit을 구현하려면 다음 절차를 사용하세요.
1단계: 종속 항목 추가하기
모듈의 build.gradle.kts
또는 build.gradle
파일에 다음 종속 항목을 포함하여 Jetpack Webkit을 추가합니다.
Groovy
dependencies { implementation "androidx.webkit:webkit:1.14.0" }
Kotlin
dependencies { implementation("androidx.webkit:webkit:1.14.0") }
Jetpack Webkit에는 얇은 래퍼가 포함되어 있으므로 애플리케이션 크기에 미치는 영향이 최소화됩니다.
2단계: 기능 감지 패턴 채택하기
사용할 수 없는 API를 호출할 때 비정상 종료를 방지하려면 기능 확인을 사용하세요. 각 API 호출을 기능 확인으로 래핑하고 API를 사용할 수 없는 경우 대체 로직을 고려하는 것이 좋습니다.
최신 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.
}
이 패턴은 애플리케이션의 견고성을 보장하는 데 도움이 됩니다. 기능 확인이 먼저 실행되므로 기능을 사용할 수 없는 경우 애플리케이션이 비정상 종료되지 않습니다. WebViewFeature#isFeatureSupported()
확인의 성능 오버헤드는 무시할 수 있습니다.