この記事は『Firefox OS / B2G OS Advent Calendar 2016』 24日目の記事です。
Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。
目次
前回、新訳:ADB Helperをハックしてみた(devtools-require.js)に引き続き、
adb-helperをハックしていきたいと思います
フォルダ内のファイル構成
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
※2 : version 0.7.1 時点で有ったファイル
※3 : version 0.7.1 時点で有ったファイル、Windows用ファイル
※4 : version 0.7.1 時点で有ったファイル、mac,linux用ファイル
OS毎に使用されるファイルが有る事が確認できます。
fastboot.js
前回に引き続き、devtools-import.js ファイルをハックしていきたいと思います。ご覧の通り、各OSでの差異はありません。
2014.11.06 時点では、このファイルは存在していませんでした。
モジュールは下図の通りです
予備知識
system/child_process
https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/system_child_process
system/runtime https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/system_runtime
remote/parent https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/remote_parent
timers https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/timers
Services.jsm https://developer.mozilla.org/ja/docs/Mozilla/JavaScript_code_modules/Services.jsm
Promise.jsm https://developer.mozilla.org/ja/docs/Mozilla/JavaScript_code_modules/Promise.jsm
Array.prototype.unshift() https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift deferred.resolve() https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred#resolve()
モジュール構成
上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
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 オブジェクト
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 オブジェクト
関数名
処理概要
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() 関数 を実行します。
今回のまとめ
今回は、モジュールの初回起動時の動作をハックしました。
次回は、ADB Helper のまとめをする予定です。
関連記事
- 新訳:ADB Helperをハックしてみた(前篇)
- 新訳:ADB Helperをハックしてみた(install.rdf,main.js)
- 新訳:ADB Helperをハックしてみた(adb.js)
- 新訳:ADB Helperをハックしてみた(adb-client.js)
- 新訳:ADB Helperをハックしてみた(adb-running-checker.js)
- 新訳:ADB Helperをハックしてみた(adb-socket.js)
- 新訳:ADB Helperをハックしてみた(bootstrap.js)
- 新訳:ADB Helperをハックしてみた(scanner.js)
- 新訳:ADB Helperをハックしてみた(device.js)
- 新訳:ADB Helperをハックしてみた(devtools-import.js)
- 新訳:ADB Helperをハックしてみた(devtools-require.js)
今年のAdvent Calendar
去年のAdvent Calendar