Android Webkit 요약(개요에서 최신 AndroidX까지)

1. 소개


Android Webkit에 대한 개요와 Android OS와 관련된 역사적 경과를 마지막으로 AndroidX Webkit을 정리했습니다.

2. Webkit 및 WebView 정보


먼저 Webkit과 WebView에 대한 개요 등을 설명합니다.

2.1. WebView란 무엇입니까?


이 글을 읽고 싶은 사람은 설명할 필요가 없습니다. WebView는 Android 응용 프로그램에서 HTML과 웹 페이지 등 HTML 파일을 렌더링(표시)하는 기능을 제공하는 View입니다.
Android 공식 사이트의 문서는 여기 입니다.

2.2. Webkit이란 무엇입니까?


지원 라이브러리에서 WebView 및 웹 탐색 기능을 제공하는 라이브러리입니다.
Android 공식 사이트의 문서는 여기 입니다.
Android Webkit은 실제 WebView의 핵심 기술인 렌더링 엔진(로컬.so 파일로 존재)을 연결한 패키지 API로 WebView와 브라우저의 기능에 필요한 기능을 제공합니다.이 부근의 기능을 활용하면 브라우저 응용 프로그램을 만들 수 있다.

2.3 WebView 렌더링 엔진


WebView의 렌더링 엔진은 다음과 같이 Android OS 4.4를 기준으로 변경됩니다.
안드로이드 OS 버전
WebView 렌더링 엔진
〜4.3
WebKit
4.4 ~ 현재
Blink
WebKit은 주로 Safari에서 사용하는 OSS 렌더링 엔진입니다.
한편, Blink는 앞서 언급한 WebKit로 구글이 자바스크립트 핵심을 V8 엔진으로 변경하거나 대폭 교체한 크롬에서 사용하는 렌더링 엔진이다.마이크로소프트가 WebKit에서 Blink로 갈아타고 엣지 브라우저를 개발하는 것을 감안하면 Blink가 세력도에서 가장 기세가 높다고 볼 수 있다.

2.3.1 [참조] HTML 렌더링 엔진의 세력도


사회의 세력도를 보면 구글의 크롬(Blink)계는 기세가 대단하다.

한편 크롬은 구글 브라우저로 OSS의 브라우저로는 크롬이 있다.Chromium은 구글이 개발한 구글 맞춤형 원본이 없는 Chrome이라고 볼 수 있다.구글은 크롬이라는 OSS에서 핵심 부분을 개발해 크롬 브라우저로 비공개 조미료를 발표했다.
Chromium에 대한 정보 및 소스 코드 등을 참조하십시오여기.

2.4. WebView 마이그레이션 내역


위에서 말한 바와 같이 WebView의 렌더링 엔진은 Android 4.4에서 Blink로 변경되었고, 이외에도 WebView의 배달 방법과 귀속 방법 등도 역사적인 변화가 생겼다.여기 설명해 드릴게요.
WebView의 바인딩 대상은 Android OS 버전이 업그레이드될 때마다 다음과 같이 변경됩니다.
안드로이드 OS 버전
WebView 바인딩
〜4.4
안드로이드 OS 내장
〜6.0
System WebView와 독립적으로 apk를 통해 독립적으로 발표되었고 Play 스토어에서 업데이트되었습니다.WebView 핵심인 Blink는 보안을 포함한 업데이트 빈도가 높기 때문에 안드로이드 OS 내장이 비현실적이기 때문에 이런 수단을 취했다.
7.0〜
Chrome은 개발자 메뉴에서 Chrome or System WebView(Chrome 우선순위)를 선택할 수 있는 WebView 기능을 제공합니다.

System WebView만 해당합니다.개발자 메뉴에서 Chrome 항목 삭제

2.5. WebView 구현 메뉴


개발자를 위한 옵션인 WebView의 구현에서 Android System WebView인지 Chrome인지 선택할 수 있습니다. 앞에서 말한 바와 같이 Androi10에서 Chrome을 삭제했습니다.

Android10에서 System WebView와 Chrome WebView는 Trichrome이라고 불리는 형식으로 공통적으로 제공됩니다.Chrome 어플리케이션이 System WebView의 WebView 기능을 사용하기 시작했다는 건가요?
https://chromium.googlesource.com/chromium/src.git/+/master/docs/android_native_libraries.md

3. AndroidX Webkit


여기서부터 Jetpack 중 하나인 AndroidX Webkit을 설명합니다.Android X Webkit에는 Support Library 교체 외에도 Android X Webkit에서만 사용할 수 있는 새로운 기능이 있습니다.그러나 현재 발전 중에는 안드로이드 웹키트의 완전한 교체 수준에 이르지 못했다.
AndroidX Webkit의 간단한 구조는 다음과 같습니다.

3.1. 새로운 기능


몇 가지 편리한 기능이 있기 때문에 제가 소개해 드릴게요.

3.1.1. WebViewFeature


API 버전 코드를 신경 쓰지 않고 기능 유무 상태에서 코드를 쓸 수 있습니다.

기존 코드

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
    WebView.startSafeBrowsing(this.applicationContext) { value ->
        Log.d(TAG, "WebView.startSafeBrowsing: $value")
    }
}

WebViewFeature 코드 사용

if (WebViewFeature.isFeatureSupported(WebViewFeature.START_SAFE_BROWSING)) {
    WebViewCompat.startSafeBrowsing(this.applicationContext) { value ->
        Log.d(TAG, "WebViewCompat.startSafeBrowsing: $value")
    }
}

3.1.2. ProxyController


프록시 설정이 간단합니다!
if (WebViewFeature.isFeatureSupported(WebViewFeature.PROXY_OVERRIDE)) {
    // proxy1.comが失敗したら、次はproxy2.comのように上から順番に試していく
    val proxyConfig = ProxyConfig.Builder()
        .addProxyRule("proxy1.com")
        .addProxyRule("proxy2.com", ProxyConfig.MATCH_HTTP)
        .addProxyRule("proxy3.com", ProxyConfig.MATCH_HTTPS)
        .addBypassRule("www.google.*") // プロキシ設定除外のホスト
        .build()

    // Executor
    val executor = Executor { Log.d(TAG, "${Thread.currentThread().name} : executor") }

    // プロキシ設定変更が受付された時に呼ばれる?呼ばれないような…
    val listener = Runnable { Log.d(TAG, "${Thread.currentThread().name} : listener") }

    // WebViewのプロキシ設定をシステム設定から上書き
    ProxyController.getInstance().setProxyOverride(proxyConfig, executor, listener)

    // システムの設定に戻す
    ProxyController.getInstance().clearProxyOverride(executor, listener)
}

3.1.3. 암흑 모드 설정 ※ 웹키트: 1.2.0부터 기능


WebView의 다크 모드를 설정할 수 있습니다!
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
   //WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_AUTO)
    //WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_OFF)
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
}

3.2 사용을 시작하기 위해


Build.gradle
dependencies {
    implementation androidx.webkit:webkit:1.2.0
}

3.3 예제 코드


github 중 먼저 직접 이동하는 수준의 샘플 코드를 준비했으니 필요하면 사용하세요.

4. 참고 문헌

  • AndroidX WebKit 프로젝트
  • androidx.사이트 설명
  • 좋은 웹페이지 즐겨찾기