2013年6月10日月曜日

docomo Galaxy S3 (SC-06D) 向けにFirefox OSをビルドしてみた

はじめに

前回、docomo Galaxy S2 (SC-02C) にFirefox OSをビルドし、感覚をつかみました。
これに基づいて Galaxy S3 (SC-06D) にFirefox OSをビルドしてみます。

Galaxy S2は(海外版とは言え)公式にサポートされている端末でしたが、
Galaxy S3はそうではありません。そこで問題となるのが、ハードウェア絡みのドライバを
どう用意するかです。

mozilla-b2g / b2g-manifestのリポジトリを見ると、公式ではlinaroやcodeauroraなどのコードを利用していますが、
それと同じことをし、さらにdevice以下のmkファイルを自分で用意するのは私の手に負えないと考え、
既に動作が確認されている CyanogenMod9 からハードウェア依存のコードを全て持ってくるようにしました。
CyanogenMod9は依存関係が深いので、framework/base や system/core まで
CyanogenMod9のものを持ってくる羽目になりましたが、結果的に動いたのでよしとします。
(詳細はneuralassembly / b2g-manifest / sc06d.xml を見て下さい)

動画はこちら



というわけで、ビルド法は以下の通りです。Galaxy S2のときと同様、
solaさんによる「Keon と Peak が届かないので、Nexus S を Firefox OS 端末にしてみた
によるビルド法を踏襲したものになっています。
また、ビルド環境の構築にも上記のsolaさんのページを参考にしてみてください。

なお、通常のFirefox OSと、solaさんによるカスタムロムであるBoot to JCROM
両方のビルド法を以下で解説します。




ソースの準備

ソースを下記のようにダウンロードします(環境によりますが30分~1時間くらいかかります)。

$ mkdir ~/b2g_work
$ cd ~/b2g_work
$ export B2G_WORK=`pwd`
$ git clone https://github.com/neuralassembly/B2JC.git B2G
$ cd B2G

通常のFirefox OSのビルドの際は以下のコマンドを、
$ ./config.sh sc06d

solaさんによるBoot to JCROMのビルドの際は以下のコマンドを実行します。
$ ./config.sh sc06d-b2jc

次に、Galaxy S3 の /system ディレクトリのダンプを
ソースツリーに配置するのですが、ここではHomuHomu さんらが開発されている一撃ツールと
ビルド済みCyanogenMod9のファイルを用いることにします。

$ mkdir $B2G_WORK/B2G/backup-sc06d
$ cd $B2G_WORK/B2G/backup-sc06d
$ wget http://dl.dropbox.com/u/14219187/make_JP_CompleteROM_SC06D.zip
$ unzip make_JP_CompleteROM_SC06D.zip
(http://goo.im/devs/cm/d2att/nightly/ から cm-9-20120916-NIGHTLY-d2att.zip
をダウンロードしてここに配置)
$ unzip cm-9-20120916-NIGHTLY-d2att.zip
$ cd $B2G_WORK/B2G/device/samsung/sc06d/
$ ./extract-files.sh

以上の操作により、以下が作成されます。
$B2G_WORK/B2G/vendor/samsung/sc06d/

高解像度対応、日本語対応など

この章で行う操作はsolaさんによるものを流用させて頂いております。

また、この章の内容は、通常のFirefox OSをビルドするときのみ行ってください。
Boot to JCROMをビルドする場合は次の「いくつかの修正」へ進んでください。

下記のように日本語辞書を用意します。

$ cd $B2G_WORK
(naist-jdic-0.4.3.tar.gzを http://sourceforge.jp/projects/naist-jdic/releases/ からダウンロードして配置)
$ tar zxvf naist-jdic-0.4.3.tar.gz
$ cd $B2G_WORK/B2G/gaia/apps/keyboard/js/imes/jskanji/dict
$ mkdir ipadic
$ cp $B2G_WORK/naist-jdic-0.4.3/naist-jdic.dic ipadic/
$ make json (この命令は環境変数LANGの値によっては失敗します。ja_JP.utf8 にセットすればよいです)

いくつかの修正

画面ON時にHOMEボタン裏のLEDが光りっぱなしになるのが気になるので以下で修正します。

$ cd $B2G_WORK/B2G/gecko/hal/gonk/
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g-GonkHal.patch
$ patch < b2g-GonkHal.patch

環境変数設定

次に、環境変数設定を行います。

$ export LOCALE_BASEDIR=$B2G_WORK/B2G/multilocale/gaia-l10n
$ export LOCALES_FILE=$B2G_WORK/B2G/multilocale/languages-japan.json
$ export PATH="$PATH:$B2G_WORK/B2G/multilocale/compare-locales/scripts"
$ export PYTHONPATH="$B2G_WORK/B2G/multilocale/compare-locales/lib"
$ export MOZILLA_OFFICIAL=1
$ export GAIA_DEV_PIXELS_PER_PX=2

kernel のビルド

ここは自分でkernelをビルドしたい人のみ行って下さい。
既に日本版のkernelを配置済みなので飛ばしても問題ないです。

kernelはsakuramilkさんの公開されているSC-06D用kernelを使わせていただきます。

$ cd $B2G_WORK
$ git clone https://github.com/sakuramilk/sc06d_kernel_ics.git -b android-linux-3.0-master
$ cd sc06d_kernel_ics
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/sc06d_kernel_makefile.patch
$ patch < sc06d_kernel_makefile.patch

$ export ARCH=arm
$ export CROSS_COMPILE=$B2G_WORK/B2G/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

$ make sc06d_aosp_defconfig
$ make -j16
$ cp `find drivers -name "*.ko" ` $B2G_WORK/B2G/device/samsung/sc06d/
$ cp arch/arm/boot/zImage $B2G_WORK/B2G/device/samsung/sc06d/kernel

ビルドと書き込み

以下のようにビルドを行います。

$ cd $B2G_WORK/B2G
$ ./build.sh otapackage

ビルドが終わると、
  out/target/product/sc06d/full_sc06d-ota-eng.username.zip
ができていますので、これをCWM recoveryで書き込んでください。
heimdallでの書き込みには私は成功していません。
 (heimdall detect での検出には成功するが、書き込みできない)

ビルド済みパッケージ


できることとできないこと

下記のような感じです。Wifiが使えるので、それなりに遊べます。アップデートの通知が来ますが、アップデートしないでください。

通話×-
3G通信×-
Wifi-
SDカード内蔵メモリではなく、外付けのSDカードを使用
カメラ×アプリ起動しないです
音楽再生-
動画再生-

そういえば、端末をつないでからadbで接続できるようになるまで、1~2分待たされます。なぜ?

技術的なこと&ハマったこと

Galaxy S2でotapackageを作るために必要な変更は前頁にて紹介しましたが、
ここではさらに以下を追加しました。


 ramdisk のアドレスをdeviceディレクトリの各端末のmkファイルで指定できるようにしています。
 (CyanogenMod 9由来)

Galaxy S3 でFirefox OSを動かすにあたり、まず必要なことはkernelを正常に動作させることです。
kernelが起動して起動スクリプトが実行されれば、次のステップであるgaiaが起動しなくても、
adb shellで端末の中身を見ることができるので、問題を発見しやすくなります。
(ただしこの際、画面は真っ黒なまま)

次に、gaiaの起動ですが、Galaxy S2の起動法に従えば、以下の手順で起動プロセスが進みます。

(1) init.b2g.rc のインポート
(2) /system/b2g/b2g などに実行パーミッションを与える
(3) check-sysimage.shを実行し、OSがandroidかFirefox OSかを判定する
(4) 判定結果に基づき、 servicemanager-g というサービスを起動する
(5) /system/bin/b2g.sh が起動される
(6) /system/b2g/b2g が実行される

(2)の /system/b2g/b2g に実行パーミッションを与えるのが曲者で、
この時点で/system パーティションが読み書きできる状態でなければ
実行権限が与えられず、(6)の起動に失敗します。これに気づくまで数日かかりました。

また、実行パーミッションをうまく与えても、数回に一回しか起動しない、という
状態になりました。これは起動プロセスのタイミングの問題だろうと考え、
上の、やや回りくどい起動プロセスを下記のように簡略化しました。
(init.b2g.rcやcheck-sysimage.shは残してありますが、実行されていない)
これにより、確実に起動するようになりました。

(1) /system/b2g/b2g などに実行パーミッションを与える
(2)  servicemanager-g というサービスを起動する
(3) /system/bin/b2g.sh が起動される
(4) /system/b2g/b2g が実行される

使ってみた感想など

Galaxy S2とGalaxy S3とでは、その性能差からS3の方が快適だろうと予想していたのですが、
必ずしもそうではありませんでした。S3の解像度(720x1280)はS2の解像度(480×800)より
高いのですが、そのためにブラウザなどの文字表示が小さくなり、またタッチに反応する
エリアが狭くなってしまっていることが何度もありました(反応するまで何度もタッチする)。
また、画面が大きいせいもあるのか、もっさり感を感じる場面も多くありました。

また、Firefox OSとandroidとを比較した場合(比較してはいけないのでしょうが)、
androidでは快適に見られていた動画がFirefox OSではカクカクになるなど、
ネイティブまで触れるandroidと、HTML5メインのFirefox OSの差を感じさせられました。

もちろん、これらは自分でビルドした端末での評価なので、
公式のKEONやPEAKでは異なるのかもしれません。

「ネイティブ vs HTML5」という図式を見ると、Java1.1~Java2の頃の「C++ vs Java」
のどちらが速いかという論争を思い出してしまいます。
当時は「(ベンチマークの内容によっては)JavaはC++よりも高速」なんてよく言われてましたね。

結局Javaは「クライアントサイドでは遅い」というイメージを今でも払拭できていないと私は思いますが、
HTML5はどうなるか、気になるところです。

おしまい

日本語化や高解像度の設定、odapackageの作成などにはsolaさんいよる変更を、
プロプライエタリファイル周りではHomuHomuさんの一撃ツールを、
kernelはsakuramilkさんのものを
使わせて頂きました。

docomo Galaxy S2 (SC-02C) 向けにFirefox OSをビルドしてみた

はじめに

solaさんによる「Keon と Peak が届かないので、Nexus S を Firefox OS 端末にしてみた
から始まるFirefox OSについての連続投稿を見て、自分でも何かビルドしてみようと思い立ちました。

Firefox OSはandroid 4.0 (ICS)ベースであり、ICSが動く端末ならばFirefox OSを載せることは
技術的には可能、ということなので、手持ちのGalaxy S2とGalaxy S3に載せることを目標にします。
どちらの端末にもCyanogenMod 9 (ICSベースのカスタムロム) をビルドして
載せたことがあるので、多分なんとかなるだろう、との予測からです。

なお、「Firefox OS ビルドの必要条件」にあるように、Galaxy S2は優先度は低いとはいえ
公式にサポートされている端末なので、これでビルドの手順を把握してから
Galaxy S3に進むという手順を取ります。

Galaxy S2は去年9月にもビルドしたことがあって、その時はまだ完成度が低かったものが
どれくらい変化したか見たい、というのもあります。

目標

ビルドするにあたって、目標にしたのは下記の2点です。
  • kernelは自分でビルドしたものを用いる
  • ビルド用PCと端末に焼くPCとを別にしたい
一つ目のkernelについてですが、海外版と日本版のGalaxy S2ではバードウェア構成が
若干異なるので、日本版に対応したkernelをビルドして載せないと、
電池持ちが悪くなるなどの問題が起こるだろう、との判断からです。

また、二つ目ですが、Galaxy S2はFirefox OSのgaiaのインストールにadb接続を用います。
そのため、ビルド用PCだけではなく、端末に焼くPCにも
gaiaのソース一式が必要なので、取扱いがちょっと面倒でした。
この部分にはsolaさんによるodapackageの対応などを活用させて頂き、
CWM recoveryで焼けるzipファイルを作成するようにしています。
(odapackageとCWM recoveryによるインストールはGalaxy S3では必須になります)

手順は以下の通りです。
なお、ビルドのための環境構築はsolaさんによる
Keon と Peak が届かないので、Nexus S を Firefox OS 端末にしてみた
を参考にしてみてください。

なお、通常のFirefox OSと、solaさんによるカスタムロムのBoot to JCROM
両方のビルド法をともに記します。

ソースの準備

ソースを下記のようにダウンロードします(環境によりますが30分~1時間くらいかかります)。

$ mkdir ~/b2g_work
$ cd ~/b2g_work
$ export B2G_WORK=`pwd`
$ git clone https://github.com/neuralassembly/B2JC.git B2G
$ cd B2G

Firefox OSをダウンロードする場合は以下のコマンドを、
$ ./config.sh sc02c

Boot to JCROMをダウンロードする場合は以下のコマンドを実行します。
$ ./config.sh sc02c-b2jc

次に、Galaxy S2 (SC-02C)の /system ディレクトリのダンプを
ソースツリーに配置します。

$ mkdir -p $B2G_WORK/B2G/backup-sc02c/system
$ cd $B2G_WORK/B2G/backup-sc02c/system
(端末がつながっていれば)
$ adb pull /system/. .

もし端末がビルド用のPCにつながっていない場合、あらかじめsystemを
ダンプしておき、何らかの方法でビルド用のマシンの
$B2G_WORK/B2G/backup-sc02c/system
に配置してください。できたら、以下のように/systemから抜き出したファイルをソースツリー上に配置します。

$ cd $B2G_WORK/B2G/device/samsung/sc02c/
$ ./extract-files.sh

この操作により、下記のディレクトリにプロプライエタリファイルなどが配置されます。
$B2G_WORK/B2G/vendor/samsung/sc02c/
$B2G_WORK/B2G/vendor/samsung/sc02c-common/

高解像度対応、日本語対応など

この章で行う操作はsolaさんによるものを流用させて頂いております。

また、この章の内容は、通常のFirefox OSをビルドするときのみ行ってください。
Boot to JCROMをビルドする場合は次の「いくつかの修正」へ進んでください。

下記のように日本語辞書を用意します。

$ cd $B2G_WORK
(naist-jdic-0.4.3.tar.gzを http://sourceforge.jp/projects/naist-jdic/releases/ からダウンロードして配置)
$ tar zxvf naist-jdic-0.4.3.tar.gz
$ cd $B2G_WORK/B2G/gaia/apps/keyboard/js/imes/jskanji/dict
$ mkdir ipadic
$ cp $B2G_WORK/naist-jdic-0.4.3/naist-jdic.dic ipadic/
$ make json (この命令は環境変数LANGの値によっては失敗します。ja_JP.utf8 にセットすればよいです)

いくつかの修正

また、画面ON時にHOMEボタン裏のLEDが光りっぱなしになるのが気になるので以下で修正します。

$ cd $B2G_WORK/B2G/gecko/hal/gonk/
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g-GonkHal.patch
$ patch < b2g-GonkHal.patch

また、下記でOTAアップデートを無効にします。
$ cd $B2G_WORK/B2G/gaia/apps/system/js/
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g-update_manager.patch
$ patch < b2g-update_manager.patch

環境変数の設定

環境変数を設定します。

$ export LOCALE_BASEDIR=$B2G_WORK/B2G/multilocale/gaia-l10n
$ export LOCALES_FILE=$B2G_WORK/B2G/multilocale/languages-japan.json
$ export PATH="$PATH:$B2G_WORK/B2G/multilocale/compare-locales/scripts"
$ export PYTHONPATH="$B2G_WORK/B2G/multilocale/compare-locales/lib"
$ export MOZILLA_OFFICIAL=1
$ export GAIA_DEV_PIXELS_PER_PX=2

kernel のビルド

ここは自分でkernelをビルドしたい人のみ行って下さい。
既に日本版のkernelを配置済みなので飛ばしても問題ないです。

http://opensource.samsung.com/ からMobile→Mobile Phoneと辿り、
SC-02C_ICS_Opensource_Update1.zipを $B2G_WORKにダウンロードしておきます。

$ cd $B2G_WORK
$ unzip SC-02C_ICS_Opensource_Update1.zip
$ mkdir kernel
$ cd kernel
$ tar zxf ../Kernel.tar.gz

$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g_jpn_ntt_defconfig -O arch/arm/configs/b2g_jpn_ntt_defconfig
$ git clone https://github.com/neuralassembly/initramfs-sc02c-b2g.git
$ rm -rf initramfs-sc02c-b2g/.git
$ rm -f initramfs-sc02c-b2g/README.md
 (initramfs-sc02c-b2gディレクトリがそのままrootfsになるので、
 不要なファイルを削除します。残しておいても影響ないので、
 気になる方は削除しないでもよいです)

$ export ARCH=arm
$ export CROSS_COMPILE=$B2G_WORK/B2G/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

$ make b2g_jpn_ntt_defconfig
$ make -j16

$ cp `find drivers -name "*.ko"` initramfs-sc02c-b2g/lib/modules/

$ make -j16

$ cp `find drivers -name "*.ko"` $B2G_WORK/B2G/device/samsung/sc02c/
$ cp arch/arm/boot/zImage $B2G_WORK/B2G/device/samsung/sc02c/kernel

ビルドと書き込み

以下のようにビルドを行います。

$ cd $B2G_WORK/B2G
$ ./build.sh otapackage

ビルドが終わると、
 out/target/product/sc02c/full_sc02c-ota-eng.username.zip
ができていますので、これをCWM recoveryで書き込んでください。

heimdallで焼きたい方は
 out/target/product/sc02c/ にある kernel と system.img を
heimdall flash --kernel kernel --factoryfs system.img
で焼いてもOKです。ただし、この場合heimdallのバージョンは1.3.1を用いてください。
1.3.2を用いると、system.img を焼く際に失敗します。

ビルド済みパッケージ

できることとできないこと

下記のような感じです。3GとWifiが使えるので、それなりに遊べます。アップデートの通知が来ますが、アップデートしないでください。

通話×-
3G通信docomo SIMでmopera.netに接続
Wifi-
SDカード内蔵メモリが使われる
カメラ×カメラアプリを起動して放っておくと数分間隔で絵は撮れてるので、努力次第でなんとかなるかも?
音楽再生-
動画再生R, G, B の各成分の画像が縦にずれて表示される


技術的なこと

少し細かな話ですが、「目標」で述べた2点について少し補足します。

kernelですが、Galaxy S2ではkernel (zImage) をそのままboot.imgにコピーして用います。
その際、rootfs は initramfs に配置します。
また、kernelをビルドするためのコンパイラはarm-eabi-4.4.3のものにしましたが、
これを用いないと、起動しないkernelができたり、insmodで読み込めない
カーネルモジュールができたりしました(よくあることのようです)。

また、otapackageの作成ですが、関連するコミットやリポジトリへのリンクを貼っておきます。
<solaさんによるもの>
sola-dolphin1 / B2JC / Supports build otapackage.
sola-dolphin1 / platform_build / Supports build otapackage.
sola-dolphin1 / platform_external_genext2fs
sola-dolphin1 / platform_external_e2fsprogs

<私による追加>
neuralassembly / platform_build / add support for BOARD_CUSTOM_BOOTIMG_MK
  例えば「kernelをそのままコピーしてboot.imgとする」というような指定を
 deviceディレクトリの端末毎のmkファイルで行えるようにした (CyanogenMod 9 由来)
neuralassembly / platform_build / skip common.CheckSize when creating otapackage
 こちらはエラー回避のため

ということで、公式にサポート端末である Galaxy S2 によって
ビルド法をある程度理解できたので、次回の Galaxy S3 へと続きます。

こちらもどうぞ


2013年5月14日火曜日

スマートウォッチi'm watchのマーケットi'marketでアプリを公開してみた

スマートウォッチi'm watchを使ってこれまで
してきましたが、せっかくなのでマーケットであるi'marketにアプリを出してみることにしました。

モノはこの前GooglePlayに出しSimpleMjpegViewのi'm watch版で名前をMjpegViewとしました(名前の長さに制限があります)。

i'm watchはスマートフォンと連携して使うのですが、そのスマートフォンからネットワーク的にアクセスできるネットワークカメラからのMJPEGストリームを表示するアプリです。

スクリーンショットはこんな感じ。
ネットワークの設定画面はこんな感じです。
そして使用イメージはこんな感じ。
なお、i'm watchはbluetoothで母艦のスマートフォンと接続するため、データ量を極力小さくする必要があります。そのため、解像度やフレームレートなどを細かく設定可能なIP Webcamというアプリをandroid上で動かしてネットワークカメラとするのが現実的です。

IP Webcamの設定は以下の程度とするのが良いと思います。
  • Resolution: 320x240
  • Quality: 20-30
  • Orientation: Landscape
  • FPS Limit: 5
スマートウォッチi'm WatchでMJPEGストリームを表示してみた」や「スマートウォッチi'm WatchでタミヤのRCモデルを操作してみた」でやったように、ものを動かすコントローラーとしてi'm watchを使う場合、一緒にカメラ映像も表示してあげると、程よい未来感が出てカッコいいかなあ、なんて思います。

ソースはGitHubで公開してます。