2012年01月31日
Androidのadbのメモ(6) 直接adb serverと通信するrubyスクリプト
Androidのadbのメモ(5) adb shell lsを実行したときのログで採取したログをみながら、adbのクライアントと同じようにadb serverにソケットで通信するrubyスクリプトを書いてみました。役に立つかどうかというより単に理解を深めるためです。
直接adb serverと通信するrubyスクリプト
ローカルホストのポート5037を開いて、最初に"host:version"を送ってバージョンを確認した後に、"host:transport-any"と"shell:ls"を送ります。
require 'socket' def error_exit puts "Error" exit 1 end def send_to_adb(s, msg) s.printf("%04x%s", msg.length, msg) end def check_okay(s) (s.read(4) == "OKAY") end def check_version(s) (s.read(12) == "OKAY0004001d") end hostname = 'localhost' port = 5037 s = TCPSocket.open(hostname, port) send_to_adb(s, "host:version") error_exit if ! check_version(s) s.close s = TCPSocket.open(hostname, port) send_to_adb(s, "host:transport-any") error_exit if ! check_okay(s) send_to_adb(s, "shell:ls") error_exit if ! check_okay(s) while line = s.gets puts line.chop end s.close
"shell:ls"の部分を置き換えるといろいろと実験ができます。
system/core/adb/SERVICE.TXT にadb serverが受け付けるコマンドのドキュメントがありますが、一部古くなっているので、ソースコードを確認する必要があります。
追記: スクリーンキャプチャ
このスクリプトの "shell:ls"のところを"framebuffer:" に置き換えて、framebuffer.rbで保存します。
$ ruby framebuffer.rb > /tmp/out.raw
52バイトのヘッダがついた画面のイメージファイルが取得できます。
ヘッダの内訳は system/core/adb/framebuffer_service.c のstruct fbinfo
struct fbinfo { unsigned int version; unsigned int bpp; unsigned int size; unsigned int width; unsigned int height; unsigned int red_offset; unsigned int red_length; unsigned int blue_offset; unsigned int blue_length; unsigned int green_offset; unsigned int green_length; unsigned int alpha_offset; unsigned int alpha_length; } __attribute__((packed));
/tmp/out.rawはGIMPでRaw画像データで開き、Image Type: RGB Alpaha, Offset: 52, Width 800, Hight 480 で内容を確認することができます。(800x480はKZM-A9-Dualの場合の画面サイズ。)
これで自前のスクリーンキャプチャソフトが作れます。
関連するページ
Android Builders SummitでADBの話をしました
Androidのadbのメモ(1) adb serverの観察
Androidのadbのメモ(5) adb shell lsを実行したときのログ
Androidのemulator consoleに簡単にコマンドを送る方法
Androidのadbのメモ(6) 直接adb serverと通信するrubyスクリプト
Androidのadbのメモ(7) Androidデバイス側でadbを動かす
Androidのadbのメモ(8) Android以外でadbを使う実験
Androidのadbのメモ(9) Android端末同士をadbでつなぐ
Androidのadbのメモ(10) adbdの起動のトリガー
Androidのadbのメモ(11) adbdのsecureモード