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の場合の画面サイズ。)

これで自前のスクリーンキャプチャソフトが作れます。



トラックバックURL

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード