53
わわわわわわ わわわわわ #63 Firefox OS わわわわわわわわわわわわわわ わわわわわわわわわわわわわわわわわ わわわわわ わわ わわ

Firefox OSアーキテクチャクイックツアー

Embed Size (px)

Citation preview

Page 1: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Firefox OS アーキテクチャクイックツアー

株式会社グローバルサイバーグループマネージャ藪下 正美

Page 2: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

はじめに

Page 3: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

自己紹介

• 藪下正美– わんくまでは普段あおいたんとか名乗ってる人– 大阪は#45以来ですおひさしぶりです

• 株式会社グローバルサイバーグループから来ました• Firefox OS コミュニティから来ました• Codezine で記事書きました

– Firefox OS アプリ開発が楽しくなるハードウェア API の概要と、センサー API や音声 API を使った楽器アプリの作例

– http://codezine.jp/article/detail/8540

Page 4: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

会社紹介

• 株式会社グローバルサイバーグループ– 関西出身の組み込み系の会社

• 携帯電話とか業務用コピー機とかデジカメとかの中の人やってます• 最近は Android のすごい下の方か各モバイル OS 向けアプリを主に

やってます– Firefox OS の勉強会を支援する事業やってるので興味があれば

ご相談ください• http://www.gcg.bz/labo_blog/?page_id=943

– 各種モバイル OS の質問も受け付けてます。ブログで回答します• http://www.gcg.bz/labo_blog/?page_id=945

Page 5: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

コミュニティ紹介

• Firefox OS コミュニティで各種イベントのスタッフとかスピーカとかやってます– FxOS コードリーディングというコミュニティのいいだしっぺ

• http://reading.fxos.org/• 大体毎月 Mozilla Japan のオフィスでソースコードを読む会やってま

す• 年三回ぐらい成果発表会的なセミナーやってます

• ほかにも HTML5j Web プラットフォーム部とか WoT 的なソフト / ハードを味見するコミュニティもやってます

Page 6: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

今日のアジェンダ1

• Firefox OS の全体像– Gaia– Gecko– Gonk

Page 7: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

今日のアジェンダ2

• Gaia について少し詳しく– Gaia の全体像– アプリの権限– Chrome プロセスと Content プロセス– Chrome プロセスで動くアプリ– Content プロセスで動くアプリ

Page 8: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

今日のアジェンダ3

• Gecko について少し詳しく– Gecko 概要– 三大機能と三つのツリー

Page 9: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

今日のアジェンダ4

• Gonk について少し詳しく– HAL– AOSP Linux

• 全体まとめ• さいごに

Page 10: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Firefox OS の全体像

• Firefox OS は大別して三つのモジュールで構成される

Page 11: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Firefox OS の全体像

• Firefox OS は大別して三つのモジュールで構成される– Gaia

• UI やプリインアプリなどユーザに見える基本機能を提供する

• すべて HTML5 で書かれている

Page 12: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Firefox OS の全体像• Firefox OS は大別して三つの

モジュールで構成される– Gecko

• Gaia やユーザアプリが使用する API や HTML5 のランタイムを提供する

• C++ 、 JS 、 IDL など多くの言語で実現されている

Page 13: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Firefox OS の全体像• Firefox OS は大別して三つの

モジュールで構成される– Gonk

• OS 、 HAL などを含む層• C/C++ で書かれている

Page 14: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gaia

• UI やプリインアプリなどでデバイスの基本的な操作を提供する

• すべて HTML5 で書かれている

• Gecko に依存するがプラットフォームに依存しない– B2G デバイス、デスクトップ、

シミュレータなど Gecko が動作する環境であれば広く動作する

• Gaia はプロファイルに応じて提供する機能や UI の変更が多い

Page 15: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gecko

• Gaia やユーザアプリが使用する API や HTML5 のランタイムを提供する

• C++ 、 JS 、 IDL など多くの言語で実現されている

• Firefox や Thunderbird などの Mozilla 製品で共通のランタイム

Page 16: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gonk

• OS 、 HAL などを含む層• Windows や Mac OS X など

の OS と同等に Gecko の移植対象プラットフォームの一つとして定義されている

• Gonk は現状唯一 B2G の要求を満たすプラットフォーム– 他の OS では必要な権限が得ら

れない• Gonk で使用される OS は

AOSP Linux

Page 17: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

GAIA について少し詳しく

Page 18: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gaia の全体像

• Gaia のアプリ ( 以下内部アプリ ) は UI や基本機能を提供する

• 内部アプリは大きく分けてChrome プロセスで動くアプリと Content プロセスで動くアプリに分けられる

Page 19: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

アプリの権限

• アプリには利用できる API の範囲が異なる権限タイプが存在する– web 権限 ( ホスト型アプリ /単純なパッケージ型アプリ )

– trusted 権限 (信頼されたホスト型アプリ )

– privileged 権限 (特権型アプリ )

– certified 権限 ( 内部アプリ )

権限 概要

Web 権限

基本的な権限ハードウェアにアクセスする API やプライバシーにかかわる API が使えない

Trusted 権限V2.1 から追加された権限一部のユーザに許可を求めるタイプの API を使用できる

Privileged 権限

事業者に関わる課金、重大なプライバシー / セキュリティインシデントが予想されるものを除いた API が使用できる権限

Certified 権限キャリアやメーカがプリインアプリでのみ使用可能な権限すべての API を使用できる

Page 20: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Chrome プロセスと Content プロセス

• 内部アプリは特権的な機能を利用するため認証 (certified) 権限を持つ

• Gecko の制約上特権的 API は特権的なプロセスでないと実行できない

• この特権的なプロセスをChrome プロセスと呼ぶ

Gaia

Gecko

Chromeプロセス

Contentプロセス

APIs(Interface)

APIs(Implement)

API呼び出し

Page 21: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Chrome プロセスと Content プロセス

• 内部アプリの大部分を含む一般的なアプリでは特権的でない Content プロセスで動作する

• Content プロセスで動作するアプリでもアプリマニフェストで宣言し、ユーザに許可された機能については API の使用を許可される

Gaia

Gecko

Chromeプロセス

Contentプロセス

APIs(Interface)

APIs(Implement)

Page 22: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

アプリのヒエラルキー

• Firefox OS のアプリは少数のChrome プロセスアプリと多数の Content プロセスアプリからなる

• Firefox OS で実行されるアプリは System アプリの子プロセスとして実行される

• 子プロセスは Content プロセスとして起動される

Gaia

Gecko

Chromeプロセス

Contentプロセス

APIs(Interface)

APIs(Implement)

Page 23: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Chrome プロセスで動くアプリ

• Chrome プロセスで動くアプリとしては以下のものが挙げられる– System アプリ– Settings アプリ– ブラウザアプリ– キーボードアプリ– 検索アプリ

• これらのアプリには Systemアプリの一部として動作するものもある

System Settings

ブラウザ キーボード

検索

Page 24: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

System アプリ

• アプリの管理とか共通して使われる UI を管理するアプリ

• Firefox OS で見た目のあるアプリすべての親– 見た目がないアプリもいくつか

ぶら下がっている• アプリ起動時のアニメーショ

ンやアプリの切り替えなどもSystem アプリの管轄

Settings

ブラウザ キーボード

検索

System

Page 25: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Settings アプリ

• 特定のアプリによらない設定を行うアプリ

• 端末設定を変更するのは特権的機能なので Chrome プロセスで動作する

• System アプリが提供している機能の設定は Settings アプリの仕事となる

ブラウザ キーボード

検索

System Settings

Page 26: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

ブラウザアプリ

• その名の通りブラウザアプリ• web ブラウズだけでなくアプ

リのインストール経路にもなるので特権的な位置づけにある

Settings

キーボード

検索

System

ブラウザ

Page 27: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

キーボードアプリ

• ユーザが文字入力を行うためのアプリ

• ここではキーボードそのものではなくキーボードが動作するフレームワークになる部分を指している

• 実際操作される部分はユーザが選択可能であり作成可能である

Settings

ブラウザ

検索

System

キーボード

Page 28: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

検索

• ホーム画面上部にある検索ボックス

• v2.1 からはアプリ起動中もステータスバーに常駐するようになった

• 検索ボックスもアプリのインストール経路になるので特権的な位置づけになる

Settings

ブラウザ キーボード

System

検索

Page 29: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Content プロセスで動くアプリ

• Content プロセスで動くアプリは多数あるが大別すると以下の二つ– プリインアプリ ( 内部アプリ )– ユーザアプリ

プリインアプリ

ユーザアプリ

Page 30: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

プリインアプリ

• ダイアラやメッセージングなどの工場出荷状態でインストール済みのアプリ

• 一部の特権アプリを除いてほぼ認証権限を持つ

• 一般の開発者によるアプリも採用されることがある

ユーザアプリ

プリインアプリ

Page 31: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

ユーザアプリ

• ユーザアプリは出荷後にユーザによってインストールされるアプリ

• 基本的には検索やマーケットプレイスを通して入手する

プリインアプリ

ユーザアプリ

Page 32: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

GECKO について少し詳しく

Page 33: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gecko の全体像

• ざっくり分けてブラウザ機能、通信系、レンダラ、描画系、スクリプトエンジン、プラグインコンテナ、プラットフォーム固有層、プラットフォーム抽象化層で構成される

• 全部は話せないのでざっくり分けた機能について一言ずつと代表的な機能の中でも密接な関係を持っている部分について述べる

Gecko

プラットフォーム固有層

プラットフォーム抽象化層

プラグインコンテナ スクリプトエンジン

レンダラ通信系

ブラウザ機能

描画

Page 34: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gecko 概要

• ブラウザ機能– 履歴やブラウザコンテキストの管理、トップレベルオブジェクトの提供などを行う

• 通信系– 主にプロトコルに応じた処理へ

ディスパッチするプロトコルハンドラ、サーバとの通信を行うチャネル、 URI文字列の構文チェックや正規化を行う URI オブジェクトを中心概念として構成される

Gecko

プラットフォーム固有層

プラットフォーム抽象化層

プラグインコンテナ スクリプトエンジン

レンダラ描画通信系

ブラウザ機能

Page 35: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gecko 概要

• レンダラ– CSS や style属性、 JS からの操

作によって決定される DOM ツリーの表示表現を作り描画系に指示を与える

• 描画系– プラットフォームに依存しない抽象化された描画フレームワーク Moz2D 、旧フレームワークの Thebes 、レイヤシステム、APZ (Asynchronous Pan and Zoom) などからなる

Gecko

プラットフォーム固有層

プラットフォーム抽象化層

プラグインコンテナ スクリプトエンジン

通信系

ブラウザ機能

レンダラ描画

Page 36: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gecko 概要

• スクリプトエンジン– JavaScriptエンジ

ン、 XPConnect (XPCOM) 、WebIDL バインディングなど数種類の言語処理系を持つ

• プラグインコンテナ– Flash プレイヤーなどのサードパーティプラグインや DRM システム、ビデオハードウェア、その他埋め込みオブジェクトなどをブラウザ本体のプロセスから切り離し影響を最小化するためのコンテナ機能を提供する

Gecko

プラットフォーム固有層

プラットフォーム抽象化層

レンダラ通信系

ブラウザ機能

描画

プラグインコンテナ スクリプトエンジン

Page 37: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gecko 概要

• プラットフォーム抽象化層– NSPR 、 XPCOM などのクロス

プラットフォーム用抽象化ライブラリや文字列、数などのプラットフォームによらず表現を一定にしたいプリミティブなデータ表現を提供する

• プラットフォーム固有層– ウィジェット、ファイル、ソケット、ヒューマンインターフェイスなど低レイヤ機能

Gecko

プラグインコンテナ スクリプトエンジン

レンダラ通信系

ブラウザ機能

描画

プラットフォーム固有層

プラットフォーム抽象化層

Page 38: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

三大機能と三つのツリー

• ここからはブラウザ機能、レンダラ、描画系、スクリプトエンジンにまたがる Geckoの主要機能について述べる

Gecko

プラットフォーム固有層

プラットフォーム抽象化層

プラグインコンテナ

通信系

スクリプトエンジン

レンダラ

ブラウザ機能

描画

Page 39: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

三大機能と三つのツリー

• Gecko はブラウザの機能として HTMLパーザ、 JSエンジン、 CSS レンダラを持つ

• これらはそれぞれ DOM ツリー、 JS オブジェクトツリー、レンダリングツリーという密接に関係した三つのツリー構造を持つ

Gecko

プラットフォーム固有層

プラットフォーム抽象化層

プラグインコンテナ

通信系

スクリプトエンジン

レンダラ

ブラウザ機能

描画

HTMLパーザ

JSエンジン

CSS レンダラ

Page 40: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

三大機能と三つのツリー

• HTML がパースされ DOM ツリーになると、 DOM ツリーと対応した JS オブジェクトのツリー、 DOM ツリーに CSSや JS による操作を適用して描画を行うためのレンダリングツリーも連動して生成される

<html>

<head>

<title> <meta> …

<body>

<header>

<section>

… …

HTMLElement

HTMLHeadElement

HTMLTitleElement

HTMLMetaElement …

HTMLBodyElement

Element

Element

… …

<html>

<body>

<head>

<section>

… …

Page 41: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

HTMLパーザと DOM ツリー

• パーザは HTML を解釈するとDOM と呼ばれるツリー上のデータ構造を構築する

• DOM ツリーは HTML として記述された木構造とその構造上のオブジェクトに対する操作、状態を表したオブジェクト– JavaScript から操作することによって HTML の状態や見た目の状態を変更することができる

HTMLElement

HTMLHeadElement

HTMLTitleElement

HTMLMetaElement …

HTMLBodyElement

Element

Element

… …

<html>

<body>

<head>

<section>

… …

<html>

<head>

<title> <meta> …

<body>

<header>

<section>

… …

Page 42: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

JSエンジンと JS オブジェクトツリー

• JSエンジンは HTML から参照されている JavaScript のソースコードや script タグ内に記述された JavaScript を読み込んで実行する

<html>

<head>

<title> <meta> …

<body>

<header>

<section>

… …

<html>

<body>

<head>

<section>

… …

HTMLElement

HTMLHeadElement

HTMLTitleElement

HTMLMetaElement …

HTMLBodyElement

Element

Element

… …

Page 43: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

<html>

<body>

<head>

<section>

… …

JSエンジンと JS オブジェクトツリー

• この時 DOM ツリーとして構築された木構造と関連してJavaScript から操作可能なオブジェクトを構築していく– その結果 JavaScript から DOM

ツリーを操作したり、何らかの要因で変更された DOM ツリーに対応して JavaScript から参照できるオブジェクトの状態も変化する関係が作られる

<html>

<head>

<title> <meta> …

<body>

<header>

<section>

… …

HTMLElement

HTMLHeadElement

HTMLTitleElement

HTMLMetaElement …

HTMLBodyElement

Element

Element

… …

Page 44: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

レンダラとレンダリングツリー

• レンダラは CSS 、 style属性、JavaScript による操作などの結果 DOM 要素がどのように描画されるかを計算する

<html>

<head>

<title> <meta> …

<body>

<header>

<section>

… …

HTMLElement

HTMLHeadElement

HTMLTitleElement

HTMLMetaElement …

HTMLBodyElement

Element

Element

… …

<html>

<body>

<head>

<section>

… …

Page 45: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

レンダラとレンダリングツリー

• レンダラやスタイルシステムは DOM ツリーをもとにスタイルや JavaScript による操作を適用した描画計算に基づくツリー構造を作る– これをレンダリングツリーと呼

ぶ• レンダラにはパイプライン構造があり、各要素の矩形フレーム生成、レンダリングツリーの構築、レイアウト、リフロー、描画と進む

HTMLElement

HTMLHeadElement

HTMLTitleElement

HTMLMetaElement …

HTMLBodyElement

Element

Element

… …

<html>

<body>

<head>

<section>

… …

<html>

<head>

<title> <meta> …

<body>

<header>

<section>

… …

Page 46: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

GONK について少し詳しく

Page 47: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gonk 概要

• Gonk は OS や低レベル機能を含む層

• 基礎的な OS としては AOSP Linux を使っている

• Windows や Linux 、 Mac OS X のような Gecko の移植対象の一つとして開発されている

Gonk

Daemon

Interfaces

HAL

Drivers

Linux

Page 48: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

Gonk 概要

• 現状 Gecko の移植対象 OS の中では唯一特権的機能にアクセスできるため、他の OS では実現不可能な API なども実装されている

• ここから HAL 層と AOSP Linux について少し述べる

Gonk

Daemon

Interfaces

Drivers

Linux

HAL

Page 49: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

HAL

• その名の通りハードウェアを抽象化する層– Gecko の HAL ラッパー層で上位に提供する API仕様を満たす制御を行い、 Gonk の HAL 層は Gecko の HAL ラッパーが要求するインターフェイスを提供する

– 多くの場合 Gecko の HAL ラッパー層で非同期処理の制御を行い、 Gonk の HAL 層では同期的な API を提供している

Gonk

Daemon

Interfaces

Drivers

Linux

HAL

Page 50: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

AOSP Linux

• Android Open Source Project によってホストされている Linux

• Gonk は AOSP Linux から不要なモジュール (SurfaceFlinger など ) を取り除き Gecko の要求するHAL インターフェイスを実装した OS である

Gonk

Daemon

Interfaces

HAL

Drivers

Linux

Page 51: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

AOSP Linux

• ブートの仕組みは Android と同様に init が init.rc を読み込んで記述にしたがって順次プロセスを起動する– Firefox OS の場合は

init.b2g.rc という固有の設定ファイルが init.rc から参照されている

– init.b2g.rc の記述にしたがってGecko を起動し shell.js という起動用のスクリプトを Geckoに処理させることで Firefox OSを起動する

Gonk

Daemon

Interfaces

HAL

Drivers

Linux

Page 52: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

全体まとめ

• Firefox OS は Gaia 、 Gecko 、 Gonk の三層からなる• Gaia はユーザの目に触れる部分、ユーザが直接触れる体験を提供する

• Gecko はデスクトップブラウザにも使われてるエンジン。ブラウザに必要な機能を一通り備えた (=OS の要件を備えた ) エンジンをミドルウェアとして利用している

• Gonk は Firefox OS のために作られた OS コア部分。 Gecko の移植対象 OS でもある

Page 53: Firefox OSアーキテクチャクイックツアー

わんくま同盟 大阪勉強会 #63

さいごに

• ものすごく駆け足で Firefox OS の全体を一攫いしました• 各部分だけで何セッションかできる骨太機能の集まりな

のでどこを見ても楽しいですよ!• Firefox OS コミュニティはまだ若い世界です• あなたも一緒に盛り上げてみませんか?