Top Banner
Firefox OS 起動の仕組みを調べてみた 関東Firefox OS勉強会 3rd ごった煮 2013.8.28
20

Firefox OS 起動の仕組みを調べてみた

May 24, 2015

Download

Technology

2013年8月28日に開催される「関東Firefox OS勉強会 3rd ごった煮」の発表資料です。
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Firefox OS 起動の仕組みを調べてみた

Firefox OS 起動の仕組みを調べてみた

関東Firefox OS勉強会 3rd ごった煮 2013.8.28

Page 2: Firefox OS 起動の仕組みを調べてみた

2

本日お話する内容

• Firefox OSの内部構造

• Firefox OSが起動するまでの流れ

Page 3: Firefox OS 起動の仕組みを調べてみた

3

自己紹介

本発表は私の個人的な調査に基づくものです。 内容に誤りがあるかもしれませんがご了承ください

名前 西村 宗晃 (にしむねあ) ・https://www.facebook.com/muneaki.nishimura 職業 セキュリティエンジニア ・セキュア開発のコンサルティング ・Android端末~アプリの開発支援

Page 4: Firefox OS 起動の仕組みを調べてみた

4

求む!Geckoの勉強会を開いてくれる人

• Geckoの中身は複雑で素人には分からないことだらけ

• ウェブでは情報が見つからなかったり、あっても古くて今の仕様と違ったり

• でも、自分で勉強会を開くのはなんだか大変そう

• みんなで一緒にGeckoの中身を調べて きゃっきゃうふふ しませんか?

(C) 2010 Mozilla Japan

Page 5: Firefox OS 起動の仕組みを調べてみた

5

なぜ、起動処理?

OSアーキテクチャの骨格が理解できるから • OSを構成するモジュールの概要や、それぞれの依存関係など

セキュリティ的に重要な機能だから • 多くの処理がroot権限で動くのでよく狙われる • Androidの場合、root化やカスタムROMの起動などに利用される

Page 6: Firefox OS 起動の仕組みを調べてみた

6

Firefox OSの内部構造

Firefox OS 起動の仕組みを調べてみた

Page 7: Firefox OS 起動の仕組みを調べてみた

7

3層構造①

Gonk

Gecko

Gaia Firefox OSの標準UIおよび標準アプリ群。 全てのソフトはHTML/JS/CSSで開発(Webアプリ)

Webアプリの実行環境。FirefoxブラウザのエンジンであるGeckoを拡張し、Webアプリからデバイスの機能を操作できるようにしたもの

OSの基本機能を担当。また、ハードウェアの差異を吸収し、デバイス上でGeckoを動作させる役割を担う

Page 8: Firefox OS 起動の仕組みを調べてみた

8

3層構造②

Gonk

Gecko

Gaia • 起動後スクリーンに表示されるものは全てGaia • オペレーターや端末メーカー独自の実装に差替可能

• Gaiaの使用する機能は全てGeckoが提供 • 実装の大部分はPC版のFirefoxブラウザと共通 • 改変可能だがデメリットもある

(Updateに伴うコスト、MPLによる改変コードの開示義務)

• 低水準OS + GeckoのHAL • HALは使用するハードウェアに応じて改変可能、

ただしOSの差し替えは現実的に困難

Page 9: Firefox OS 起動の仕組みを調べてみた

9

3層構造をもう少しだけ分解

Gonk

Gecko

Gaia

Chrome

XULRunner

Systemアプリ

その他アプリ群

Linux Kernel

Android Misc.

Page 10: Firefox OS 起動の仕組みを調べてみた

10

Chrome

XULRunner

Systemアプリ

その他アプリ群

Linux Kernel

Android Misc.

Gonk

• 主目的はGeckoのChromeプロセスの起動

• 中身はほぼLinux KernelとAndroid

改変や追加したコード(図中のMisc.)は100kB以下

Androidのappprocessやsurfaceflingerは使わないので systemイメージから抜いている

Androidアーキテクチャとの整合性を取るための機能を追加 ⁃ fakeperm : パーミッションチェックを全てOKでパスさせるスタブ ⁃ rilproxy : 電話アプリ以外からrildにアクセスするためのプロキシ

Page 11: Firefox OS 起動の仕組みを調べてみた

11

Chrome

XULRunner

Systemアプリ

その他アプリ群

Linux Kernel

Android Misc.

XULRunner

• Cross PlatformのHTML/XULパーサおよびレンダラ

FirefoxブラウザをOS毎に個別開発せず済むように開発された

Geckoレンダリングエンジンを内包

• ブラウザの画面自体もレンダリングできる

Firefoxブラウザのウィンドウ(Chrome)もXULのドキュメント

• XULRunnerには2種類ある

Firefoxブラウザの内部に組み込まれたPrivateなXULRunner

スタンドアロンアプリの開発を可能とするPublicなXULRunner

Page 12: Firefox OS 起動の仕組みを調べてみた

12

Chrome

XULRunner

Systemアプリ

その他アプリ群

Linux Kernel

Android Misc.

Chrome

• 簡単に言うとブラウザウィンドウのこと

FirefoxブラウザのChrome ⁃ chrome://browser/content/browser.xul ⁃ アドレスバーや戻るボタンがある ⁃ コンテンツ領域にWebページを表示する

Firefox OSのChrome ⁃ chrome://browser/content/shell.xul ⁃ 何の装飾も無い黒塗りのウィンドウ※ ⁃ iframeでWebアプリを表示する

※ v1.1はApp Manifestのchromeフィールドを定義することで、そのアプリが前面で開かれている間のみ戻るボタンなどを表示できます

Page 13: Firefox OS 起動の仕組みを調べてみた

13

Chrome

XULRunner

Systemアプリ

その他アプリ群

Linux Kernel

Android Misc.

Systemアプリ

• スマホとしての基本機能を提供するアプリ

ウィンドウ制御、電力管理、画面ロック、通知など

他のアプリを起動する処理も担う

• Chromeプロセス上で動作する

Chromeプロセス:Firefox OSの基幹プロセス ⁃ システムに1つだけ存在、root権限で動作

Geckoの重要な機能はChromeプロセス上で実行される ⁃ アプリのインストールや起動 ⁃ ほとんどのハードウェアを制御

Page 14: Firefox OS 起動の仕組みを調べてみた

14

Chrome

XULRunner

Systemアプリ

その他アプリ群

Linux Kernel

Android Misc.

その他のアプリ群

• Gaia標準のプリインストールアプリ群

カメラ、ブラウザ、カレンダー、メーラーなど

• Contentプロセス上で動作する※

Contentプロセス:権限の制限されたアプリ用のプロセス ⁃ 1アプリに付き1プロセス割り当てられる ⁃ アプリが落ちてもOSを巻き込まない

Firefoxブラウザのplugin-containerプロセスの仕組みを流用 ⁃ plugin-containerとはFlash等のプラグインを表示する専用プロセス ⁃ プラグインが落ちてもブラウザを巻き込まない

※ 現在、ブラウザアプリはChromeプロセスで動作しています (恐らくBug 761935が原因)

Page 15: Firefox OS 起動の仕組みを調べてみた

15

Firefox OSが起動するまでの流れ

Firefox OS 起動の仕組みを調べてみた

Page 16: Firefox OS 起動の仕組みを調べてみた

16

Gonk

Gecko

Gaia

起動の順序(ざっくり)

Chrome

XULRunner

Systemアプリ

その他アプリ群

Linux Kernel

Android Misc.

下から上に起動

Page 17: Firefox OS 起動の仕組みを調べてみた

17

Gonkの起動処理

Linux Kernel を起動

Androidのsurfaceflingerや zygoteなどは起動しない

Chromeプロセス を開始

Gecko を起動

fakeperm, rilproxyを起動

Androidのrild, vold, netd, mediaserverなどを起動

Androidのinitプロセス を開始

init.b2g.rc をロード

init.rc をロード

Firefox OSのみ

• zygote(全Androidアプリの親プロセス)の代わりにChromeプロセスを起動 ⁃ Dalvik VM(Java仮想マシン)の代わりにGeckoを起動

Page 18: Firefox OS 起動の仕組みを調べてみた

18

Geckoの起動処理

• Binderを初期化 • XPCOMをプリロード • 起動ロゴを表示

XULRunnerを起動 Firefox OS固有部分を初期化

• XPCOMを初期化 • プロファイルをロード • 各種サービスを初期化 • プリファレンス※を初期化 • Chrome(shell.xul)をロード

• ブラウザウィンドウを描画 • iframeを生成しホームURL

をロード

(Chrome)

Chromeを描画

※ プリファレンス:Firefoxブラウザのアドレスバーに about:config と入力すると表示されるやつです

Page 19: Firefox OS 起動の仕組みを調べてみた

19

Gaiaの起動処理

• CSS(Gaia-UI Building Blocksなど)をロード • OS起動ロゴを表示 • 各機能(Window Managerなど)とUIを初期化

Chromeのスタートページ(ホームURL)としてSystemアプリのindex.htmlを開く Homescreenアプリをロードして完了

Page 20: Firefox OS 起動の仕組みを調べてみた

20

まとめ

① Firefox OSの3層構造:Gonk, Gecko, Gaia • Gonk → Gecko → Gaiaの順に起動

② Geckoから後の起動処理はWebブラウザーの概念そのまま • ブラウザウィンドウ(Chrome)を開く • ホームURLとしてSystemアプリを開く • 全てのアプリはiframe上のコンテンツ

③ どなたかGeckoの勉強会を開いて下さい! • 今日はこれを言うために来ました