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 を生成してくれる。
▲クラス図
WebView のメソッドのほとんどは WebViewProvider のメソッドをそのまま呼び出す。WebViewClassic が WebViewProvider を実装している。
この WebViewClassic がどのように生成されるのか追ってみる。
- WebViewFactory の getProvider() から WebViewFactoryProvider のインスタンスを取得する。
JB の WebView では、WebViewClassic.Factory が WebViewFactoryProvider を実装する。
(なお、KK 以降は、WebViewChromium.Factory が WebViewFactoryProvider を実装する。)
- WebViewChromium.Factory の createWebView() が WebViewChromium を生成する。
▲シーケンス図(WebView ~ WebViewProvider ~ WebViewClassic)
WebViewClassic は、Android WebView としての機能を実装するクラスである。WebViewCore を使ってブラウザエンジンとの橋渡しをして、WebView からの要求の処理や WebViewClient へコールバックする機能を提供する。
Android 4.4(KitKat)
KitKat から WebView の実装クラスは WebViewClassic から WebViewChromium へと変更された。先述のパターンが用意されていたため、WebView を実装するクラスへの影響は最小限に抑えられている。
▲クラス図(WebView ~ WebViewProvider ~ WebViewClassic)
▲クラス図(WebViewClassic ~ WebViewCore)
Android 5.0(Lollipop)
Lollipop からは WebView が webview.apk として分離し、Playストア配信されることになった*1。
基本的なクラス構成は変更されていないが、WebViewFactory に loadNativeLibrary() が追加され、 getProvider() でネイティブな Chroimium ライブラリをロードするようになっている。
▲クラス図(WebView ~ WebViewProvider ~ WebViewChromium)
▲シーケンス図(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 におけるソースの対照を記す:
- frameworks/webview/chromium
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/
- external/chromium_org
aosp https://android.googlesource.com/platform/external/chromium_org/+/android-5.0.0_r1/
chromium https://chromium.googlesource.com/chromium/src/ ※一致するバージョンが存在しない
おわりに
WebView は、いまや Android の中核を成す機能のひとつであるが、いざ内部の実装を知りたいときにパッケージ構成やクラス構成が解説された記事がほとんどなく、とっかかりづらい。そこで自分の理解を解説した記事を書こうと思ったのだが、薄っぺらい記事になってしまった。いつか、時間がある時に、もうすこし詳しく書く。
関連記事
まだありません。