らいふうっどの閑話休題

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

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

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

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

目次

 

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

  1. フォルダ内のファイル構成
  2. adb-socket.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毎に使用されるファイルが有る事が確認できます。


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


予備知識
  サンドボックス (セキュリティ)
http://is.gd/P7iDNm

JavaScript コードモジュールの利用(jsm)
JavaScript コードモジュールは、Gecko 1.9 で導入されたコンセプトであり、
特権を持った異なるスコープ間でコードを共有するために用いられます。
また、モジュールは、グローバルな JavaScript のシングルトンオブジェクトを
生成するために用いることもできます(以前は JavaScript XPCOM オブジェクトを使う必要がありました)。
JavaScript コードモジュールは、登録されたパスに配置された純粋な JavaScript のコードです。
Components.utils.import() を使って、 XUL スクリプトJavaScript XPCOM スクリプトのような
特定のJavaScript のスコープへモジュールを読み込むことができます。
https://developer.mozilla.org/ja/docs/Mozilla/JavaScript_code_modules/Using


モジュール構成
  上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
1 ~ 13 行目
  • コメント
    ADB が実行中の場合、使用しているホストバージョン検出するサービス
    オリジナルの ADB の adb-file-transfer をモディファイ
  • Cu, Cc, Ci にchrome ライブラリ読み込み
  • Class にcore/heritage ライブラリ読み込み
  • Cu にServices.jsm をインポート
14 ~ 29 行目
createTCPSocket() 関数
  • TCPSocket にServices.jsm をインポート
  • TCPSocket = true 時に引数:location, port, options を用いて、TCPSocket を返します。
  • 変数:scope に nsIPushService の getSystemPrincipal() を用いて、代入します。
  • scope.DOMError にServices.jsm を用いて、格納します。
31 行目以降
AdbSocket オブジェクト
  • コメント
    adb インスタンスへ接続するソケットを生成します。
    このインスタンスは同期し、接続成功時に通知を返します。
    Callers は、S フィールドに attach させなければならない。
  • initialize() 関数
  • _hexdump() 関数
  • send() 関数
  • close() 関数
  AdbSocket オブジェクト をハックしていきます。
関数名
処理概要
initialize() 関数
  • アドレス:"127.0.0.1", ポート;5037 を用いて
    関数:createTCPSocket を実行します。
_hexdump() 関数
  • コメント
    受信したバイトデータをコンソールへダンプします。
  • 文字コードwindows-1252 で、TextDecoder 型で定義します。
  • 配列変数:array を Uint8Array 型で定義します。
  • 配列変数:array をデコードします。
  • 配列数分格納します。
  • コンソール出力します。
send() 関数
  • _hexdump() 関数を呼び出します。
  • データ送信します。
close() 関数
  • ソケット状態が "open" 又は "connecting" の場合、
    close() 関数を呼び出します。


今回のまとめ
  今回のモジュールは、 adb のソケットの挙動をハックしました。 次回は、bootstrap.js をハックする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar

新訳:ADB Helperをハックしてみた(adb-running-checker.js)

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

目次

 

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

  1. フォルダ内のファイル構成
  2. adb-running-checker.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毎に使用されるファイルが有る事が確認できます。


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



モジュール構成
  上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
1 ~ 37 行目
  • コメント
    ADB が実行中の場合、使用しているホストバージョン検出するサービス
    オリジナルの ADB の adb-file-transfer をモディファイ
  • Cu, Cc, Ci にchrome ライブラリ読み込み
  • 変数 promise に Promise.jsm を代入
  • client を用いて、adb-client.js を読み込み
18 行目以降
check オブジェクト
  • Deferred オブジェクト deferred を promise.defer() 用いて生成
  • runFSM() 関数
  • setupSocket() 関数
 
関数名
処理概要
runFSM() 関数
  • 変数:state を判定し、状態毎の処理を実行します。
setupSocket() 関数
  • 関数 socket.s.onerror を定義し、引数:"running checker onerror" で、deferred.reject() を実行します。
  • 関数 socket.s.onopen を定義し、関数runFSM() を実行します。
  • 関数 socket.s.onclose を定義します。
  • 関数 socket.s.ondata を定義し、関数runFSM() を実行します。


今回のまとめ
  今回のモジュールは、 adb 実行時におけるチェック処理でした。 次回は、adb-socket.js をハックする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar

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

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

目次

 

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

  1. フォルダ内のファイル構成
  2. adb-client.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毎に使用されるファイルが有る事が確認できます。


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



モジュール構成
  上記予備知識をもとにハックしていきます!
関数名
処理概要
getBuffer() 関数
  • コメント
    buffer を返します。Gecko バージョンの差異がある時
  • buffer を返します。
unpackPacket() 関数
  • 関数:getBuffer() を用いて、変数:buffer を定義します。
  • buffer = 4バイトかつ aIgnoreResponse = falseの時、
    JSON データ { length: 0, data: "" } を返します。
  • 上記以外の時、以降の処理を実行します。
  • 変数:lengthView を Uint8Array で定義します。
  • 変数:decoder を TextDecoder で定義します。
  • 変数:length に decoder を parseInt して取得します。
  • 変数:text に buffer, length を用いて、Uint8Array で定義します。
  • JSON データ { length: length, data: decoder.decode(text) }; を返します。
checkResponse() 関数
  • コメント
    レスポンスをチェックします。デフォルトは、定数:OKAY
  • 関数:getBuffer() を用いて、変数:buffer を定義します。
  • 配列変数:view を buffer を用いて初期化、 Uint32Array で定義します。
  • 配列変数:view[0] = 定数:FAIL の場合、ログ出力します。
  • 配列変数:view[0] に 定数:OKAY をセットし、返します。
createRequest() 関数
  • 関数:getBuffer() を用いて、変数:buffer を定義します。
  • 引数:aCommand を 大文字変換し、変数:length へ格納します。
  • 変数:length の長さが 4 バイトになるまで、0 を付加します。
  • 変数:encoder を TextEncoder で定義します。
  • 変数:length に 引数:aCommand 付加します。
  • 上記変数をエンコードしたものを返します。
close() 関数
  • ソケットを close します。
client オブジェクト定義
  • getBuffer 関数定義
  • unpackPacket 関数定義
  • checkResponse 関数定義
  • createRequest 関数定義
  • connect 関数定義
  • close 関数定義


今回のまとめ
  adb のクライアント側を制御する為のモジュールをハックしました。
上記モジュールが adb.js などで、exports されて使用できるようになります。
次回は、adb-running-checker.js をハックする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar