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さんのものを
使わせて頂きました。

0 件のコメント:

コメントを投稿