月別アーカイブ: 2014年9月

FirefoxOS v2.1 と tablet 指定

以前、v2.0 を試した際に「アイコンがでかい」という残念な結果を見たわけですが、先日の勉強会でネタ話にしていたところ、「確か tablet ビルドがあったような」ということで確認してみました。

Gaia のデバイス指定

gaia の Makefile を見ると、デバイス種別を指定するところがありました。phone が指定されていたからアイコンが3列、というのは何となく納得。

GAIA_DEVICE_TYPE := phone

Bugzilla にもBug 1010128 にて tablet が追加されているようです。これは試してみないと。

v2.1 へのアップグレード

tablet ビルドを試す前に、v2.0 から v2.1 に上がったこともあって(phoneのまま)そちらを先に試してみました。すると

マウスカーソルが動かない

という事態に。これは phone だからなのか、修正で何かトラブルなのかは追跡できてないですが、動きを見てると「マウス押す」→「マウス移動」→「マウス放す」という動作でしかカーソルが動かないので、もしかしたらタッチスクリーンの動作に引っ張られてそうな感じです。

v2.1 では新クラス GeckoTouchDispatcher が出来て nsAppShell にあった MouseEvent 処理がそちらに移動したので、その影響でマウス処理が正常にできていないのではないか? と思われます。マウス使う人が増えないとこれは当分直らないか…

tablet ビルドを試す

v2.0 で GAIA_DEVICE_TYPE=tablet のビルドを試したところ、まだ用意しただけで何もできないようで、アイコンも何もない画面で、Notification の Setting すら起動できない状態でした。
No Icon on v2.0 tablet

v2.1 で GAIA_DEVICE_TYPE=tablet のビルドではようやく v1.4 で見たアイコンが出現し、横スクロールができるようになっています。ただし、上記のようにマウスがまともに動かないので先に進むことすら困難な状態です。
appear icon on v2.1, but freeze cursor

ところで、tablet ビルドは以前通り横スクロール、phone ビルドは縦スクロールなので、端末の形態により UI のポリシーは変わっていくようです(今のところ)。ちなみにTVデバイス向けの tv ビルドも用意されているようです。

MK802IV と PicUntu

MK802IV を試す

これまで使っていた Android Stick の MK808B は、PicUntu の kernel config をいじらなくても結構使えたのでそれをベースに FirefoxOS を試していました。とはいえ一世代前の製品ということもあって不都合もあります。

  • 本線は RK3188 に移っているので開発から置いていかれる
  • Android も 4.2 から更新されることもない
  • Recovery 起動のままなので一度 Android を経由しないといけない (最新 PicUntu は直接起動可能)
  • もう一台ないと冒険できない(最悪焼き失敗したら文鎮になるので)

ということで RK3188 搭載の Stick に乗り換えるべく以前より同じメーカー Tronsmart の MK908 を購入して試していたのですが、 Tronsmart MK908 は PicUntu の本線でないことや build した kernel がなかなか安定して動かないことから、Rikomagic MK802IV を入手し、そちらを試しています。

MK802IV

MK802IV は直接 HDMI 端子が出ているのでディスプレイに直接挿すことができますが、HDMI オスコネクタなので今回は サンワサプライの HDMI-VGA 変換で アナログRGB に出すことにしました。

PicUntu 導入

PicUntu 4.5 は 本体 NAND メモリから boot 及び root filesystem を置くようになっています。Android は上書きにより使えなくなるので注意してください。

Windows による導入手順は FreakTab のスレッド に詳しく書いてありますが、翻訳しておきます(一部修正追記)。

  1. picuntu-4.5-BasicGUI-Nand をダウンロードし、任意の場所に展開します。
  2. 本体を bootloader モードにする必要があります。本体のmicroSD側にある通気スリット真ん中の凹んだ部分にボタンがあり、先の細い棒でボタンを押しながら電源を入れます。Android が起動している場合は、adb で接続して “adb reboot bootloader” でも可能です。
  3. rk_flash_1.37 フォルダの RKAndroidTool.exe を実行します。ウィンドウの下方に “Found Device ready to flash” が出ていれば OK です。
  4. オプションのうち binloader, parameter, kernel, boot, system をチェックし、misc, recovery, backup のチェックを外します。以下の画面のように設定します。rk_flash_tool
  5. 「Erase NAND」ボタンを押して 内蔵 NAND メモリを初期化します。
  6. 「Flash ROM」ボタンでイメージを書き込みます。
  7. 自動的に再起動され、GUI のログイン画面が立ち上がります。

PicUntu on MK802IV

Kernel ビルド

カーネルソースは github に公開されています。さらに kernel から最初に呼び出す initramfs もビルドに必要なので取得しておきます。

$ git clone https://github.com/aloksinha2001/Linux3188.git
$ git clone https://github.com/Galland/rk30_linux_initramfs.git

MK802IV で使える kernel config はすでに用意されているので、コピーしておきます。

$ cd Linux3188
$ cp arch/arm/configs/rk3188_picuntu-4.4-MK802IV-AP6210_defconfig .config

そのままでは NAND パーティションが異なる(Android recovery 向け)なので、.config の CONFIG_CMDLINE を以下のように置き換えます。パーティションは PicUntu-4.5-NANDGUI 向けの設定にしています。最後の text は CUI で起動するための指定です。

CONFIG_CMDLINE="init=/sbin/init root=/dev/mtdblock2 mtdparts=rk29xxnand:0x00008000@0x00002000(boot),0x00008000@0x0000A000(kernel),-@0x00012000(system) text"

さらに、Framebuffer Console の切り離しができるようにオプションを有効にします。これができないと FirefoxOS を乗せる際に Framebuffer Console が有効になったままになるため、画面が Console Log で延々上書きされることになってしまいます。

CONFIG_VT_HW_CONSOLE_BINDING=y

ビルドを実行します。以下では CCPATH にコンパイラの path を指定します。INSTALL_MOD_PATH はカーネルモジュールを保存する path を指定します。全て完了すると イメージファイル KERNEL.img が得られます。

$ export ARCH=arm
$ export CROSS_COMPILE=$CCPATH/arm-eabi-
$ export INSTALL_MOD_PATH=$PWD/mod
$ make -j4
$ make modules_install
$ mkknlimg arch/arm/boot/zImage ./KERNEL.img tvbox:

できた kernel イメージは上記で展開したフォルダにある rockdev\Image 以下に名前を変えて(たとえば mykernel.img とか)から保存し、 rk_flash_1.37 フォルダの RKAndroidTool.exe を起動して、kernel の path 部分を変えた名前(..\rockdev\Image\mykernel.img)に変更してから 「Flash ROM」で 書き込みます。

FirefoxOS の可能性

Android や FirefoxOS が使う OpenGLES ライブラリは GPU である Mali が使えるようにするため、kernel build でドライバも build する必要がありますが、今のところ有効にすると console が表示できずうまく起動しないようです。Framebuffer Console がぶつかるのかもしれませんが、原因追跡が必要です。

すでにパッケージに用意された build 済み ドライバは API バージョンが異なるため使用できないようなので、まずはこの辺りの突破が最初の関門のようです。

FirefoxOS の日本語化

FirefoxOS の日本語化の解説はすでに先人の方々が詳しくされているので、素直に日本語化したい方はそちらを参照したほうがよいかと思います。また MDN では Localizing FirefoxOS にL10N化のドキュメントがあります。
flame goes to v2.2-master

以下では、ローカルツリーに差分 commit して、upsteam に追従出来る形で進めた手順です。
(※ 以下のコマンドライン例をコピー&ペーストで実行しないでください。git や repo は理解した上で使用してください)

ローカルツリーのプロジェクト切替

ツリーは manifest にあるように、多数のモジュールを各地サーバから特定ブランチorタグを指定して取得し、repo コマンドでモジュールを管理しています。それぞれのモジュールは指定された状態のまま置かれているので、何か変更を加えた後に ‘repo sync’ で最新版を取り込むと変更が消されてしまいます。

それを避けるために repo でローカルプロジェクトを開始します。全てのモジュールにブランチを切り、sync 時には manifest で指定されたブランチorタグに対して git rebase する形で追従してくれます。以下ではプロジェクト名を myenvビルドディレクトリを ~/B2G とした例です。

$ cd ~/B2G
$ git checkout -b myenv origin/default
$ ./repo start myenv --all

L10n パッケージの追加

日本語化を行うためのパッケージは gaia, gecko に対する追加ファイルとして提供されていて、mercurial によって管理されているため mercurial のインストールが必要です。

mercurial のコマンド(hg)を使ってそれぞれのパッケージをツリーに取り込み、ローカルツリーのプロジェクトに登録しておきます。

$ cd ~/B2G/gaia/locales
$ hg clone http://hg.mozilla.org/gaia-l10n/ja
$ git add ja
$ git commit -m "add gaia-l10n/ja"

$ cd ~/B2G/gecko
$ hg clone http://hg.mozilla.org/l10n-central/ja l10n-central/ja
$ git add l10n-central/ja
$ git commit -m "add l10n-central/ja"

$ cd ~/B2G/build
$ hg clone http://hg.mozilla.org/build/compare-locales
$ git add compare-locales
$ git commit -m "add compare-locales"

これらを有効にするために ~/B2G/.userconfig を作成し、ビルド時に設定する環境変数を記載しておきます。

export LOCALE_BASEDIR=$PWD/gaia/locales
export LOCALES_FILE=$PWD/gaia/locales/languages_all.json
export GAIA_DEFAULT_LOCALE=ja

export L10NBASEDIR=$PWD/gecko/l10n-central
export MOZ_CHROME_MULTILOCALE="ja"

export PATH="$PATH:$PWD/build/compare-locales/scripts"
export PYTHONPATH="$PWD/build/compare-locales/lib"

 日本語キーボード及び辞書の登録

日本語IME に必要な辞書を入手します。辞書は Sourceforge.net にて ipadic または naist-dic が入手可能です。これらのパッケージの *.dic ファイルを gaia 内に取り込みます。

$ mkdir ~/B2G/gaia/apps/keyboard/js/imes/jskanji/dict/src
$ tar zxvf ipadic-x.x.x.tar.gz
$ cp ipadic-x.x.x/*.dic ~/B2G/gaia/apps/keyboard/js/imes/jskanji/dict/src/

*. dic ファイルはそのままでは使えないため、IME で使える形に変換します。dict ディレクトリで make を実行します。

$ cd ~/B2G/gaia/apps/keyboard/js/imes/jskanji/dict
$ make

エラーになる場合は Makefile の find コマンドがどのディレクトリを参照しているかを確認してください。src になっていない場合は、ディレクトリ名を変更してください。

make に成功すると dict.json, dict/dict, dict/dict.utf8, dict/jcconv.pyc が作成または更新されます。一旦この状態でツリーに登録しておきます。

$ cd ~/B2G/gaia/apps/keyboard/js/imes/jskanji
$ git add dict dict.json
$ git commit -m "add ipadic"

この辞書と日本語IMEを有効にするため、 ~/B2G/.userconfig に以下を追加します。

export GAIA_KEYBOARD_LAYOUTS=en,jp-kanji"

あとは build.sh を実行するだけです。一度ビルド済みのツリーの場合は念のため out 及び objdir-gecko ディレクトリを削除しておいてください。

ツリーの更新

新たに upstream から ./repo sync で更新を取得した場合、取得後に上記の変更を加えて更新されます。ただし、upstream で上記に当たるファイルが更新された場合は conflict しますので、それぞれのモジュールで confilict を除去する必要があります。

.userconfig もツリーに登録しておくことができます。しかしながら .userconfig は .gitignore により登録対象外に指定されていますので、-f オプションで強制登録するか、別途保存することになります。

Flame のビルド

flame を v1.3 のままにしていたものの、せっかく最新版が投入できる端末なので、ようやく時間ができたこともありビルドからやってみました。
flame goes to v2.2-master

ビルド

最新ツリーでは flame の config (./config.sh./.repo/manifests/flame.xml) が用意されているので、素直にビルドするだけで完了します。

$ git clone git://github.com/mozilla-b2g/B2G.git
$ cd B2G
$ ./config.sh flame
$ ./build.sh

デフォルトの flame では JellyBeans ベースですが、config.sh の引数に flame-kk を指定することで KitKat ベースでもビルドできます。ちなみに flame の場合は Linux kernel もビルドしています。

最初のビルドでは flame 端末のバックアップを行うため、予め実機を adb で繋いでおく必要があります。adb での接続は後述します。実際のバックアップは device/t2m/flame/extract-files.sh で行っています。

実機の接続

自環境では Windows から VMWare Player で Ubuntu を起動しているため、Windows で接続を行った後に Ubuntu に再接続するようにしています。

Windows の場合、実機を接続すると ドライバのインストールが要求されますが、Windows Update では完了できないため Flame用のドライバを導入する必要があります。Flame 用のドライバは MDN の Flame ページ から辿れます。成功すると以下のデバイスが登録されます。

  • USB Composite Device 9025
  • ALCATEL HS-USB Android Modem 9025 #2
  • ALCATEL HS-USB Diagnostics 9025(COMxx)
  • ALCATEL HS-USB NMEA 9025 (COMxx)
  • YunOS ACB Interface
  • ALCATEL HS-USB WWAN Adapter 9025 #2
  • USB 大容量記憶装置
  • Linux File-CD Gadget USB Device
  • Linux File-CD Gadget USB Device

Ubuntu(udev を使う Linux) の場合、udev に flame のデバイスIDを登録しておきます。/etc/udev/rule.d/50-firefoxos.rules を以下のように作成します(android.rules があればそこに追記でも可)。

SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"

1つ目は Qualcomm として、2つ目は Google(Android Device) として認識した場合のルールです。
基本的に1つ目だけでよいはずですが、端末状態によっては 2つ目で認識することもあったので記載しておきます。

lsusb などで USB として認識していれば、adb で接続できていることを確認します。

$ lsusb
  :
Bus xxx Device xxx: ID 05c6:9025 Qualcomm, Inc. 
  :
$ adb devices
list of devices attached
12345678        device

permission のエラーなどで繋がらない場合は、一旦端末を外して以下を実行した後に接続を試みます。

$ sudo adb kill-server
$ sudo adb start-server

実機への書き込み

ビルドと接続が終わっていれば、書き込みスクリプトを実行するだけです。実行中はフラッシュメモリの各パーティションの消去と書き込み経過が逐次表示されます。

$ ./flash.sh