Android WebView の進化と実装

Android WebView は Android のバージョンごとにブラウザエンジンが異なる。

Chromiumレンダリングエンジンは Blink であり、Blink は WebKit をベースとしている。

さらに、Android 5.0(Lollipop)からは、WebView がブラウザエンジンを含む APK として配信されることになった。

Android 4.1~4.3(JellyBean)

将来的に WebView のブラウザエンジンを WebKit から Chromium にするため、IceCreamSandwich 以前の WebView クラスを WebViewClassic に変更し、いくつかのクラスが追加された。

WebViewFactory クラス 実装クラス(WebViewClassic)の WebViewProviderFactory を生成する
WebViewProvider インタフェース 実装クラスが満たすべき機能を規定する
WebViewProviderFactory インタフェース 実装クラスを生成する方法を規定する

具体的に言うと

  • WebViewFactory は WebViewProviderFactory を実装したクラスの生成方法を知っている。

getFactory() で WebViewProviderFactory を教えてくれる。

  • WebViewProviderFactory は WebViewProvider を実装したクラスの生成方法を知っている。

createWebView() で WebViewProvider を生成してくれる。


f:id:incesticide:20141206203255j:plain
▲クラス図


WebView のメソッドのほとんどは WebViewProvider のメソッドをそのまま呼び出す。WebViewClassic が WebViewProvider を実装している。

この WebViewClassic がどのように生成されるのか追ってみる。

  • WebViewFactory の getProvider() から WebViewFactoryProvider のインスタンスを取得する。

JB の WebView では、WebViewClassic.Factory が WebViewFactoryProvider を実装する。
(なお、KK 以降は、WebViewChromium.Factory が WebViewFactoryProvider を実装する。)

  • WebViewChromium.Factory の createWebView() が WebViewChromium を生成する。


f:id:incesticide:20141206203319j:plain
▲シーケンス図(WebView ~ WebViewProvider ~ WebViewClassic)


WebViewClassic は、Android WebView としての機能を実装するクラスである。WebViewCore を使ってブラウザエンジンとの橋渡しをして、WebView からの要求の処理や WebViewClient へコールバックする機能を提供する。

Android 4.4(KitKat

KitKat から WebView の実装クラスは WebViewClassic から WebViewChromium へと変更された。先述のパターンが用意されていたため、WebView を実装するクラスへの影響は最小限に抑えられている。


f:id:incesticide:20141206203334j:plain
▲クラス図(WebView ~ WebViewProvider ~ WebViewClassic)


f:id:incesticide:20141206203349j:plain
▲クラス図(WebViewClassic ~ WebViewCore)

Android 5.0(Lollipop)

Lollipop からは WebView が webview.apk として分離し、Playストア配信されることになった*1

基本的なクラス構成は変更されていないが、WebViewFactory に loadNativeLibrary() が追加され、 getProvider() でネイティブな Chroimium ライブラリをロードするようになっている。


f:id:incesticide:20141206203403j:plain
▲クラス図(WebView ~ WebViewProvider ~ WebViewChromium)


f:id:incesticide:20160423161153j:plain
▲シーケンス図(WebView ~ WebViewProvider ~ WebViewChromium)

Android 6.0(Marshmallow)[2016/04/23 追記]

Marshmallow からは external/chromium-webview にある webview.apk がバンドルされるようになり、frameworks/webview/chromium および external/chromium_org からソースコードが配置されなくなった*2*3

クラス構成・シーケンスは Lollipop から変更されていない。ただし、WebViewFactoryProvider と WebViewChromium が webview.apk の内部に隠ぺいされている。


KitKat から Lollipop までの間、Android Open Source Project と Chromium で二重管理されてきたソースが Chromium に一本化された。参考として Lollipop におけるソースの対照を記す:

aosp https://android.googlesource.com/platform/frameworks/webview/+/android-5.0.0_r1/chromium/
chromium https://chromium.googlesource.com/external/android_webview_glue/+/android-5.0.0_r1/chromium/

aosp https://android.googlesource.com/platform/external/chromium_org/+/android-5.0.0_r1/
chromium https://chromium.googlesource.com/chromium/src/ ※一致するバージョンが存在しない

おわりに

WebView は、いまや Android の中核を成す機能のひとつであるが、いざ内部の実装を知りたいときにパッケージ構成やクラス構成が解説された記事がほとんどなく、とっかかりづらい。そこで自分の理解を解説した記事を書こうと思ったのだが、薄っぺらい記事になってしまった。いつか、時間がある時に、もうすこし詳しく書く。

関連記事

まだありません。