はじめに(言い訳)
ここのところなかなかネタを書く時間が取れなくて久々の更新です.今回は今年公開して 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 でそのままビルドできればいいんですが,以下のような厄介な問題
- hwcomposer1.0 使用時の色反転問題
- マウスカーソルの表示が必須
- MK808B の Android バージョン(V4.2.2) が FxOS の期待するバージョン(V4.3_r2.1) と違う
があって手動で作業する必要があります.これら差分は 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でファイル変更できるという融通が利きます.
- 参考: recovery 領域用カーネルイメージ ug802recovkernel.img
ファイルシステムの 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 のアーカイブもここで展開します.
- 参考: microSDカード向けRootfs ファイルアーカイブ picuntu-linuxroot-0.9-RC3.tgz
% 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 の起動に挑戦する方が居られると思いますが,その何かの助けになればいいなと思います.
コメント