らいふうっどの閑話休題

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

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

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

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

目次

 

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

  1. フォルダ内のファイル構成
  2. adb.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.js
  前回に引き続き、adb.jsファイルからハックしていきたいと思います。   ご覧の通り、各OSでの差異はありません。 2014.11.06 時点から、かなりバージョンアップしているのが分かります。 モジュールは結構ありますね・・・・(^^;;;


予備知識
  1. Strict モード(use strict)

    ECMAScript 5 の strict モードは、JavaScript の制限された異形にオプトインする方法です。 strict モードは単なるサブセットではありません: strict モードは意図的に、通常モードとは異なる意味を持っています。 strict モードをサポートしないブラウザは、strict モードのコードについて サポートするブラウザとは異なる動作をする可能性がありますので、 strict モードに関する側面をサポートするかの機能テストを行わずに strict モードを頼らないでください。 strict モードのコードと非 strict モードのコードは共存できますので、 スクリプトを順次 strict モードにオプトインすることができます。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Strict_mode

  2. let 文

    let 文は変数に対するローカルスコープを提供します。 let 文はコードのある 1 つのブロックのレキシカルスコープに 0 以上の変数を 結びつけることによって働き、それ以外はブロック文と全く同じです。 特に、let 文の内側で var を使って定義された変数のスコープは、 let 文の外側でそれが定義された場合と同じであり、 そのような変数は従来通り関数スコープを持つことに注意してください。 https://developer.mozilla.org/ja/docs/Web/JavaScript/New_in_JavaScript/1.7#let_.E6.96.87

  3. module

    module 現在のモジュールへの参照です。 特に module.exports は exports オブジェクトと同じです。 より詳しくは src/node.js を参照してください。 module は実際はグローバルではなく、各モジュール毎のローカルです。 http://d.hatena.ne.jp/jovi0608/20111226/1324879536

  4. 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

  5. subprocess

    subprocess subprocess.jsm - start a process in your Firefox Extension and read/write data to/from it using stdin/stdout/stderr streams. https://github.com/bit/subprocess


モジュール構成
  上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
1 ~ 37 行目
  • Cc, Ci, Cu, Cr にchrome ライブラリ読み込み
  • subprocess にライブラリ読み込み
  • file にライブラリ読み込み
  • env にライブラリ読み込み
  • XPCOMABI にライブラリ読み込み
  • setTimeout にライブラリ読み込み
  • client を用いて、adb-client.js を読み込み
  • Cu, TextEncoder, TextDecoder に Services.jsm をインポート
  • 変数 promise に Promise.jsm を代入
  • Cu に OS.File for the main thread をインポート
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_init() 関数
adb_start() 関数
stop() 関数
  • コメント
    adb サーバーが動作している時だけを停止します。
    起動前に使用した場合、immediately を返します。
  • 引数:sync を用いて、adb サーバーを停止させます
adb_kill() 関数
_isAdbRunning() 関数
  • platform に Services.appinfo.OS を代入
  • Deferred オブジェクト deferred を promise.defer() 用いて生成
  • platform 判定
    • WINNT の時、変数 ps に "C:\\windows\\system32\\tasklist.exe" をセット
    • 上記以外 の時、file.exists() を使用して 変数 ps に値をセット
  • 変数 ps を用いて、サブプロセス subprocess 呼出
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_listDevices() 関数
  • コメント
    バイス名の配列を返します。
  • runCommand を実行し、データ取得成功時に
    バイス名を配列に格納します。
adb_forwardPort() 関数
  • runCommand を実行し、データ取得成功時に
    データを返します。
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.reject() を実行します。
    • 取得情報がファイルの場合、 ファイル情報を格納します。
    • ファイル情報取得失敗時、deferred.reject() を実行します。
  • 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_reboot() 関数
  • shell() を実行します。
adb_rebootRecovery() 関数
  • shell() を実行します。
adb_rebootBootloader() 関数
  • shell() を実行します。
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 の時、以下の処理を実行します。
    • 関数:setTimeout を用いて、deferred.reject() を実行します。
    • deferred を return
  • adb-client.js の connect() 呼出
  • 関数 socket.s.onopen を定義し、同期します。
    • adb-client.js の createRequest() 呼出
    • adb コマンドを送信します。
  • 関数 socket.s.onerror を定義し、deferred.reject() を実行します。
  • 関数 socket.s.onclose を定義します。
  • 関数 socket.s.ondata を定義し、同期
    • adb-client.js の unpackPacket() 呼出
    • adb-client.js の unpackPacket() 呼出、変数 packet へ代入
    • packet.data を判定し、deferred.reject() を実行します。
    • deferred.resolve() を実行します。
  • deferred を return


今回のまとめ
  今回は、ADB Helper の中でも核となるコードをハックしました。
かなり長いブログになってしまったので、ご覧になる方にどう映るか些か心配です。
初めて見る方のソースコード解析のお役に立てば、幸いです。

次回は、adb-client.js をハックする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar

新訳:ADB Helperをハックしてみた(install.rdf,main.js)

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

目次

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

  1. フォルダ内のファイル構成
  2. install.rdf
  3. main.js
  4. 今回のまとめ
  5. 関連記事
  6. 今年の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毎に使用されるファイルが有る事が確認できます。


install.rdf
  ※rdfファイル Resource Description Framework (リソース・ディスクリプション・フレームワークRDF) とは、 ウェブ上にある「リソース」を記述するための統一された枠組 weblioより抜粋 ご覧の通り、中身はXMLファイルでした。 並びはWindos,macLinuxの順番です。 各OSとの差異は無いか比較してみると・・・・・。 トピックは、versionタグとupdateURLタグです。 updateURLタグは、ご覧の通り各OSのURLへ繋がるようになっていますね。 2014.11.06 時点から、かなりバージョンアップしているのが分かります。


main.js
  次は、main.jsを見たいと思います。 2014.11.06 時点から、かなりバージョンアップしているのが分かります。 こちらは、ご覧の通り、各OSでの差異はありません。 関数がどの程度有るか調べると・・・・・・・ 拡大すると下記画像になります。  
関数名
処理概要
ファイル先頭部
  • defineLazyGetter 定義
  • events 定義
  • system 定義
  • Devices 定義
  • gDevToolsBrowser 定義
  • defineLazyGetter を用いて、adb.js 取得
  • defineLazyGetter を用いて、fastboot.js 取得
  • defineLazyGetter を用いて、device.js 取得
onADBStart()
  • devtools/client/webide/modules 内の runtimes を読み込み
  • runtimes のインスタンス Runtimes が存在する時
    • scanner.js を読み込み
    • scanner.js を登録
  • adb.js が開始された時、trackDevices() 実行
onADBStop()
adb.js を停止します。
onFastbootStart()
fastboot.js の startPolling() を実行
onFastbootStop()
fastboot.js の stopPolling() を実行
onConnected(deviceId)
Device のインスタンス device を引数 deviceId 用いて登録
onDisconnected(deviceId)
Device のインスタンス device を引数 deviceId 用いて登録解除
  アドオンの main.js コードは、アドオンが読み込まれるとすぐに実行されます。 ※ADD-ON SDKより抜粋
参考リンク
  • アドオンのロードとアンロードのリッスン https://dev.mozilla.jp/addon-sdk-docs/dev-guide/tutorials/load-and-unload.html
  • Lifecycle - Add-on SDK (Jetpack SDK) - あすかぜ・ねっと http://www.asukaze.net/etc/jetpack/105.html
  • Device.jsm

  • 今回のまとめ
      数年ぶりに同じアドオン/ xpi ファイルをハックしてみると ソースの読み方やバージョンアップによる改変の度合いが良くわかります
    コードの見え方も変わっているのを感じます。
    引き続きハックしていきたいと思います。


    関連記事


    今年のAdvent Calendar


    去年のAdvent Calendar

    CHIRIMENボード用B2Gをビルドします。

    この記事は『CHRIMEN Open Hardware Advent Calendar 2016』 8日目の記事です。 CHIRIMEN ボード「Echigo Rev.1」のB2G のビルド作業をまとめてみました。

    実施環境
      今回のビルドマシンのスペックは下記の通り。 上記マシンにViruaboxにゲスト OS : Ubuntu 14.04 LTS を構築しました。 Ubuntu 上に何故わざわざ仮想環境の Ubuntu を?と云う疑問は後程説明します。


    事前準備
      自分の PC の環境は、手前味噌で恐縮ですが下記リポジトリにまとめました。 gurezo/ubuntu_setup_dev ホストOS : Ubuntu 16.10 64bit は、上記手順で構築しています。
    ゲストOS : Ubuntu 14.04 LTS 64bit の環境に関する情報は、下記の通りです。
    ここでポイントなのが仮想環境のディスク容量を 80GB にする事です。
    ビルドの際にハードディスク空き領域が、最低 40GB とありますが、実際にやってみて 80GB で、無事にビルドが終了しました。
    ゲストOS : Ubuntu 14.04 LTS 64bit は、B2G OS ビルドの必要条件 の手順で構築しています。 上記手順に加え、下記手順を行っています。
    ubuntu_setup_dev/setup-adb.md この手順は、CHIRIMEN ボード「Echigo Rev.1」を OS に認識させる為の手順です。

    このバージョンにした理由は、個人的に環境構築での手間が少ない事や 確実性が一番高いと考えたからです。


    ビルド
      CHIRIMEN 用 B2G をクローンします。
      
        $ git clone https://github.com/chirimen-oh/B2G.git
      
    
    B2G へ移動し、"config.sh デバイス名" を実行します。
      
        $ cd ~/B2G
        $ ./config.sh chirimen
      
    
    ここからPCの環境にもよりますが、かなりの時間を要します。
    参考値で、この PC では、4時間38分かかりました。
    config.sh が終了し、いよいよビルドを行います。
    "build.sh" を実行します。
      
        $ ./build.sh -j1
        ビルドオプションに関しては、下記手順で確認して下さい。
        
    $ ./build.sh -h 使い方: make [オプション] [ターゲット] ... オプション: -b, -m 互換性のためのもので, 無視される. -B, --always-make 無条件に全ターゲットを make する. -C DIRECTORY, --directory=DIRECTORY make 開始前にディレクトリ DIRECTORY へ移動する. -d デバッグ情報を大量に表示する. --debug[=FLAGS] 様々なタイプのデバッグ情報を表示する. -e, --environment-overrides 環境変数が makefile 中の記述に優先する -f FILE, --file=FILE, --makefile=FILE FILE を makefile として読み込む -h, --help このメッセージを表示して終了する. -i, --ignore-errors コマンドから返されたエラーを無視する. -I DIRECTORY, --include-dir=DIRECTORY Search DIRECTORY for included makefiles. インクルードする makefile を探索する DIRECTORY. -j [N], --jobs[=N] 一度に N 個までのジョブを許可; 無引数だとジョブ数制限なし. -k, --keep-going あるターゲットが make できなくても実行を続ける. -l [N], --load-average[=N], --max-load[=N] 負荷 が N 未満でない限り複数のジョブを開始しない. -L, --check-symlink-times シンボリックリンクとターゲットの中で一番新しい mtime を使う. -n, --just-print, --dry-run, --recon コマンドを実際に実行しない; 表示するのみ. -o FILE, --old-file=FILE, --assume-old=FILE FILE をとても古いものと見なして, 再 make しない. -p, --print-data-base make の内部データベースを表示する. -q, --question コマンドを実行しない; 更新済であるかどうかを終了ステータスで通知. -r, --no-builtin-rules ビルトインの暗黙ルールを無効にする. -R, --no-builtin-variables ビルトインの変数設定を無効にする. -s, --silent, --quiet コマンド表示をエコーしない. -S, --no-keep-going, --stop -k オプションをオフにする. -t, --touch ターゲットを再 make する代わりにタッチする. -v, --version make のバージョン番号を表示して終了する. -w, --print-directory カレントディレクトリを表示する. --no-print-directory -w をオフにする. 暗黙に有効な場合でもオフにする. -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE FILE をいつでも最新として見なす. --warn-undefined-variables 未定義の変数が参照されたときに警告を発する.

    このプログラムは x86_64-pc-linux-gnu 用にビルドされました
    バグレポートは <bug-make@gnu.org> まで.
    
    real    0m0.012s
    user    0m0.000s
    sys    0m0.002s
    Run |./flash.sh| to flash all partitions of your device
    chirimen@chirimen-s210x:~/B2G$
    


    config.sh 同様にここからPCの環境にもよりますが、かなりの時間を要します。
    参考値で、この PC では、6時間4分かかりました。

    ビルドが正常終了すると下図のようになります。

    ~/B2G/out/target/product/chirimen/配下にビルドされたイメージが出来ます。


    イメージをまとめる
      ビルドされたイメージをまとめる作業を行います。
    最初に kernel.img を生成します。
      
        $ cd ~/B2G
        $ ./flash.sh chirimen
        TARGET_PRODUCT=chirimen
        TARGET_HARDWARE=rk30board
        system filesysystem is ext4
        create boot.img without kernel... done.
        create recovery.img with kernel... done.
        create misc.img.... done.
        create system.img... done.
        CRC32=0xA93A8523
        OK
        $ cd rockdev/Image/
      
    

    次にCHIRIMEN-tools をクローンし、「rockdev-rk3066」へ移動します。

      
        $ git clone https://github.com/chirimen-oh/CHIRIMEN-tools.git
        $ cd ~/CHIRIMEN-tools/rockdev-rk3066
      
    

    ~/B2G/rockdev/Image/の以下のファイルを~/CHIRIMEN-tools/rockdev-rk3066/image/へコピーします。
    イメージファイル:boot.img,kernel.img,recovery.img,system.img

    mkupdate.sh を実行し、イメージをまとめます

      
        $ cd ~/CHIRIMEN-tools/rockdev-rk3066/
        $ ./mkupdate.sh
      
    




    「update.img」ファイルが上図のように~/CHIRIMEN-tools/rockdev-rk3066/に生成されます。
    以上で、手順は終了です。


    まとめ
      今回ビルド環境のバージョンで仮想環境に構築したのは確実な手順にしたかったのと仮想環境であれば、
    何らかの形で仮想環境ファイル(vdi ファイル)を配布出来るのではないかと考えた次第です。

    仮想環境のファイルサイズが 80GB となってしまった為に配布に関しては
    現時点は見送りになっています。

    ご覧になった皆さんがビルド挑戦の手助けになれば幸いです。

    今年のAdvent Calendar


    去年のAdvent Calendar

    新訳:ADB Helperをハックしてみた(前篇)

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

    目次
    1. きっかけ
    2. adb-helperの入手先
    3. ダウンロードしたアドファイル
    4. フォルダ構成
    5. ファイル構成
    6. 今回のまとめ
    7. 今年のAdvent Calendar
    きっかけ
      下記の過去の記事が理由です。 あっという間に1年が経過しているので、恐ろしいです。
    前回書いた時との差分も見ながら書いていきたいと思います。


    adb-helperの入手先
      通常は、アプリマネージャーからインストールします
    手動で、アドオンファイルをダウンロードする時は、https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/adb-helper/ からダウンロードします。 WindowsLinuxmac と各OS毎にアドオン用意されています。
    Windows の場合
    https://ftp.mozilla.org/pub/labs/fxos-simulator/adb-helper/win32/
    Linux の場合
    https://ftp.mozilla.org/pub/labs/fxos-simulator/adb-helper/linux64/
    mac の場合
    https://ftp.mozilla.org/pub/labs/fxos-simulator/adb-helper/mac64/


    ダウンロードしたアドファイル
      WindowsLinuxmacと全てのOSのアドオンをダウンロードしてみました。


    フォルダ構成
      拡張子が『xpi』です xpiファイル ※.xpiとは、WebブラウザMozilla」において機能を拡張するためのプラグインに付くファイルのことである。
    weblioより抜粋

    要は圧縮ファイルなので、解凍してみました!
    Windows版の解凍フォルダ

    Linux版の解凍フォルダ

    mac版の解凍フォルダ


    ファイル構成
      こうして見ると、各OSのフォルダー以外は同じjsファイル群とインストール用の rdfファイルは共通です
    ※Resource Description Framework (リソース・ディスクリプション・フレームワークRDF) とは、ウェブ上にある「リソース」を記述するための統一された枠組
    weblioより抜粋
    Windows版の解凍フォルダ内のadbファイル群


    Linux版の解凍フォルダ内のadbファイル群


    mac版の解凍フォルダ内のadbファイル群


    2014/11/06 時点と2016/10/20 時点で、ファイル構成やソースの改変が良く分かります。


    今回のまとめ
      約3年近く、まとめられてなかったハックを今回 Advent Calendar で完成させたいと思います。


    今年のAdvent Calendar


    去年のAdvent Calendar