日別アーカイブ: 2014/12/18

FirefoxOS Advent Calendar 2014 (18日目)

今日は Firefox OS Advent Calendar 18日目です.

初参戦ですが登録したからには何か記事になることをしないと,ということで,メインストリームで進めていた「FirefoxOS on AndroidStick」を軽くまとめつつ今年の活動を振り返りたいと思います.

久しぶりの「動かしてみる」

元々異なるプラットフォームで何か動かしてみる活動はかなり古くからやっていたのですが,去年の後半に何気なく安価だったので入手した「Android Stick」 と,Simulator で軽く遊ぶだけだった「Firefox OS」の組み合わせを思いついて,久しぶりの「動かしてみる」活動でした.

動かしてみるためにはまずどういう構造なのか・仕組みなのかを知るためにソースを読むわけですが,Gecko-Gonk層の境界を中心に断片的ながらそこそこ読んだものの,各デバイスの機能を UI から理解するために  C++ と JavaScript の境界を越えて(XPCOMやjs-ctypesなど)読むのは非常に苦労しました.

Gonk 層が AOSP ライブラリをベースにしているおかげで,Android が動いていれば取っ掛かりはスムーズ,しかしドライバやベンダ提供ライブラリは公開されず binary だったりするので,Android の想定で作られた前提がことごとく崩れてややこしい問題が現れてくるのです.これを日々叩くために Gecko を試しにいじって反応を見る作業を続け,不安定ながらなんとか動いてるのが現状です.

動かしてみた結果は 関西勉強会と Developers Conference 懇親会 で LT にて報告させていただきました.結構関心を持ってもらえたものの,結局まだ動いてる機体はどこにも公開してないんですね…未だに起動するだけでも console 操作が必要でそこそこ手間だったり,HDMI 出力先が必須なのが今の課題です.

今の活動成果についてはこの Advent Calendar に間に合わせるべく(event駆動型開発!),強引に GitHub に登録してビルド編としてなんとか公開してみました.かなりの長文ですが興味のある方はどうぞ.

仕事でも FirefoxOS?

組込み機器の仕事をしてるので,ボードやチップを扱ってるおかげで目の前の試作機材でも時間があるときに FirefoxOS を動かしたりしてました.割と独自仕様なのでいろいろ苦労したのですが,タッチパネルと Wi-Fi, 動画再生, WebGL 辺りまではなんとかなったのでデモ機レベルまで持っていったものの,軌道に乗せる前に公開することもなくお蔵入りになってしまいました.とはいえ成果の一部は某六本木方面に持ち込んだとか何とか;-)

Flame 端末も購入

やはりちゃんと動く例も見ておきたいので Flame 端末は買いました.普通は update を待たないとなかなか進化しないのですが,build 手順が分かっててすんなり build ROM が入るのはいいですね.適当に作ってた HTML5 を試すデモアプリも簡単に想定通りに動くのはなかなかいい環境です.下回りのドライバやカーネル開発ではこうも行きませんから…

さて次のtargetは…

今年後半はほとんど時間が取れず,来年はさらに環境がすっかり変わってしまってしまうのですが…そんなことはともかく(仕事と同じで)下回りばかりやってても進歩がないので,FirefoxOS の活動にもう一歩踏み込んで,前からやろうと思ってた HTML5 からのデバイス制御辺りは試していきたいと思う次第であります.

 

FirefoxOS on Android Stick (ビルド編)

はじめに(言い訳)

ここのところなかなかネタを書く時間が取れなくて久々の更新です.今回は今年公開して FirefoxOS をいろいろいじる契機になった FirefoxOS on Android Stick のビルド話を書きたいと思います.

前に書いた記事のころはまだ試行錯誤を繰り返して動かしていてビルド手順はかなり難しく再現も難しかったので,最新の Stick を手に入れてそちらに移行してからにしようと思っていました.しかし新機種(MK802IV)は Kernel config に手を入れないと FirefoxOS では使えなかったため kernel のビルドからやり直してたのですが,これが全然思い通りに起動せず,結局いじる時間もなく放置してしまうことになり,さらに悪いことに FxOS 2.x の tablet 未対応が直らず,結果として旧機種(MK808B)の更新も停まっていたのでした.

ということで,年末のこの機会に一度ビルド手順を見直して,なんとか共有できるところまで持っていこうとした顛末です.Stick の個体とか開発環境の差とか面倒なところは無視してるので,この手順を見ても全然動かないかもしれません.まぁこんな風にやってるんだなという雰囲気でお願いします.

ちなみにこれを機会に GitHub の放置アカウントにようやく手を入れました:-)

まずは開発環境の準備

MDN:Firefox OS ビルドの必要条件 を準備してください.これはどの機種のビルドも同じです.

ソースの入手

当然ながら B2G 本体は Stick を選ぶことができませんから,自前で用意した repogitory から取ってきます.config.sh を実行すると,機種依存部分以外は全て他プロジェクトから取って来る形です.今取ってこれるのは v1.4 だけにしています.

% git clone https://github.com/kuni6800/B2G.git
% cd B2G
% git checkout --track remotes/origin/rkand
% GITREPO=https://github.com/kuni6800/b2g-manifest BRANCH=rkand-v1.4 ./config.sh rkand

Android ライブラリの入手

Gonk 層に当たる HW 依存部分はベンダーからリリースされる Android 向けライブラリを使います.SoC提供会社からバイナリ提供されるのが基本ですが,MK808B は ROM image でしか公開されておらず再配布条件が確認しづらいので,本体から持ってくることにします(調べてみると github のいくつかで普通に上がってるけど…公開できるのだろうか?).

Android ライブラリをツリーに用意します.adb などを駆使して Android 本体の system/ 以下を device/rockchip/rk30board/proprietary/system/ 以下に持ってきます. 全部持ってくる必要はなく,実際に必要なファイルは device/rockchip/rk30board/proprietary/release.mk に記載しています.または Finless ROM などにある system.img を mount -o loop で直接マウントする手もあります(お勧めしませんが).

パッチ当てとビルド

build.sh でそのままビルドできればいいんですが,以下のような厄介な問題

があって手動で作業する必要があります.これら差分は github で fork して作業したものを公開してもいいのですが,バージョンに依存するかなり暫定なものなのでとりあえずパッチの形にしています.

まず「xdelta」を apt-get などでインストールしてください.その後,スクリプトを実行してパッチを当てます.

% pushd device/rockchip/rk30board/patches
% ./patch.sh
% popd

なんだか失敗してしまったようなら,patch-rev.sh で戻してから原因を追ってください.

あとは失敗しないことを祈りつつ build.sh を実行して暫く待ちます.

% ./build.sh

アーカイブを作成

めでたくエラーなしでビルドが完了したら,アーカイブを作ります(ROM を作らないのは PicUntu(Linux) を使うため).archive.sh を実行すると「b2g-rkand-(日付8桁).tar.gz」 のファイルが出来上がります.

% ./archive.sh

 PicUntu kernel の Recovery への書き込み

PicUntu のインストールはすでに紹介していますので,こちらを参照ください.MK808B の PicUntu は元の Android を壊さずに recovery 領域に kernel をインストールするのでいろいろ面倒ですが,ファイルシステムは SD カードなのでPCでファイル変更できるという融通が利きます.

ファイルシステムの micro SD カードへのインストール

micro SD カードを用意して PC に挿して,Linux 上でファイルシステムを作ります.予め dmesg などで SD カードのデバイス名(以下 sdX) を確認しておきます.

microSD カードへのパーティション作成とフォーマットを行います.この例では全ての領域を1つのパーティションで設定しています.くれぐれも microSD カードの中身はバックアップしてから実施してください.

% sudo fdisk /dev/sdX
コマンド: p<CR>    # 情報確認
コマンド: d<CR>    # パーティション(全)削除
コマンド: n<CR>    # パーティション作成
Select: p<CR>     # プライマリ
パーティション番号: 1<CR> # →パーティション1
先頭セクタ: <CR>   # →先頭から
Last セクタ: <CR> # →末尾まで
コマンド: w<CR>   # 書き込み
% sudo mkfs.ext4 -L linuxroot /dev/sdX1

microSD カードのフォーマットができたら,マウントしてアーカイブを展開します.先ほどの FxOS のアーカイブもここで展開します.

% mkdir linuxroot
% sudo mount -t ext4 /dev/sdX1 linuxroot
% sudo tar -C linuxroot -zxvf picuntu-linuxroot-0.9-RC3.tgz
% sudo tar -C linuxroot/root -zxvf b2g-rkand-xxxxxxxx.tar.gz

PicUntu 起動してから FxOS を起動するため,その起動用スクリプトを作成します.スクリプトの2行目はConsoleの停止,3行目は画面サイズの変更,4行目は FxOS への切替です.

% sudo cat > linuxroot/root/start_b2g.sh
#!/bin/sh
echo 0 > /sys/class/vtconsole/vtcon1/bind
fbset 1280x720-60-32 -a
chroot /root/root /init
<Ctrl-D>
% sudo chmod +x linuxroot/root/start_b2g.sh

最後にアンマウントして microSD カードを取り出します.取り出したカードは MK808B 本体に挿しておきます.

% sync
% sudo umount linuxroot

Recovery モードでの起動

ようやく本体の起動です.ただ,Android を残していたためそのままでは Android が起動しますので,Recovery モードで起動しなければなりません.困ったことに MK808B には外部操作で Recovery モード起動する方法がなく,以下の方法を取らざるを得ないのが現状です.

  • ターミナルアプリをインストール,ターミナルから「adb reboot recovery」を実行
  • Reboot.apk を導入して「Reboot Recovery」を選択
  • 設定でIPアドレスを調べて「adb connect <ipaddress>」で接続,「adb reboot recovery」を実行

FirefoxOS の起動

PicUntu kernel が起動すると,暫くして Console に login prompt が出ます.アカウントは root,default password は「12qwaszx」 です(公式情報).

ログインできたら,先ほどのスクリプトを起動します.

% ./start_b2g.sh

初回にかなり時間が掛かります.不安定なので Crash Report が出るかもしれませんが,画面が出れば成功です.

最後に

まだまだよく分からない作業が途中にたくさん入っていて,「すぐにやってみる」には程遠いですね.せめて PicUntu や Recovery を使わないで ROM 焼きだけで直接起動したいものです.

また,Android ライブラリ(gralloc.so)の使い方が FirefoxOS では違うのか,エラーが出てメモリリークしてすぐに固まってしまうようです.メッセージからソースがあればすぐ分かる感じなのですが,バイナリ部分なのでもどかしいところです.

これから他のいろんな端末で FirefoxOS の起動に挑戦する方が居られると思いますが,その何かの助けになればいいなと思います.