らいふうっどの閑話休題

興味のあることをゆる~く書いていく

新訳:ADB Helperをハックしてみた(まとめ)

この記事は『Firefox OS / B2G OS Advent Calendar 2016』 25日目の記事です。
Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。

目次

 

今回は、adb-helper のまとめをしていきたいと思います

  1. フォルダ内のファイル構成
  2. 今回のまとめ
  3. 関連記事
  4. 今年のAdvent Calendar
フォルダ内のファイル構成
  [ 解凍フォルダ内のjsファイル群 ]
install.rdf
main.js
adb.js
adb-client.js
adb-running-checker.js
adb-socket.js
bootstrap.js
scanner.js
device.js
※1
※1
※1
devtools-import.js
※1
※1
※1
devtools-require.js
※1
※1
※1
fastboot.js
※1
※1
※1
subprocess.js
※2
※2
※2
subprocess_worker_win.js
※3
※3
※3
subprocess_worker_unix.js
※4
※4
※4
  ※1 : version 0.7.1 時点では無かったファイル
※2 : version 0.7.1 時点で有ったファイル
※3 : version 0.7.1 時点で有ったファイル、Windows用ファイル
※4 : version 0.7.1 時点で有ったファイル、maclinux用ファイル

OS毎に使用されるファイルが有る事が確認できます。



今回のまとめ
  subprocess.js,subprocess_worker_(win/unix).js は、アドオンのバージョンアップにより device.js,devtools-import.js,devtools-require.js,fastboot.js 等の モジュールに置き換わっていますので、ハックは割愛します。

最初に投降した「ADB Helperをハックしてみた(前篇)」が2014年11月6日ですから 完遂するのに 2 年以上経っている事になります。

逆に2 年以上経っているからこそ、モジュールの効率化が
どのように進化を遂げているかが分かりました。

バージョン 0.7.* の時は、Windows 用と mac,Linux用でjs ファイルが別だったのが
現在は全ての OS で同じ js ファイルを使われている事からも分かります。

ADB Helper をハックしてみて、Android SDK 無しで簡単に Firefox OS 端末(Fx0, Flame)や Open Web Board, CHIRIMEN ボード Echigo Rev.1 に接続して Web 開発と 同じ要領で、デバイスへアプリをインストールする仕組みを理解する事が出来ました。

これまでの投稿記事で、記載内容に誤りや補足、アドバイスなど頂ければ幸いです。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar

新訳:ADB Helperをハックしてみた(fastboot.js)

この記事は『Firefox OS / B2G OS Advent Calendar 2016』 24日目の記事です。
Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。

目次

 

前回、新訳:ADB Helperをハックしてみた(devtools-require.js)に引き続き、
adb-helperをハックしていきたいと思います

  1. フォルダ内のファイル構成
  2. fastboot.js
  3. 予備知識
  4. モジュール構成
  5. 今回のまとめ
  6. 関連記事
  7. 今年のAdvent Calendar
フォルダ内のファイル構成
  [ 解凍フォルダ内のjsファイル群 ]
install.rdf
main.js
adb.js
adb-client.js
adb-running-checker.js
adb-socket.js
bootstrap.js
scanner.js
device.js
※1
※1
※1
devtools-import.js
※1
※1
※1
devtools-require.js
※1
※1
※1
fastboot.js
※1
※1
※1
subprocess.js
※2
※2
※2
subprocess_worker_win.js
※3
※3
※3
subprocess_worker_unix.js
※4
※4
※4
  ※1 : version 0.7.1 時点では無かったファイル
※2 : version 0.7.1 時点で有ったファイル
※3 : version 0.7.1 時点で有ったファイル、Windows用ファイル
※4 : version 0.7.1 時点で有ったファイル、maclinux用ファイル

OS毎に使用されるファイルが有る事が確認できます。


fastboot.js
  前回に引き続き、devtools-import.js ファイルをハックしていきたいと思います。
  ご覧の通り、各OSでの差異はありません。
2014.11.06 時点では、このファイルは存在していませんでした。
モジュールは下図の通りです



モジュール構成
  上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
1 ~ 33 行目
  • コメント
    fastboot utility をラッパーしたものです。
  • コメント
    アドン SDK 使って、アドオンをビルドした。)
    CommonJS モジュールとしてロードされているかどうかにかかわらず
    CommonJS モジュールない時、これはJavaScriptモジュールである。
  • Cc, Ci, Cu, Cr にchrome ライブラリ読み込み
  • subprocess にライブラリ読み込み
  • file にライブラリ読み込み
  • XPCOMABI にライブラリ読み込み
  • setTimeout にライブラリ読み込み
  • client を用いて、adb-client.js を読み込み
  • Cu に Services.jsm をインポート
  • 変数 promise に Promise.jsm を代入
  • 変数:promise を定義
  • 変数:promise に Promise オブジェクトを代入
  • Devices に Devices.jsm 読み込み
  • 変数:fastbootTimer を定義
  • 変数:fastbootDevices を定義
35 ~ 265 行目
Fastboot オブジェクト
  • fastbootDevices() プロパティ
  • fastboot_init() 関数
  • fastboot_do() 関数
  • fastboot_startPolling() 関数
  • fastboot_stopPolling() 関数
  • fastboot_devices() 関数
  • fastboot_getvar() 関数
  • fastboot_flash() 関数
  • fastboot_reboot() 関数
267 ~ 285 行目
  • Fastboot.init() 関数を実行します。
  • FastbootDevice() 関数
    バイス ID を格納します。
  • FastbootDevice オブジェクト
  Fastboot オブジェクトが、かなりのボリュームなので、下表にまとめました。
関数名
処理概要
fastbootDevices() プロパティ
  • get プロパティ 変数:fastbootDevicesに格納します。
  • set プロパティ 変数:fastbootDevicesにセットします。
fastboot_init() 関数
  • platform に Services.appinfo.OS を代入
  • uri に resource://adbhelperatmozilla.org/ 代入
  • platform の条件分岐(OS 毎)
  • 上記結果を元に Services.io.newURI 用いて url を取得
  • 各判定ごとにログを出力します。
fastboot_do() 関数
  • Deferred オブジェクト deferred を promise.defer() 用いて生成
  • 配列変数:out_buffer,err_buffer を定義
  • 変数:serial が string の場合、配列にを変数:serial 追加します。
  • 変数:binary に this._fastboot を代入します。
  • callPayload オブジェクト
    • command オブジェクトに変数:binary を代入
    • arguments オブジェクトに引数:args を代入
    • stdout() 関数 配列変数:out_buffer に
      引数:data を追加します。
    • stderr() 関数 配列変数:err_buffer に
      引数:data を追加します。
    • deferred.resolve() 関数 を実行します。
  • subprocess.call() 関数 を実行します。
  • deferred を返します。
fastboot_startPolling() 関数
  • 変数:fastbootTimer != null の場合、処理をスルーします。
  • doPoll オブジェクト
    • devices() 関数 を実行します。
    • 配列変数:added,removed を定義
    • devices.sort() 関数とthis.fastbootDevices.sort() 関数の
      実行結果が同じの場合、処理をスルーします。
    • this.fastbootDevices.indexOf が -1 の場合
      配列変数:added にプッシュします。
    • devices.indexOf が -1 の場合
      配列変数:removed にプッシュします。
    • this.fastbootDevices オブジェクトに devices を
      オブジェクト代入
    • 配列変数:added 分繰り返します。
      バイス情報を登録します。
    • 配列変数:removed 分繰り返します。
      バイス情報を登録解除します。
  • 変数:fastbootTimer に 2 秒間隔で、タイマー用
    doPoll オブジェクトを登録します。
fastboot_stopPolling() 関数
  • 変数:fastbootTimer を初期化します。
fastboot_devices() 関数
  • do() 関数 を実行します。
  • doPoll オブジェクト
    • 処理実行が成功の場合
      変数:devices にプッシュします。
      変数:devices を返します。
    • 処理実行が失敗の場合
      空の配列変数を返します。
fastboot_getvar() 関数
  • do() 関数 を実行します。
  • 処理実行が成功の場合
    • 変数:line に加工し、格納します。
    • 変数:line.indexOf != -1 の場合、変数:line を返します。
  • 処理実行が失敗の場合、空文字を返します。
fastboot_flash() 関数
  • do() 関数 を実行します。
  • 処理実行が成功の場合
    • flashProgress オブジェクトを定義
    • 変数:first を定義
    • 変数:first 結果毎に条件分岐
    • flashProgress オブジェクトを返します。
  • 処理実行が失敗の場合、空文字を返します。
fastboot_reboot() 関数
  • do() 関数 を実行します。
  FastbootDevice オブジェクトを下表にまとめました。
関数名
処理概要
type() プロパティ
"fastboot" 代入
devices() 関数
Fastboot.devices() 関数にバインド
flash() 関数
Fastboot.flash() 関数にバインド
getvar() 関数
Fastboot.getvar() 関数にバインド
reboot() 関数
Fastboot.reboot() 関数にバインド
startPolling() 関数
Fastboot.startPolling() 関数にバインド
stopPolling() 関数
Fastboot.stopPolling() 関数にバインド


今回のまとめ
  今回は、モジュールの初回起動時の動作をハックしました。 次回は、ADB Helper のまとめをする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar

新訳:ADB Helperをハックしてみた(devtools-require.js )

この記事は『Firefox OS / B2G OS Advent Calendar 2016』 23日目の記事です。
Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。

目次

 

前回、新訳:ADB Helperをハックしてみた(devtools-import.js)に引き続き、 adb-helperをハックしていきたいと思います

  1. フォルダ内のファイル構成
  2. devtools-require.js
  3. 予備知識
  4. モジュール構成
  5. 今回のまとめ
  6. 関連記事
  7. 今年のAdvent Calendar
フォルダ内のファイル構成
  [ 解凍フォルダ内のjsファイル群 ]
install.rdf
main.js
adb.js
adb-client.js
adb-running-checker.js
adb-socket.js
bootstrap.js
scanner.js
device.js
※1
※1
※1
devtools-import.js
※1
※1
※1
devtools-require.js
※1
※1
※1
fastboot.js
※1
※1
※1
subprocess.js
※2
※2
※2
subprocess_worker_win.js
※3
※3
※3
subprocess_worker_unix.js
※4
※4
※4
  ※1 : version 0.7.1 時点では無かったファイル
※2 : version 0.7.1 時点で有ったファイル
※3 : version 0.7.1 時点で有ったファイル、Windows用ファイル
※4 : version 0.7.1 時点で有ったファイル、maclinux用ファイル

OS毎に使用されるファイルが有る事が確認できます。


devtools-require.js
  前回に引き続き、devtools-import.js ファイルをハックしていきたいと思います。
  ご覧の通り、各OSでの差異はありません。
2014.11.06 時点では、このファイルは存在していませんでした。 モジュールは下図の通りです


予備知識
  DevTools/Hacking https://wiki.mozilla.org/DevTools/Hacking


モジュール構成
  上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
1 ~ 29 行目
  • 定数:devtools に devtools-import.js を用いて、
    DevTools ライブラリ読み込み
  • コメント
    Firefox 44 以降のバージョンは、再構成されています。
    以下を参照してください
    https://bugzil.la/912121
  • devtools 用配列変数:ID_RENAMES を定義します。
37 ~ 55 行目
devtoolsRequire() 関数
  • devtools.require() 関数を実行し、結果を返します。
  • 例外発生時は以下の処理を行います。
    • コメント
      Firefox 43 以前のバージョンは、リネームされています。
    • ID_RENAMES の配列分繰り返します。
    • リネームします。
    • devtools.require() 関数を実行し。結果を返します。


今回のまとめ
  今回は、devtools-require モジュールをインポートした時の処理をハックしました。 次回は、fastboot.js をハックする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar

新訳:ADB Helperをハックしてみた(devtools-import.js )

            この記事は<a href="http://www.adventar.org/calendars/1722" target="_blank">『Firefox OS / B2G OS Advent Calendar 2016』</a> 22日目の記事です。

Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。

目次

 

前回、新訳:ADB Helperをハックしてみた(device.js)に引き続き、 adb-helperをハックしていきたいと思います

  1. フォルダ内のファイル構成
  2. devtools-import.js
  3. 予備知識
  4. モジュール構成
  5. 今回のまとめ
  6. 関連記事
  7. 今年のAdvent Calendar
フォルダ内のファイル構成
  [ 解凍フォルダ内のjsファイル群 ]
install.rdf
main.js
adb.js
adb-client.js
adb-running-checker.js
adb-socket.js
bootstrap.js
scanner.js
device.js
※1
※1
※1
devtools-import.js
※1
※1
※1
devtools-require.js
※1
※1
※1
fastboot.js
※1
※1
※1
subprocess.js
※2
※2
※2
subprocess_worker_win.js
※3
※3
※3
subprocess_worker_unix.js
※4
※4
※4
  ※1 : version 0.7.1 時点では無かったファイル ※2 : version 0.7.1 時点で有ったファイル ※3 : version 0.7.1 時点で有ったファイル、Windows用ファイル ※4 : version 0.7.1 時点で有ったファイル、maclinux用ファイル OS毎に使用されるファイルが有る事が確認できます。


devtools-import.js
  前回に引き続き、devtools-import.js ファイルをハックしていきたいと思います。   ご覧の通り、各OSでの差異はありません。 2014.11.06 時点では、このファイルは存在していませんでした。 モジュールは下図の通りです


予備知識
  Components.utils.import https://developer.mozilla.org/ja/docs/Components.utils.import


モジュール構成
  上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
1 ~ 29 行目
  • Cu にchrome ライブラリ読み込み
  • コメント
    Firefox 44 以降のバージョンは、再構成されています。
    以下を参照してください
    https://bugzil.la/912121
  • devtools 用配列変数:PATH_RENAMES を定義します。
30 ~ 35 行目
scopedImport() 関数
  • パス格納用変数:scope を定義します。
  • パス格納用変数:scope を用いてコンポーネントをインポートします。
  • パス格納用変数:scope を返します。
37 ~ 55 行目
devtoolsImport() 関数
  • scopedImport() 関数を実行します。
  • 例外発生時は以下の処理を行います。
    • コメント
      Firefox 43 以前のバージョンは、リネームされています。
    • PATH_RENAMES の配列分繰り返します。
    • 引数:path と一致しない場合、処理を継続します。
    • 上記以外場合、リネームし、scopedImport() 関数を実行します。


今回のまとめ
  今回は、devtools モジュールをインポートした時の処理をハックしました。 次回は、devtools-require.js をハックする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar

新訳:ADB Helperをハックしてみた(device.js)

この記事は『Firefox OS / B2G OS Advent Calendar 2016』 19日目の記事です。
Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。

目次

 

前回、新訳:ADB Helperをハックしてみた(scanner.js)に引き続き、 adb-helperをハックしていきたいと思います

  1. フォルダ内のファイル構成
  2. device.js
  3. 予備知識
  4. モジュール構成
  5. 今回のまとめ
  6. 関連記事
  7. 今年のAdvent Calendar
フォルダ内のファイル構成
  [ 解凍フォルダ内のjsファイル群 ]
install.rdf
main.js
adb.js
adb-client.js
adb-running-checker.js
adb-socket.js
bootstrap.js
scanner.js
device.js
※1
※1
※1
devtools-import.js
※1
※1
※1
devtools-require.js
※1
※1
※1
fastboot.js
※1
※1
※1
subprocess.js
※2
※2
※2
subprocess_worker_win.js
※3
※3
※3
subprocess_worker_unix.js
※4
※4
※4
  ※1 : version 0.7.1 時点では無かったファイル
※2 : version 0.7.1 時点で有ったファイル
※3 : version 0.7.1 時点で有ったファイル、Windows用ファイル
※4 : version 0.7.1 時点で有ったファイル、maclinux用ファイル

OS毎に使用されるファイルが有る事が確認できます。


device.js
  前回に引き続き、device.js ファイルをハックしていきたいと思います。   ご覧の通り、各OSでの差異はありません。 2014.11.06 時点では、このファイルは存在していませんでした。 モジュールは下図の通りです



モジュール構成
  上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
1 ~ 9 行目
  • ConnectionManager に connection-manager 読み込み
  • 定数:adb にライブラリ、adb.js 読み込み
10 ~ 21 行目
Device() 関数
  • コメント
    新しいデバイスが接続された通知を受けた時
    新しいデバイス用のインスタンスが生成されます。
    何か変化があった時、互換性を試すべきです。
    新しいデバイス用のインスタンスが生成されます。
    他のアドオン,ツールアダプターのようにこれらの
    これらの Low レベルデバイスオブジェクトに使用されます。
  • バイス ID を格納します。
23 ~ 73 行目
Device オブジェクト
  • コメント
    これがFirefox OS を接続する具体的な方法です。
    他の種類の機器を使用する場合、一般的かつ直接的に forwardPort します。
  • connect() 関数
  • shell() 関数
  • forwardPort() 関数
  • push() 関数
  • pull() 関数
  • reboot() 関数
  • rebootRecovery() 関数
  • rebootBootloader() 関数
  • isRoot() 関数
  • summonRoot() 関数
  • getModel() 関数
  Device オブジェクトが、かなりのボリュームなので、下表にまとめました。
関数名
処理概要
connect() 関数
  • getFreeTCPPort() 関数で、変数:port に代入します。
  • 上記変数を用いて、ローカル用変数を定義します。
  • デバッグ用変数:remote を
    localfilesystem:/data/local/debugger-socket を用いて定義します。
  • adb.js の forwardPort() 関数 に上記変数を割り当てて実行します。
shell() 関数
  • adb.js の shell() 関数 をバインドします。
forwardPort() 関数
  • adb.js の forwardPort() 関数 をバインドします。
push() 関数
  • adb.js の push() 関数 をバインドします。
pull() 関数
  • adb.js の pull() 関数 をバインドします。
reboot() 関数
  • adb.js の reboot() 関数 をバインドします。
rebootRecovery() 関数
  • adb.js の rebootRecovery() 関数 をバインドします。
rebootRecovery() 関数
  • adb.js の rebootRecovery() 関数 をバインドします。
rebootBootloader() 関数
  • adb.js の rebootBootloader() 関数 をバインドします。
isRoot() 関数
  • adb.js の shell() 関数 を実行します。
  • 実行結果:stdout = true の時は、0 を返します
  • 上記以外の時は、 false を返します。
summonRoot() 関数
  • adb.js の root() 関数 を実行します。
getModel() 関数
  • 該当モデル同期処理:_modelPromise = true の時は、
    _modelPromise を返します
  • 上記以外の時は、 adb シェル getprop 関数を実行し、
    _modelPromise を返します。


今回のまとめ
  今回は、デバイスをスキャン,検出した時のモジュールをハックしました。 次回は、devtools-import.js をハックする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar

新訳:ADB Helperをハックしてみた(scanner.js)

この記事は『Firefox OS / B2G OS Advent Calendar 2016』 18日目の記事です。
Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。

目次

 

前回、新訳:ADB Helperをハックしてみた(bootstrap.js)に引き続き、 adb-helperをハックしていきたいと思います

  1. フォルダ内のファイル構成
  2. scanner.js
  3. 予備知識
  4. モジュール構成
  5. 今回のまとめ
  6. 関連記事
  7. 今年のAdvent Calendar
フォルダ内のファイル構成
  [ 解凍フォルダ内のjsファイル群 ]
install.rdf
main.js
adb.js
adb-client.js
adb-running-checker.js
adb-socket.js
bootstrap.js
scanner.js
device.js
※1
※1
※1
devtools-import.js
※1
※1
※1
devtools-require.js
※1
※1
※1
fastboot.js
※1
※1
※1
subprocess.js
※2
※2
※2
subprocess_worker_win.js
※3
※3
※3
subprocess_worker_unix.js
※4
※4
※4
  ※1 : version 0.7.1 時点では無かったファイル
※2 : version 0.7.1 時点で有ったファイル
※3 : version 0.7.1 時点で有ったファイル、Windows用ファイル
※4 : version 0.7.1 時点で有ったファイル、maclinux用ファイル

OS毎に使用されるファイルが有る事が確認できます。


scanner.js
  前回に引き続き、scanner.js ファイルをハックしていきたいと思います。   ご覧の通り、各OSでの差異はありません。 2014.11.06 時点から、かなりバージョンアップしているのが分かります。 モジュールは下図の通りです



モジュール構成
  上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
1 ~ 22 行目
  • Cu にchrome ライブラリ読み込み
  • EventEmitter に event-emitter 読み込み
  • Task に Task.jsm 読み込み
  • unload 時、system/unload 読み込み
  • ConnectionManager に connection-manager 読み込み
  • Devices に Devices.jsm 読み込み
  • Runtimes に WebIDE の runtime モジュール読み込み
  • 変数:promise を定義
  • 変数:promise に Promise オブジェクトを代入
23 ~ 82 行目
Scanner オブジェクト
  • enable() 関数
  • disable() 関数
  • _emitUpdated() 関数
  • _updateRuntimes() 関数
  • _detectRuntimes() 関数
  • scan() 関数
  • listRuntimes() 関数
84 ~ 90 行目
  • Scanner オブジェクト を decorate 関数に渡します
  • Runtime() オブジェクト
  • FirefoxOSRuntime オブジェクト
  • FirefoxOnAndroidRuntime() オブジェクト
  Scanner オブジェクトが、かなりのボリュームなので、下表にまとめました。
関数名
処理概要
enable() 関数
  • _updateRuntimes オブジェクトに bind します。
  • _updateRuntimes オブジェクト、引数:register で、
    Devices.on() 関数実行します。
  • _updateRuntimes オブジェクト、引数:unregister で、
    Devices.on() 関数実行します。
  • _updateRuntimes オブジェクト、引数:addon-status-updated で、
    Devices.on() 関数実行します。
  • _updateRuntimes()関数を実行します。
disable() 関数
  • _updateRuntimes オブジェクトに bind します。
  • _updateRuntimes オブジェクト、引数:register で、
    Devices.off() 関数実行します。
  • _updateRuntimes オブジェクト、引数:unregister で、
    Devices.off() 関数実行します。
  • _updateRuntimes オブジェクト、引数:addon-status-updated で、
    Devices.off() 関数実行します。
_emitUpdated() 関数
  • 引数:runtime-list-updated で、emit() 関数実行します。
_updateRuntimes() 関数
  • _updatingPromise オブジェクトが存在する時は、
    其のオブジェクトを返します
  • 変数:device に取得したデバイス情報をセットします。
  • 配列変数:promises に _detectRuntimes(device) の
    結果を push します。
  • _updatingPromise オブジェクトに promise.all(promises) の
    結果を push します。
  • _updatingPromise オブジェクトの then() 関数で、
    _emitUpdated()関数を実行します
  • _updatingPromise オブジェクトを初期化します。
_detectRuntimes() 関数
  • 変数:model にデバイス情報を取得します。
  • 変数:detectedRuntimes に FirefoxOSRuntime.detect
    オブジェクトを委任します。
  • _runtimes オブジェクトに detectedRuntimes を push します。
  • 変数:detectedRuntimes に FirefoxOnAndroidRuntime.detect
    オブジェクトを委任します。
  • _runtimes オブジェクトに detectedRuntimes を push します。
scan() 関数
  • _updateRuntimes オブジェクトを返します。
listRuntimes() 関数
  • _runtimesオブジェクトを返します。
  Runtime オブジェクトを下表にまとめました。
関数名
処理概要
Runtime() 関数
  • 引数:device をプロパティにセットします。
  • 引数:model をプロパティにセットします。
  • 引数:socketPath をプロパティにセットします。
connect() 関数
  • 変数:port に空いている TCP ポート情報を取得します。
  • 変数;local を定義します。
  • 変数:remote にソケットのパス情報をセットします。
  • device オブジェクトの forwardPort()関数を実行し、
    バイスの接続情報をセットします
id プロパティ
  • バイス ID とソケットパスを連結して返します。
  FirefoxOSRuntime オブジェクトを下表にまとめました。
関数名
処理概要
FirefoxOSRuntime() 関数
  • 引数を用いて、Runtime.call()関数を実行します。
FirefoxOSRuntime.detect
オブジェクト
  • Task.async()関数 実行し、同期が取れた結果格納します。
  • 引数に以下の無名関数を実行します。
    • 配列変数:runtimes を定義します。
    • クエリー実行用変数:query を定義します
    • 変数:b2gExists にクエリーの実行結果を取得します。
    • クエリーの実行結果をチェックします。
    • b2gExists === "0\r\n" の場合、以下の処理を実行します。
    • 新しいインスタンスで、FirefoxOSRuntime()を実行します。
    • 配列変数:runtimes 実行結果を push します。
  • 配列変数:runtimes を返します。
FirefoxOSRuntime.prototype
オブジェクト
  • FirefoxOSRuntime.prototype を渡して実行します
  FirefoxOnAndroidRuntime オブジェクトを下表にまとめました。
関数名
処理概要
FirefoxOnAndroidRuntime() 関数
  • 引数を用いて、Runtime.call()関数を実行します。
FirefoxOnAndroidRuntime.detect
オブジェクト
  • Task.async()関数 実行し、同期が取れた結果格納します。
  • 引数に以下の無名関数を実行します。
    • 配列変数:runtimes を定義します。
    • クエリー実行用変数:query を定義します
    • 変数:rawSocketInfo にクエリーの実行結果を取得します。
    • 変数:rawSocketInfo を用いて、変数:socketInfos にソケット情報を格納します。
    • 変数:socketInfos にフィルターを実行します。
    • 変数:socketPaths にソケット情報を追加していきます。
    • 変数:socketPaths 分 FirefoxOnAndroidRuntime()関数を実行します。
    • 配列変数:runtimes に実行結果を push します。
  • 配列変数:runtimes を返します。
FirefoxOnAndroidRuntime.prototype
オブジェクト
  • FirefoxOnAndroidRuntime.prototype を渡して実行します


今回のまとめ
  今回は、デバイスをスキャン,検出した時のモジュールをハックしました。 次回は、device.js をハックする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar

新訳:ADB Helperをハックしてみた(bootstrap.js)

この記事は『Firefox OS / B2G OS Advent Calendar 2016』 17日目の記事です。
Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。

目次

 

前回、新訳:ADB Helperをハックしてみた(adb-socket.js)に引き続き、 adb-helperをハックしていきたいと思います

  1. フォルダ内のファイル構成
  2. bootstrap.js
  3. 予備知識
  4. モジュール構成
  5. 今回のまとめ
  6. 関連記事
  7. 今年のAdvent Calendar
フォルダ内のファイル構成
  [ 解凍フォルダ内のjsファイル群 ]
install.rdf
main.js
adb.js
adb-client.js
adb-running-checker.js
adb-socket.js
bootstrap.js
scanner.js
device.js
※1
※1
※1
devtools-import.js
※1
※1
※1
devtools-require.js
※1
※1
※1
fastboot.js
※1
※1
※1
subprocess.js
※2
※2
※2
subprocess_worker_win.js
※3
※3
※3
subprocess_worker_unix.js
※4
※4
※4
  ※1 : version 0.7.1 時点では無かったファイル
※2 : version 0.7.1 時点で有ったファイル
※3 : version 0.7.1 時点で有ったファイル、Windows用ファイル
※4 : version 0.7.1 時点で有ったファイル、maclinux用ファイル

OS毎に使用されるファイルが有る事が確認できます。


bootstrap.js
  前回に引き続き、bootstrap.js ファイルをハックしていきたいと思います。   ご覧の通り、各OSでの差異はありません。

2014.11.06 時点から、かなりバージョンアップしているのが分かります。

モジュールは下図の通りです


予備知識
  ブートストラップ型拡張機能 - 拡張機能 | MDN
https://developer.mozilla.org/ja/docs/Extensions/Bootstrapped_extensions
bootstrap.js
http://mdn.beonex.com/en/Extensions/bootstrap.js.html
Components.interfaces
概要:プロパティがそれらの名前によって索引付けされたクラスである、読み出し専用オブジェクトです。
https://developer.mozilla.org/ja/docs/Components.interfaces
Components.utils
概要:便利でありながらも必須というわけではない、さまざまな XPConnect の機能のまとまりです。
そのインタフェースは js/src/xpconnect/idl/xpccomponents.idl で定義されています。
https://developer.mozilla.org/ja/docs/Components.utils
Preferences 概要:Mozilla 設定システムを利用しようとする拡張機能開発者向けのサンプルを示しています。
https://developer.mozilla.org/ja/docs/Code_snippets/Preferences


モジュール構成
  上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
1 ~ 8 行目
  • Ci に Components.interfaces ライブラリ読み込み
  • Cu に Components.utils ライブラリ読み込み
  • Cu に Services.jsm をインポート
  • 定数:REASON を定義
    ['unknown', 'startup', 'shutdown', 'enable', 'disable', 'install', 'uninstall', 'upgrade', 'downgrade']
9 ~ 23 行目
registerAddonResourceHandler() 関数
  • 変数:file にパスを格納します。
  • 変数:fileuri file.isDirectory() を用いて、
    uri 情報を取得します。
  • encodeURIComponent() 関数を用いて、
    リソース名を格納します。
  • getProtocolHandler() 関数を用いて、
    リソース名をセットします。
  • リソース情報を返します。
9 ~ 23 行目
  • 変数:mainModule 定義
  • 変数:loader 定義
  • 変数:unload 定義
  • install() 関数
31 ~ 110 行目
startup オブジェクト
  • 変数:loaderModule を定義
  • 変数:unload を定義
  • 変数:loaderOptions を定義
  • 定数:LOGPREF を定義
  • 定数:LOGPREFIX を定義
  • canLog() 関数
  • 変数:ConsoleAPI を定義
  • 変数:consolePaths を定義
  • ConsoleAPI()インスタンス:_console を定義
  • 変数:loaderOptions.globals を定義
    • log() 関数を定義します。
    • warn() 関数を定義します。
    • error() 関数を定義します。
    • exception() 関数を定義します。
    • debug() 関数を定義します。
  • Loader() 関数に上記 loaderOptions を代入し、
    モジュールをロードします。
  • Require() 関数に引数:loader, { id: "./addon" } を
    代入し、変数:require_ を定義します。
  • 変数:mainModule にrequire_ を代入します。
112 ~ 121 行目
shutdown 関数
  • 引数:reasonCode を用いて、変数:reason に代入します。
  • 変数:loader = true の場合、unload() 関数を実行します。
  • mainModule = true かつ mainModule.shutdown = true の時
    mainModule.shutdown() 関数を実行します。
122 行目以降
  • uninstall() 関数


今回のまとめ
  今回のモジュールは、 アドオンのブート時の挙動をハックしました。 次回は、scanner.js をハックする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar