きままなたぐりぶろ(日記)

ピンときたネタ・イベント(IT、旅行、日常etc)があれば書いていこうと思います。

Firefox OSを試した!

2013年02月11日 23時49分52秒 | 技術
今回は端末を買ったわけではなく、とあるOSを試した。
それは・・・



Firefox OS



である。
まだ開発中でようやく一部端末用のROMイメージが出たばかりのモバイル用OSである。

公式サイトはこちら(英語)
Firefox OS - Mozilla | MDN
2013/02/19追記:日本語はこちら。
Firefox OS - Mozilla | MDN
ただし日本語ページは翻訳が進んでないページもあるので気をつけたい。

本ブログではビルドとインストールした過程について記述し、
収集した技術的な情報は私のホームページで公開していこうと思う。
La Brilanto
「My factory → Firefox OS関連」にて絶賛まとめ中。
随時更新する予定なので適度に参考にしてもらえると幸い。

参考にしたブログはこちら(sola)
こちらのブログに書かれている手順ほぼそのまま実行して、Galaxy Nexusにインストールした。

ビルド



いくつかビルド可能な端末・機種はある。(PandaboardやMac/Linuxデスクトップ、エミュレータなど) Android端末も僅かな端末で可能だ。
その中でよく確認が取れてるのが、Nexus Sとのこと。
しかしながら自分はNexus Sを持っていないので、かろうじて動作するレベルで調整が取れているらしいGalaxy NexusにROMイメージを
インストールすることにした。

solaさんのブログで書かれていることがほとんど全てなので、私の方では概要としてまとめておく。

  1. ブートローダーをアンロックしたGalaxy Nexusを用意すること。あと一度でもfastbootでROMイメージを書き換えた経験があるべき。
    要するにまったくの素人さんが手を出すべきではないということです。

  2. Android SDKをダウンロードして設定する

  3. ビルドに不足しているライブラリ・ソフトウェアをaptでインストールする

  4. githubにあるB2GリポジトリよりFirefox OSのソースを取得する

  5. gitコマンド実行後、作成されたB2Gディレクトリの中で./config.sh galaxy-nexusを実行する。

  6. B2Gディレクトリの中で./build.shを実行する

  7. UbuntuにGalaxy Nexusを接続し、fastbootモードで起動する。(VolUpとVolDown両方を押しながら電源ボタンをブルっと震えるまで長押し)

  8. ./flash.shを実行してROMイメージを書き込み。(solaさんのようにfastboot flash~を実行していってもよい。)



ROMイメージさえ出来てしまえば、別にWindowsでもfastboot.exeさえ用意していれば書き込める。
その際、次のファイルをコピーして持ってきておくこと。

  • out/target/product/maguro/boot.img

  • out/target/product/maguro/system.img

  • out/target/product/maguro/userdata.img


他のROMイメージ(recovery.imgなど)は必要ない(と思う)。

追加で実施したこと


Galaxy Nexusにただ単にFirefox OSを入れるだけなら上記の手順だけでいいのだが、そのままだとホームボタンが使えなかったり、
日本語が表示されなかったりでいろいろ大変なので、次のことをした。

各種UIの日本語化

Firefox OSはマルチロケール対応なので当然、日本語でも利用可能だ。しかし現状、少し手順を踏まなければならない。
これについてもsolaさんのFirefoxOSの日本語化を参照。
しかしこちらの手順だけではビルドに失敗した。./build.shをする前にgit pull./repo syncをしておくか、geckoディレクトリ内で
./configure --with-l10n-base=[$L10NBASEDIRで定義したディレクトリ]のあとmake、その後./config.shか./build.shをしたほうがいいかもしれない。

ホームボタンの割り当て

物理ボタンが存在しないGalaxy NexusではそのままFirefox OSを入れるとなーんにも操作できない端末になってしまう。
これもsolaさんのブログに書かれていた。 device/samsung/tuna/tuna-gpio-keypad.klを変えれば良い。書いてあったように
戻るボタンはFirefox OSでは現状使えないので無駄なことはせず、key 114かkey 115のどちらかをHOME WAKEにする。

解像度を変える

GNexusだと端末の解像度が高すぎて文字が細かすぎて見づらい。なのでdevice/samsung/tuna/device.mkの中に記述されている
ro.sf.lcd_dencity=320を適当に220や160など、好きな値に変える。そうすると文字が見やすくなる。ただし、ホームスクリーンは幅や高さが
固定されて設計されているためかアイコンの並びなどは変わらない。そこについては後述したい。

ホームスクリーンを改造する

FirefoxOSのホームスクリーンはどうやら幅や高さが固定で設計されているように見える。ということでホームスクリーンを改造したのはいいのだが、
ビルドの仕方によって変更が適用される時とされない時がある。ここについては今後も実験の対象としたい。



操作した感想


GNexus上でFirefox OSを試した感想としては次の通り。





日本語化した結果。



OSの起動速度・・・かなり早い。GNexus用に最適化されていないにもかかわらず、GoogleのロゴからFirefox OSのロゴ、そしてセットアップ画面やロック画面が
出てくるまでに1分もかからなかった気がする。これは今後が期待できそうだ。

全体的な操作感・・・最適化されていないため、少々もっさり。(Android 2.1~2.3でシングルコアくらいの体感)でもちゃんと反応してくれる。
GNexusのためなのか、解像度が高い端末向けにUIが調整されないためか、ボタンやフリック対象の領域が小さすぎて素早く操作できなくて
イライラすることもある。このあたりは中間層のGeckoの今後の出来次第だろう。

OSの作り・・・ホームスクリーンはまんまiOS。アプリの起動周りもいちいちiOSのそれ。しかし通知領域や設定画面はAndroidといったところ。
iPhoneからAndroidに移ってきてだいぶ経つ自分としては、iOSを真似るよりもAndroidを真似たほうが色々連携できていいと思うのだが、
そこはオープンソースなOSであるFirefox OS、ホームスクリーンもHTML+JavaScriptでできているので、改良は自由に可能だ。
ウィジェットは今のところないが、アプリ側でウィジェット用のHTMLを用意して、ホームスクリーン側で
それを読み込んでiframe等で表示できる改良すれば、実現可能になると思われる。

その他・・・日本語化できて、一応キーボードでも日本語(ひらカナ)入力できるものの、漢字変換ができない。
キーボードの記号の一覧を表示した際にスクロールできないので、一部の記号が入れられず、ブラウザ等でまともにURLを入れられなくて困る。
起動したアプリはホームボタン長押しで履歴閲覧可能。というかiOSのそれそのまま。しかし、上に向かってフリックすれば
アプリをサクッと完全終了できるのは地味だけど大きなポイントかも。
通知領域にはAndroidと同じく各種センサーのトグルスイッチが備わっている。そこから設定画面にも行ける。
2013/02/13追記:
SDカードはGNexusでは存在しないので使えない。おそらくパーティションを設定すれば使えるとは思うが、
そこは今後の解析の課題としたい。あとは写真・動画・音楽ファイル以外のファイルの扱いはやや怪しい。
PDFはビューアがアプリ一覧には出てこないが存在するので表示できるようになるはず。



Gaiaの解析


ここからは自分のオリジナルの調査が入る。まだ調査中・解析中なので随時更新していこうと思う。上記でビルド、インストールして
試すまではいいが、GNexusの高い解像度にホームスクリーンの幅と高さがあわなすぎてスカスカだ。これをどうにかしたいというところから
解析を始めた。
ブログで長々と書いても仕方ないので、ポイントとなる部分だけを書くことにする。

Firefox OSを構成する要素はこの通り。詳しくはMDNのサイトを参照。(画像クリックでMDNに飛びます)

UIやアプリレベルの処理を司るGaiaを改良するだけで基本的には表面的にほぼすべて改良可能。


ルートディレクトリ:

B2Gディレクトリ(自分で作成したb2g_workディレクトリの中に、gitコマンドにより自動生成される)

ホームスクリーンアプリ:

B2G/gaia/apps/homescreenディレクトリ
※システムアプリはおそらくすべて B2G/gaia/appsディレクトリ内に存在する。
また、アプリレベルで共通的に使えるスタイルシートやリソースファイルは B2G/gaia/sharedディレクトリにあるようだ。

サンプルで入っているテストアプリ:

B2G/gaia/test_appsディレクトリ

外部アプリ:

B2G/gaia/external-appsディレクトリ


※ソースの段階でここにあるというだけで、実際端末にインストールした後のディレクトリ階層としてこれらに残っているかどうかは不明。
2013/02/19追記:
後で綺麗にまとめる予定だが、実際のFirefoxOS端末のディレクトリツリーにて、アプリがインストールされている場所が判明した。
/data/local/webapps 配下に、******.gaiamobile.orgフォルダとして格納されていた。
そのさらに下はmanifest.webappとapplication.zipのみ。
つまり・・・ROMビルド&インストール後にはもっと簡単に各アプリを更新できる方法があったのだ。
現在、それの確認中です。


ホームスクリーンは次のもので構成されている。(正式名称がわからないのでHTMLのID名で表記)
・landing-page・・・ホームスクリーンの中央画面とも言うべき画面。時計が表示されているだけの画面。
・icongrid・・・アプリ一覧などアイコンをグリッド上に表示する画面の親。
・search・・・icongridを親に持つ要素。最左の検索画面である。
・shortcuts・・・icongridを親に持つ要素。landing-pageより右のページのアプリ一覧(ドロワー)画面である。
・footer・・・配下にdockWrapperを持つ要素。画面下に配置されているドックである。

実際にホームスクリーンはそれが上位の存在というわけではなく、おそらくB2G/gaia/apps/system/index.html内の
div要素の#windowsが親要素のようだ。さらにB2G/gaia/index.htmlにはgaiaの大元の画面となる要素があるようだ。
ここにアプリを表示するiframe要素の#contentと、なんと端末のボタンたるホームボタンを構成するspan要素の#chrome-home(buttonクラス)
存在する。察するにこういう構造なのだろうと思う。

B2G/gaia/index.html
B2G/gaia/apps/system/index.html
B2G/gaia/apps/homescreen/index.html
ホームスクリーンはおそらく他のアプリと同レベルの存在で、全てのアプリの親はsystem/index.htmlなのかもしれない。
ディレクトリ周りはホームページのほうで綺麗にまとめて掲載しておきたい。

ここまで解析して、ふと思ったのはAndroidレベルのアプリ間の連携をできるかどうか。
Androidにはインテントや標準のアクションがある。それがものすごい強みになっている。使い慣れてしまえばはっきり言って
iPhoneに戻れないレベルで便利に感じるようになるものだ。
Firefox OS、というかGeckoにはWeb Activityというのがあり、インテントとほぼ同等のことができるようだ。

参考サイト(英語):Introducing Web Activities

簡単に説明すると、Activityを受ける側でimage/jpgやaudio/mp3などファイルタイプで受け口としての定義とHTMLを用意しておき、
送信する側ではimage/jpgやaudio/mp3を付加してActivityを発行すると、ファイルタイプに対応するアプリのActivityの
選択画面が開いて自由にアプリを選べる・・・というものだ。

それがデフォルトのアクションとして固定できるのか、ホームスクリーンなどシステムアプリをも置き換えられるのかは
わからない。ホームスクリーンさえもできればAndroidのようにホーム画面アプリを好みで変えることができるが、
それができないなら各メーカーで開発されたホームスクリーンをずっと使い続けることになる。
国内メーカーのAndroid端末のデフォルトのホーム画面を想像してほしい。それが使いづらいもので、
絶対変更できないとなると・・・あまりに悲惨なことになるだろう。
このあたりはさらなる開発の進展を期待したい。


ホームスクリーンの修正


さて改良。まず手をつけたのはhomescreen/style内のCSSだ。修正したポイントは次の点。
・ドックの幅
・アプリ一覧(のグリッド)の表示領域の拡大
・landing-pageの時計の位置
・アイコンの大きさ
各種定義を変更したらビルドだ。
ただしそのままビルドしても意味がないよう。ここは不確かなのだが、 ./build.shをする前にgit pull、/repo syncをして
から./build.shをしないといけないかもしれない。場合によっては./config.sh galaxy-nexusからやり直したほうがいい。
また、デバッグモードを有効にしないといけないかもしれないので、事前に gaiaディレクトリ内で"DEBUG=1 make"を実行しておくとよい。
ここまで「かもしれない」を多用しているのは、毎回再現できているわけではないのと、config.shとbuild.shに毎回
かなり時間がかかっているので1日に何度も確認できているわけではないため。そこはご容赦いただきたい。

アイコンのサイズを変更する場合のみ、homescreen/js/page.js内の各種定数、ハードコーディングの値を修正した。

そうして修正した結果、こうなった。


崩れまくっているのは、毎回は変更を確認できなかったためだ。
何度かビルドだけをしていた後に、ようやく./build.shをする前に./config.shか、git pullからやり直さないと
いけないことがわかったので、今までした修正が一度に反映された形になってしまった。
収拾つかなくなったので戻したはいいが、ここで問題発生。

Galaxy Nexusが文鎮化した。

幸いブートローダーは起動するので、取っておいた最初のFirefox OSのROMイメージをfastbootで復元。無事復活。
しかしUbuntuで管理していたソースを何度修正してビルドしても、できたROMイメージを当てたら
毎回文鎮化するようになってしまった。Gaiaへの修正が起動プロセス等に影響することはないはずなので、
可能性としては、デバッグやロケールのためにいろいろ設定していた環境変数がなにか競合を起こして
悪さしてしまっているのだろう。

といったところで、3連休が終わってしまった。現在、ソースを一度破棄し、環境変数も操作前の状態に戻して
再ビルド中。

アプリについてもある程度解析したことがあるのだが、今回はこれまで。次回の更新でアプリについて書き、
私のホームページのほうにもまとめておきたいと思う。

2 コメント

コメント日が  古い順  |   新しい順
UIの更新 (通りすがり)
2013-02-17 01:24:23
すばらしい情報ありがとうございます!
私もこちらの情報を参考にgalaxy nexus上でhomescreenをいじっております。
ご参考になるかわかりませんが(確証はないのですが)、CSSを変更後、gaiaの下でmake reset-gaiaでpushと再起動を行うと変更結果が反映されているきがします。よろしければ。
Unknown (sanktakato)
2013-02-17 12:04:53
おお!
こちらこそ貴重な情報ありがとうございます!
試してみたいと思います。

コメントを投稿