らいふうっどの閑話休題

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

新訳: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