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モード