2013年6月10日月曜日

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 へと続きます。

こちらもどうぞ


5 件のコメント:

  1. こんにちは。
    ビルド済みパッケージから一度はインストールできたものの、
    その後、別のカーネルを当てたところ、再インストールできなくなりました。
    CWM-based Galaxy S2 Recovery v5.0.2.8 r3 を使用し、
    install zip from sdcard -> choose zip from external sdcard でインストールしてます。
    前後に /data, /cacheのwipeもしております。

    何か注意すべき点がありましたらご教示いただけたら幸いです。

    返信削除
  2. 「別のカーネルを当てた」際に何が起こったのかがわからないと回答しにくいのですが、
    Odinで公式ロムに戻し、rootを取るところから始めると確実かなとは思います

    返信削除
  3. こんにちは。最新のROM(ビルド番号IML74K.OMMP7)に odinで、GT-I9100_ICS_ClockworkMod-Recovery_5.5.0.4.tar を焼いて、CWMからインストールしてみたのですが、リブート後、ブートロゴから先に進みません。/data, /cacheのwipeもしています。

    ルートは必ず入れる必要があるのでしょうか?
    また実績のあるROMバージョンやCWMのバージョンとか教えていただけたら幸いです。

    返信削除
  4. いま手元にGalaxy SIIがないので試すとしたら1週間近く後になることをご了承ください。
    文面から気になったのはGT-I9100_ICS_ClockworkMod-Recovery_5.5.0.4.tarは海外版のGalaxy SII用のリカバリのように見えることです。これは日本版のGalaxy SIIでも動作実績はありますか?

    私自身は以下の末尾に書かれている方法で試したはずですが、
    古い情報なので、もう必要なファイルなどが入手できないかもしれませんね。
    http://neuralassembly.blogspot.jp/2012/07/docomo-galaxy-s-ii-sc-02c-cyanogenmod-9.html

    返信削除
    返信
    1. 返信ありがとうございます。海外版のCWMでもとりあえずandroidは動いたのでまあいいかな?で進めました。install zipしても、今まで通りのandroidが動いたので、あっ!、format /system しなきゃだめなのかと思い、CWMでformat /system してからinstall zip したのですがうんともすんとも動かなくなって、odinで最新androidのROMを焼き直しした次第です。おそらくinstall zipからうまくカーネルとsystemが展開されていないのではないかな?と思います。海外版のCM9も入れてみたのですが、似た感じで終わりました。

      削除