この記事は『Firefox OS / B2G OS Advent Calendar 2016』 12日目の記事です。
Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。
目次
前回、新訳:ADB Helperをハックしてみた(install.rdf,main.js)に引き続き、
adb-helperをハックしていきたいと思います
- フォルダ内のファイル構成
- adb.js
- 予備知識
- モジュール構成
- 今回のまとめ
- 関連記事
- 今年のAdvent Calendar
フォルダ内のファイル構成
[ 解凍フォルダ内のjsファイル群 ]
adb-running-checker.js
○
○
○
devtools-import.js
※1
※1
※1
devtools-require.js
※1
※1
※1
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 時点で有ったファイル、
mac,
linux用ファイル
OS毎に使用されるファイルが有る事が確認できます。
adb.js
前回に引き続き、adb.jsファイルからハックしていきたいと思います。
ご覧の通り、各OSでの差異はありません。
2014.11.06 時点から、かなりバージョンアップしているのが分かります。
モジュールは結構ありますね・・・・(^^;;;
モジュール構成
上記予備知識をもとにハックしていきます!
50 行目以降
ADB オブジェクト
- didRunInitially() プロパティ
- ready() プロパティ
- adb_init() 関数
- adb_start() 関数
- stop() 関数
- adb_kill() 関数
- _isAdbRunning() 関数
- adb_trackDevices() 関数
- adb_listDevices() 関数
- adb_forwardPort() 関数
- adb_checkFileMode() 関数
- adb_pull() 関数
- adb_push() 関数
- adb_shell() 関数
- adb_reboot() 関数
- adb_rebootRecovery() 関数
- rebootBootloader() 関数
- adb_root() 関数
- adb_runCommand() 関数
ADB オブジェクトが、かなりのボリュームなので、下表にまとめました。
adb_start() 関数
- コメント
adb をサーバーモードで起動させ、tcp ソケット参照を true にする
- Deferred オブジェクト deferred を promise.defer() 用いて生成
- 通知用オブザーバ onSuccessfulStart を定義
- deferred を return
stop() 関数
- コメント
adb サーバーが動作している時だけを停止します。
起動前に使用した場合、immediately を返します。
- 引数:sync を用いて、adb サーバーを停止させます
adb_trackDevices() 関数
- コメント
デバイスの接続/切断をトレースします。
ソケットが繋がっている間、再利用できません。
- adb-client.js の connect() 呼出
- 引数:"adb-track-devices-start" で、
関数 socket.s.onopen を定義し、同期
- 引数:"adb-track-devices-stop" で、
関数 socket.s.onerror を定義し、同期
- 引数:"adb-track-devices-stop" で、
関数 socket.s.onclose を定義し、同期
- 関数 socket.s.ondata を定義し、同期
- adb-client.js の checkResponse() 呼出
- adb-client.js の unpackPacket() 呼出、変数 packet へ代入
- packet.data を判定し、events.emit() を実行
adb_checkFileMode() 関数
- コメント
ファイルのモードをチェックします。
- チェック用配列:masks を定義
- チェック用配列:masks に該当する値が無い時、false を返します。
- 上記以外の時、チェック用配列:masks に該当する値を返します
adb_pull() 関数
- コメント
デバイスからファイルを pull します。
- Deferred オブジェクト deferred を promise.defer() 用いて生成
- 各種変数を定義
- 関数 shutdown を定義します。
- 関数 extractChunkDataHeader を定義します。
- 配列変数:headerArray を初期化します
- 配列変数:headerArray に引数data を代入します。
- 関数 checkChunkDataHeader を定義します。
- データ長 + 現在のヘッダ長 > 8 バイト以上の時、
以下の処理を実行します。
- 関数 extractChunkDataHeader を実行します。
- 配列変数:headerArray[0] と定数:DATAが不一致の時、shutdown() を実行し、false を返します。
- ヘッダの長さにデータ長を加算します。
- true を返します。
- 関数 checkDone を定義します。
- データ長が 8 バイト以外の時、false を返します。
- 配列変数:doneFlagArray を Uint32Array で、定義します。
- 配列変数:doneFlagArray[0] が定数:DONE の時、
true を返します。
- 上記以外の時、false を返します。
- 関数 runFSM を定義します。
- 変数:state を判定し、状態毎の処理を実行します。
- 関数 setupSocket を定義します。
- 関数 socket.s.onerror を定義し、引数:"SOCKET_ERROR" で、deferred.reject() を実行します。
- 関数 socket.s.onopen を定義し、関数runFSM() を実行します。
- 関数 socket.s.onclose を定義します。
- 関数 socket.s.ondata を定義し、関数runFSM() を実行します。
- adb-client.js の connect() 呼出
- 関数 setupSocket() を実行します。
- deferred を return
adb_push() 関数
- コメント
ファイルをデバイスへ push します。
- Deferred オブジェクト deferred を promise.defer() 用いて生成
- 各種変数を定義
- 関数 shutdown を定義します。
- 関数 runFSM を定義します。
- 変数:state を判定し、状態毎の処理を実行します。
- 関数 setupSocket を定義します。
- 関数 socket.s.onerror を定義し、引数:"SOCKET_ERROR" で、deferred.reject() を実行します。
- 関数 socket.s.onopen を定義し、関数runFSM() を実行します。
- 関数 socket.s.onclose を定義します。
- 関数 socket.s.ondata を定義し、関数runFSM() を実行します。
- 関数 OS.File.stat() を実行します。
- deferred を return
adb_shell() 関数
- コメント
ファイルをデバイスへ push します。
- Deferred オブジェクト deferred を promise.defer() 用いて生成
- 各種変数を定義
- 関数 shutdown を定義します。
- 関数 runFSM を定義します。
- 変数:state を判定し、状態毎の処理を実行します。
- adb-client.js の connect() 呼出
- 関数 socket.s.onerror を定義し、引数:"SOCKET_ERROR" で、deferred.reject() を実行します。
- 関数 socket.s.onopen を定義し、関数runFSM() を実行します。
- 関数 socket.s.onclose を定義します。
- 関数 socket.s.ondata を定義し、関数runFSM() を実行します。
- deferred を return
adb_rebootBootloader() 関数
adb_root() 関数
- Deferred オブジェクト deferred を promise.defer() 用いて生成
- 各種変数を定義
- 関数 shutdown を定義します。
- 関数 runFSM を定義します。
- 変数:state を判定し、状態毎の処理を実行します。
- adb-client.js の connect() 呼出
- 関数 socket.s.onerror を定義し、引数:"SOCKET_ERROR" で、deferred.reject() を実行します。
- 関数 socket.s.onopen を定義し、関数runFSM() を実行します。
- 関数 socket.s.onclose を定義し、deferred.resolve() を実行します。
- 関数 socket.s.ondata を定義し、関数runFSM() を実行します。
- deferred を return
adb_runCommand() 関数
- コメント
非同期的に adb コマンドを実行します。
- Deferred オブジェクト deferred を promise.defer() 用いて生成
- プロパティ:ready = false の時、以下の処理を実行します。
- adb-client.js の connect() 呼出
- 関数 socket.s.onopen を定義し、同期します。
- adb-client.js の createRequest() 呼出
- adb コマンドを送信します。
- 関数 socket.s.onerror を定義し、deferred.reject() を実行します。
- 関数 socket.s.onclose を定義します。
- 関数 socket.s.ondata を定義し、同期
- deferred を return
今回のまとめ
今回は、ADB Helper の中でも核となるコードをハックしました。
かなり長いブログになってしまったので、ご覧になる方にどう映るか些か心配です。
初めて見る方の
ソースコード解析のお役に立てば、幸いです。
次回は、adb-client.js をハックする予定です。
今年のAdvent Calendar
去年のAdvent Calendar