猫でも分かる android webkit

42
猫でも分かる Android WebKit Naruto TAKAHASHI([email protected] ) Turbo Systems Co, Ltd. 横浜 Androidプラットフォーム部第26回勉強会

Upload: naruto-takahashi

Post on 11-Nov-2014

11.187 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: 猫でも分かる Android WebKit

猫でも分かるAndroid WebKit

Naruto TAKAHASHI([email protected])

Turbo Systems Co, Ltd.

横浜Androidプラットフォーム部第26回勉強会

Page 2: 猫でも分かる Android WebKit

Agenda

WebKit

Android WebKit

Page 3: 猫でも分かる Android WebKit

WebKit Knowledge of WebKit

Page 4: 猫でも分かる Android WebKit

WebKit とは

OSSのHTMLレンダリングエンジンライブラリ

HTML

CSS

Javascript

SVG

Page 5: 猫でも分かる Android WebKit

WebKit とは(cont)

言語は C++

KDE プロジェクトの KHTML から fork した

KHTML は Qt がベースになっている。

構造がしっかりしているとのうわさが!

Page 6: 猫でも分かる Android WebKit

ライセンス

ライセンスは LGPL と BSD-style

KHTML のものは LGPL

それ以外は BSD-style

Page 7: 猫でも分かる Android WebKit

動作プラットフォーム

Mobile platform

• iPhone

• Modern UI

• BREW

• Android

Desktop platform

• MacOSX(Safari)

• Windows

• Linux(X11)

• GTK

• Qt

• EFL

Page 8: 猫でも分かる Android WebKit

Web”Kit”

≒Web レンダリングを

いろんなプラットフォー

ムで動かす”キット”です。

Page 9: 猫でも分かる Android WebKit

WebKit アーキテクチャ

Page 10: 猫でも分かる Android WebKit

WebKit API or WebKit2 API

• WebKit の 外部 API 宣言

• 各プラットフォームで使うための実装を行う

レイヤー

• 例: EFL -> evas_object

• 例: GTK -> GObject

Page 11: 猫でも分かる Android WebKit

WebKit API vs. WebKit2 API

Page 12: 猫でも分かる Android WebKit

WebKit API vs. WebKit2 API(cont)

WebKit WebKit2

プロセスモデル

シングルプロセス

マルチプロセス

API タイプ

ブロッキングAPI(関数コール)

ノンブロッキングAPI(IPC通信)

• WebKit API はシングルプロセスでWebCore の実行は関数コール

• WebKit2 API はマルチプロセスで UI プロセスと WebCoreプロセスを分離• タッチパネルと相性バツグン

Page 13: 猫でも分かる Android WebKit

WebKit API と WebKit2 API の採用実績

• WebKit API

• Chrome

• Android

• WebKit2 API

• Tizen 2.0

• safari

Page 14: 猫でも分かる Android WebKit

WebCore

• HTML レンダリング担当

• WebKit の中核(Core)

• どんなプラットフォームでも WebCore の差異

は少ない。

• Android も 4.1 以降はそんなに手を入れないスタイ

ルになりました。

Page 15: 猫でも分かる Android WebKit

WebCore 処理フロー

1. HTMLをパースして DOM ツリーを構成

2. レンダリングツリーを構成

3. レンダリングツリーのレイアウト

4. レンダリングツリーの描画

Page 16: 猫でも分かる Android WebKit

WebCore 処理フロー(cont)

• WebCore の処理に興味があればこちらをど

うぞ

• ブラウザの仕組み: 最新ウェブブラウザの内部

構造

• http://www.html5rocks.com/ja/tutorials/in

ternals/howbrowserswork/

Page 17: 猫でも分かる Android WebKit

WebCore/platform

• WebCore のプラットフォーム依存処理の実

• プラットフォームでの描画処理

• WebCore 処理フローの描画のブロック

• 各プラットフォームで実装が異なる箇所

Page 18: 猫でも分かる Android WebKit

Javascript

• Javascript 評価

• DOM API と Javascript エンジンとの繋ぎ込みを担当

• JavaScriptCore(WebKit 標準エンジン Tizen, Android 4.0)

• V8(Android 4.1 over)

• Nitro(iOS)

• じゃあ DOM API の宣言や実装はどこでやってるの?

Page 19: 猫でも分かる Android WebKit

WebKitIDL

• DOM API は WebKitIDL を用いて定義

• http://trac.webkit.org/wiki/WebKitIDL

• 拡張子は .idl

• WebCore の至るところへ散らばっている

• 独立した API もすべて WebKitIDL で定義

• GeoLocation API

• File API

Page 20: 猫でも分かる Android WebKit

Example: alert() (IDL 記述)

• IDL ファイルで alert() を宣言

• WebCore/page/DOMWindow.idl

module window {interface DOMWindow {

void alert(in DOMString message);}

}

Page 21: 猫でも分かる Android WebKit

Example: alert() (ヘッダ宣言)

• 対応する処理をヘッダに宣言

• WebCore/page/DOMWindow.h

namespace WebCore {class DOMWindow {

void alert(const String& message);}

}

Page 22: 猫でも分かる Android WebKit

Example: alert() (処理)

• 処理をソースに記述

• WebCore/page/DOMWindow.cpp

void DOMWindow::alert(const String& message){

Page* page = m_frame->page();

page->chrome()->runJavaScriptAlert(m_frame, message);}

Page 23: 猫でも分かる Android WebKit

WebKit 各レイヤーまとめ

• WebKit API or WebKit2 API

• 各プラットフォームのための外部 API 宣言

• WebCore

• HTML レンダリング処理

• WebCore/platform

• 各プラットフォームへのレンダリング処理

• Javascript

• Javascript エンジンとの繋ぎ込み

Page 24: 猫でも分かる Android WebKit

WebKit のポーティングガイド

• WebKit をプラットフォームへ移植したい

• WebKit あるいは WebKit2 を実装しましょう

• WebCore の platform を実装しましょう

• 独自 Javascript API がほしい

• WebKitIDL で実装しましょう

Page 25: 猫でも分かる Android WebKit

Android WebKit

Knowledge of

Android WebKit

Page 26: 猫でも分かる Android WebKit

Android WebKit

• WebKit の Java 実装ソース

• ${Android_Src}/framework/base/core/java/android/w

ebkit

• Android のブラウザは WebKit の Java API で作られて

いる

• 例外

• Google chrome(アプリ自身が WebKit を持っている)

• Firefox(アプリ自身が Gecko を持っている)

Page 27: 猫でも分かる Android WebKit

Android の定番のお約束

• Android Platform は Java なのに、C++ で

作られた WebKit の API はどうやって実行

するの?

• JNI(Java Native Interface)を使用

Page 28: 猫でも分かる Android WebKit

Android の Native WebKit

• Android プロジェクトでソース管理

• ${Android_Src}/external/webkit

• WebKit 本家の変更点をマージ

• プラットフォーム依存の処理は android ディレクトリへ

実装を書いている。

• WebKit 本家に android ディレクトリはなし

• 本家へのフィードバックはしてない模様

Page 29: 猫でも分かる Android WebKit

Android Webkit アーキテクチャ

Page 30: 猫でも分かる Android WebKit

Android.WebKit

• Java から WebKit を使うためのクラス

• WebView

• http://developer.android.com/reference/android

/webkit/WebView.html

• API の宣言と native WebKit のつなぎ合わ

せをしている

Page 31: 猫でも分かる Android WebKit

Android.WebKit(cont)

• Android はなぜタッチパネルと相性の良い

WebKit2 を採用していない?

• Android.WebKit で UI 処理とレンダリング処

理を分離しているため

Page 32: 猫でも分かる Android WebKit

Android WebKit の UI とレンダリングの分離方法

• Android.Handler

• Android.WebKit で Handler で UI 処理とレン

ダリング処理を分けている。

• Native WebKit は 関数コールでレンダリング

処理をするほうが都合がよい。

• 余計な処理されるとむしろ困る

Page 33: 猫でも分かる Android WebKit

Native WebKit API

• Android.WebKit が使用する API の実装

• Android.WebKit と WebCore を繋ぐための

ブリッジ

• JNI の定義がほとんど(むしろ全部)

Page 34: 猫でも分かる Android WebKit

Native WebCore

• WebCore 部分は本家のオリジナルとほぼ一

• 例外的にプラットフォーム依存の処理が追加

されている

• Video タグのジェスチャー処理(Android 4.1)

Page 35: 猫でも分かる Android WebKit

Native WebCore (cont)

• Platform 層

• Skia への描画

• Android リソースへのアクセス

• JNI(C->Java)

Page 36: 猫でも分かる Android WebKit

Skia

• グラフィックライブラリ

• http://code.google.com/p/skia/

Page 37: 猫でも分かる Android WebKit

Javascript 層

• Native WebKit と変わらないので省略

• Android 4.1 以降はエンジンが V8 になりま

した。

Page 38: 猫でも分かる Android WebKit

まとめ まとめます

Page 39: 猫でも分かる Android WebKit

WebKit と Android WebKit の比較

WebKit Android WebKit

WebKit API or

WebKit2 API

WebCore

WebCore/platform

Android.WebKit

JNI

Native

WebCore

Native

WebCore

Native WebKit

API

Native WebCore

Page 40: 猫でも分かる Android WebKit

所感

• Android WebKit を触るためには

• Android Platform についての知識

• WebKit 自体の知識

• 上記二つを繋ぎ込む根気!

• 正直、複雑

Page 41: 猫でも分かる Android WebKit

最後に猫から大切なお知らせ

ソースの見かた分かった?

Page 42: 猫でも分かる Android WebKit

おしまい