Upload
muneaki-nishimura
View
8.526
Download
0
Embed Size (px)
DESCRIPTION
2013年8月28日に開催される「関東Firefox OS勉強会 3rd ごった煮」の発表資料です。
Citation preview
Firefox OS 起動の仕組みを調べてみた
関東Firefox OS勉強会 3rd ごった煮 2013.8.28
2
本日お話する内容
• Firefox OSの内部構造
• Firefox OSが起動するまでの流れ
3
自己紹介
本発表は私の個人的な調査に基づくものです。 内容に誤りがあるかもしれませんがご了承ください
名前 西村 宗晃 (にしむねあ) ・https://www.facebook.com/muneaki.nishimura 職業 セキュリティエンジニア ・セキュア開発のコンサルティング ・Android端末~アプリの開発支援
4
求む!Geckoの勉強会を開いてくれる人
• Geckoの中身は複雑で素人には分からないことだらけ
• ウェブでは情報が見つからなかったり、あっても古くて今の仕様と違ったり
• でも、自分で勉強会を開くのはなんだか大変そう
• みんなで一緒にGeckoの中身を調べて きゃっきゃうふふ しませんか?
(C) 2010 Mozilla Japan
5
なぜ、起動処理?
OSアーキテクチャの骨格が理解できるから • OSを構成するモジュールの概要や、それぞれの依存関係など
セキュリティ的に重要な機能だから • 多くの処理がroot権限で動くのでよく狙われる • Androidの場合、root化やカスタムROMの起動などに利用される
6
Firefox OSの内部構造
Firefox OS 起動の仕組みを調べてみた
7
3層構造①
Gonk
Gecko
Gaia Firefox OSの標準UIおよび標準アプリ群。 全てのソフトはHTML/JS/CSSで開発(Webアプリ)
Webアプリの実行環境。FirefoxブラウザのエンジンであるGeckoを拡張し、Webアプリからデバイスの機能を操作できるようにしたもの
OSの基本機能を担当。また、ハードウェアの差異を吸収し、デバイス上でGeckoを動作させる役割を担う
8
3層構造②
Gonk
Gecko
Gaia • 起動後スクリーンに表示されるものは全てGaia • オペレーターや端末メーカー独自の実装に差替可能
• Gaiaの使用する機能は全てGeckoが提供 • 実装の大部分はPC版のFirefoxブラウザと共通 • 改変可能だがデメリットもある
(Updateに伴うコスト、MPLによる改変コードの開示義務)
• 低水準OS + GeckoのHAL • HALは使用するハードウェアに応じて改変可能、
ただしOSの差し替えは現実的に困難
9
3層構造をもう少しだけ分解
Gonk
Gecko
Gaia
Chrome
XULRunner
Systemアプリ
その他アプリ群
Linux Kernel
Android Misc.
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にアクセスするためのプロキシ
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
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フィールドを定義することで、そのアプリが前面で開かれている間のみ戻るボタンなどを表示できます
13
Chrome
XULRunner
Systemアプリ
その他アプリ群
Linux Kernel
Android Misc.
Systemアプリ
• スマホとしての基本機能を提供するアプリ
ウィンドウ制御、電力管理、画面ロック、通知など
他のアプリを起動する処理も担う
• Chromeプロセス上で動作する
Chromeプロセス:Firefox OSの基幹プロセス ⁃ システムに1つだけ存在、root権限で動作
Geckoの重要な機能はChromeプロセス上で実行される ⁃ アプリのインストールや起動 ⁃ ほとんどのハードウェアを制御
14
Chrome
XULRunner
Systemアプリ
その他アプリ群
Linux Kernel
Android Misc.
その他のアプリ群
• Gaia標準のプリインストールアプリ群
カメラ、ブラウザ、カレンダー、メーラーなど
• Contentプロセス上で動作する※
Contentプロセス:権限の制限されたアプリ用のプロセス ⁃ 1アプリに付き1プロセス割り当てられる ⁃ アプリが落ちてもOSを巻き込まない
Firefoxブラウザのplugin-containerプロセスの仕組みを流用 ⁃ plugin-containerとはFlash等のプラグインを表示する専用プロセス ⁃ プラグインが落ちてもブラウザを巻き込まない
※ 現在、ブラウザアプリはChromeプロセスで動作しています (恐らくBug 761935が原因)
15
Firefox OSが起動するまでの流れ
Firefox OS 起動の仕組みを調べてみた
16
Gonk
Gecko
Gaia
起動の順序(ざっくり)
Chrome
XULRunner
Systemアプリ
その他アプリ群
Linux Kernel
Android Misc.
下から上に起動
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を起動
18
Geckoの起動処理
• Binderを初期化 • XPCOMをプリロード • 起動ロゴを表示
XULRunnerを起動 Firefox OS固有部分を初期化
• XPCOMを初期化 • プロファイルをロード • 各種サービスを初期化 • プリファレンス※を初期化 • Chrome(shell.xul)をロード
• ブラウザウィンドウを描画 • iframeを生成しホームURL
をロード
(Chrome)
Chromeを描画
※ プリファレンス:Firefoxブラウザのアドレスバーに about:config と入力すると表示されるやつです
19
Gaiaの起動処理
• CSS(Gaia-UI Building Blocksなど)をロード • OS起動ロゴを表示 • 各機能(Window Managerなど)とUIを初期化
Chromeのスタートページ(ホームURL)としてSystemアプリのindex.htmlを開く Homescreenアプリをロードして完了
20
まとめ
① Firefox OSの3層構造:Gonk, Gecko, Gaia • Gonk → Gecko → Gaiaの順に起動
② Geckoから後の起動処理はWebブラウザーの概念そのまま • ブラウザウィンドウ(Chrome)を開く • ホームURLとしてSystemアプリを開く • 全てのアプリはiframe上のコンテンツ
③ どなたかGeckoの勉強会を開いて下さい! • 今日はこれを言うために来ました