2013年5月12日日曜日

FirefoxOS端末、Peak解析

KeonやPeakを手に入れた方が続々いらっしゃる。
そして日本語化の手順を載せているが、基本的には以前GNexus上で行なっていたやり方と同様なので
問題無いだろう。

ただみなさんイメージファイルを焼いているようだが、自分は以前TwitterにてMozillaの中の人から
Gaiaを編集するだけだったらイメージファイル焼きなおす必要ないよ、とアドバイスをいただいたので、
今回もそのアドバイスを元にしてちょっとPeakのアプリ適用と日本語化周りを解析してみた。




PeakをPCに接続する

以前からsolaさんのブログを参考にしていたが、 開発者端末をお持ちのこちらの方のサイトも参考にした。

Firefox OS端末 KEON にadb経由で接続する - よくわかってないBlog その2
ただ、こちらの記述だけでは自分のマシンの環境ではPeakとデバイスドライバとを認識できなかったので、
Android SDKのextras/google/usb_driver/android_winusb.infに以下のように追記した。
;Peak
%SingleAdbInterface%        = USB_Install, USB\VID_05C6&PID_8013&MI_01
%CompositeAdbInterface%     = USB_Install, USB\VID_05C6&PID_8013&REV_0231&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_05C6&PID_8013
%CompositeAdbInterface%     = USB_Install, USB\VID_05C6&PID_8013&REV_0231
記述するセクションは[Google.NTx86][Google.NTamd64]にした。

ちなみにこのハードウェアID、Peakなどの端末をPCに接続すると、デバイスマネージャー上で確認することができる。
ドライバが認識されていない状態(黄色の!マークが出ている状態でも可)でも、次の手順で確認ができる。

プロパティ詳細タブプロパティのコンボボックスからハードウェアIDを選択


ここの記載を元にしてinfファイルに上記のように記述したら、問題なくPeakを認識できた。



※adb shellでも問題なく入ることが出来た


翻訳済みアプリをインストールする

アプリの翻訳のやり方は以下を参照したほうが手っ取り早い。
FirefoxOSのアプリ、つまりGaia配下のアプリはHTML+javascriptでできていることはすでに知られている。
普通に考えたらイメージファイルを作成してfastbootで焼く・・・などということはやらなくてもいいのだ。
その辺りの解析は私の旧ブログの解析を参考にしてほしい。
Firefox OSを試した:gaia/Makefileを解析した - きままなたぐりぶろ(日記)

ただ当時の解析結果と違うのは、Peakでのアプリのインストール先は次の場所だった。
/system/b2g/webapps
プリインアプリ・標準アプリ
/data/local/webapps
Marketplaceからなど、ユーザー作成のアプリ


上の赤線部分がプリインアプリ、下がユーザー作成のアプリ

それぞれのアプリはxxxx.gaiamobile.orgというフォルダに格納されている。xxxxの部分にアプリ名が入るようになっている。
ユーザー作成のアプリの場合はその限りではないようだ。
(ユーザー作成アプリの"[eecf59...]"というのはMarketplaceから入れたTwitter)

各フォルダにはapplication.zipmanifest.webappが入っている。
application.zipがアプリ本体が圧縮されたものである。
つまりこの形式のファイルをPeakに直接入れればアプリが適用出来るのだ。

手動でアプリをインストールする場合の手順は、つきつめると次の4行でできることになる。
adb shell stop b2g
adb push manifest.webapp /xxxx/xxxx/webapps/homescreen.gaiamobile.org/manifest.webapp
adb push application.zip /xxxx/xxxx/webapps/homescreen.gaiamobile.org/application.zip
adb shell start b2g
/xxxx/xxxxの部分はプリインアプリかユーザー作成アプリによって/system/b2gか/data/localに置き換えてほしい。

これをする前に注意しておきたい点。それは/system/b2gや/data/localが読み取り専用になっているかもしれないということ。
adb shellで入り、mount(引数なし)を実行するとディレクトリのマウント状況がわかる。そこで/systemを確認してみる。
/dev/block/mmcblk0p12 /system ext4 ro,relatime,user_xattr,barrier=0,data=ordered 0 0
このようになっていたら次を実行して読み書きできるようにしておこう。
mount -o rw,remount -t ext4 /dev/block/mmcblk0p12 /system
ファイルシステム、各パスは必ず自分の環境のものを確認してからやること!

読み書きできるようになったら、ローカルに用意したアプリのmanifest.webappとapplication.zipの場所を確認して、
上記4のコマンドを実行しよう。(やる前にPeakやKeon内のアプリはかならずバックアップすること!

ポイントとなるのは、最初と最後のadb shell stop b2gadb shell start b2gだろう。これらはFirefoxOSの大元だ。
これをstop b2gすることでFirefoxOSを停止させる。その間にアプリをインストールする。
最後にstart b2gをすることで、停止中に行ったアプリのインストール作業がすべて反映されるという仕組みだ。
この一連の流れはFirefoxOSのソース中のB2G/gaia/Makefileにも記載されている流れだ。

Ubuntu上でgaiaのみビルドし、B2G/out/target/product/maguro/data/local/webapps/xxxx.gaiamobile.org内にある
application.zipとmanifest.webappを持ってきて、手動でコピーする。 すると日本語化できる。

Peakに入っていた元の設定画面より文字が小さくなっているのは、GNexus用に解像度を調整してビルド設定していたものを
そのまま使ってしまったためである。調整して再ビルドすれば問題無いだろう。

日本語キーボードも同じ手順でやってみたが、設定画面のキーボードレイアウトに日本語の選択肢が出てこず、
またqwertyキーボードも出てこなくなってしまった。手動でやっているために何か足りないのだろう。
ただ、必要なファイルはどのアプリとしてもすべて各application.zipとmanifest.webappに含まれるはずなので、
おそらく辞書ファイルのMakeの仕方か準備の仕方に問題があるのだろうと考えられる。


翻訳の仕組みを解析する

さて、翻訳の作業も手動でできるか調べてみた。
翻訳の準備は上記までに紹介したブログに記載されている手順とまったく同じだ。
mercurialでコピーしたファイルに何が含まれているのかというと、次のファイルだ。
manifest.properties
manifest.webappに追記するロケールの定義
xxxx.properties
各アプリの翻訳ファイル
manifest.propertiesは中身を見ると、次のようになっていたりする。
name=システム
description=メインシステム
これがビルドを経て、manifest.webappに追加される。追加されたとこうなる。
  "locales": {
    "en-US": {
      "name": "System", 
      "description": "Main System"
    }, 
...中略...
    "ja": {
      "name": "\u30b7\u30b9\u30c6\u30e0", 
      "description": "\u30e1\u30a4\u30f3\u30b7\u30b9\u30c6\u30e0"
    }
つまりJSON形式に変換されて、定義ファイル内に埋め込まれる。この中に存在するロケールだけが、
システムの言語設定を変更した際に、その言語で各アプリが表示されるようになっている。
システムの言語設定に定義があるのにアプリ内でそのロケールがない場合、default_localeのロケールが 適用されるようになっている。

次にxxxx.propertiesだ。これもほとんど同じで中身はこのようになっている。
ok=OK
back=戻る
cancel=キャンセル
close=閉じる

# utility tray mobile states
airplaneMode=機内モード
searching=検索しています…
これもビルドを経て、JSON形式になって埋め込まれる。埋め込まれる先というのが・・・

index.html

なのだ。しかもそれがindex.htmlの最後の方にある次のタグの中にである。
<script type="application/l10n">
Peakから抽出してきたapplication.zip内のindex.htmlも見てみたのだが、日本語化云々関係なく標準で用意されるロケールの 翻訳の定義もすべてここに記述されているようだ。

※本来は1行にまとまっている。見やすさのため適度に改行してあります。
  {"locales":{
   "en-US":{
    "brandShortName":{"textContent":"B2G OS"},
    "browserBrandShortName":{"textContent":"Web Browser"},
    "browserBrandFullName":{"textContent":"Mozilla Web Browser"},
    "ok":{"textContent":"OK"},
    "back":{"textContent":"Back"},"cancel":{"textContent":"Cancel"},"clo ...
   "ja":{"brandShortName":{"textContent":"B2G OS"},
   "browserBrandShortName":{"textContent":"Web Browser"},
   "browserBrandFullName":{"textContent":"Mozilla Web Browser"},
   "ok":{"textContent":"OK"},"back":{"textContent":"戻る"},
   "cancel":{"textContent":"キャンセル"},"close":{"textContent":"閉じる"},"airp ...
   },"default_locale":"en-US"}
...省略...
長いので一部分だけ。仕組みさえわかれば、翻訳したいアプリのindex.htmlを開いてscript type="application/l10nのタグの中に
直接日本語の定義を追加してもよいだろう。が、アプリによってはかなりたくさんの定義になるので既存のアプリのここに手動で
翻訳の定義を追加するのはあまりスマートではないだろう。
実際に自作アプリを作るときはここの定義を流用して行えばいいのでその際は楽にできるかもしれない。

ちなみにこのscriptタグ、どうせなら外出しにしてやれよと思ってsrc属性を追加してみたが、うまくいかない。
どうやらscript要素の正しい使い方ではなく、単にscript要素のinnerHTMLを取得しているだけのようでsrcで外出しにしたファイルは
使えないようだ。
(外出しのファイルを使う場合はlink要素を使うらしい。このあたりはshared/js/l10n.jsを参照。)

手動で翻訳を追加して、手動でアプリインストールしてみる

ここまでの解析を踏まえて、試しにもとのapplication.zipを解凍してindex.htmlとmanifest.webappを取り出した。
そこにgaia-l10n内にある翻訳定義をJSON形式に変換してそれぞれに追加した。
それを再び手動でapplication.zipに圧縮しなおしてPeak内にadb pushで転送して、FFOSを再起動!



ん?立ち上がらない?
画面は暗転したままだ。バックアップしていたものに戻してみる。
・・・起動した。
Ubuntu上で正しいビルドをして生成されたapplication.zipを転送してみる。
・・・起動した。
バックアップしていたapplication.zipを解凍、手動で再圧縮して転送してみた。(一切変更なし)
・・・起動しない。

なるほど。どうも圧縮の仕方に問題があるようだ。
gaia/Makefileの中から呼んでいるbuild/webapp-zip.jsあたりで圧縮していると判断するのだが、
zipコマンドなぞ見当たらない。それどころかxulrunner-sdkなるファイル群で
圧縮や何か根底となる作業をしているようだ。
圧縮する際に特殊な署名をzipに埋め込んでいるのか、それとも隠しファイルがあってそれを
FFOS動作時に読み取っているのかわからないが・・・。

もしかすると自分の環境のzip圧縮が悪いのかもしれない。(Winだとlhaplus、UbuntuだとFile Roller)
このあたり別の方の環境での動作報告が欲しい。

終わりに

以前解析したアプリのインストール周りをPeakでも検証してきた。
アプリのインストール自体は同じ手順で手動でできるようだ。
つまり、わざわざイメージファイルを焼いてfastbootで適用するなんて面倒な作業をしなくてもよいことが Peakにおいても証明できた。

自分の目標としては、なるべく手軽にいろんな環境でFFOSアプリを作成できるようにすることで、
今回スムーズに事が進んでいれば、手動で翻訳を追加して手動で再圧縮して素早くアプリを適用・・・といったことが
できている想定だった。
が!圧縮の仕方に問題ありということで、FFOSアプリの下準備は当面はFFOSのソースに含まれるbuild.shを使って
行う必要がありそうだ。

結局のところ、application.zipさえ正しく作れればいいのだ。
・・・だってこのまま圧縮の仕方に問題ありだと、FFOSアプリを正しい形にするための最後の作業が特定の環境に
依存してしまうことになる。そんなのはもったいない。
圧縮周りは引き続き解析を続けてみよう。

0 件のコメント:

コメントを投稿