#!/usr/bin/python | |
import socket | |
import sys | |
import struct | |
import time | |
# debug | |
VERBOSE = True | |
def D(msg): | |
if VERBOSE: print(msg) | |
# "struct fbinfo" is defined in $T/system/core/adb/framebuffer_service.c | |
def fbinfo_unpack(data): | |
keys = ("version", | |
"bpp", | |
"size", | |
"width", | |
"height", | |
"red_offset", | |
"red_length", | |
"blue_offset", | |
"blue_length", | |
"green_offset", | |
"green_length", | |
"alpha_offset", | |
"alpha_length" | |
) | |
# the data is little-endian | |
values = struct.unpack("<IIIIIIIIIIIII",data) | |
D("dump struct fbinfo") | |
i = 0 | |
for key in keys: | |
D("%14s: %-12d" % (key, values[i])) | |
i = i + 1 | |
def save(): | |
f = open('dump', 'w') | |
while True: | |
data = s.recv(4096 * 16) | |
if data == "": | |
break | |
f.write(data) | |
f.close() | |
def communicate(cmd=None): | |
if cmd != None: | |
buf = "%04x%s" % (len(cmd), cmd) | |
D("<< " + buf) | |
s.send(buf) | |
data = s.recv(4096) | |
D(">> [%s]" % len(data)) | |
D(data) | |
if data[0:4] == 'FAIL': | |
return False | |
else: | |
return True | |
target = '' | |
# use getopt module in future | |
for arg in sys.argv: | |
if arg == '-q': | |
VERBOSE = False | |
if target != 'any': | |
# compatiable with "adb -d", redirect commands to usb | |
if arg == '-d': | |
target = 'usb' | |
# compatiable with "adb -e", redirect commands to emulator | |
elif arg == '-e': | |
target = 'local' | |
if target == '': target ='any' | |
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
D("connecting") | |
try: | |
s.connect(("localhost", 5037)) | |
except socket.error: | |
print 'Cannot connect to localhost:5037' | |
print socket.error | |
sys.exit(0) | |
D("connected") | |
if not communicate("host:transport-%s" % target): | |
sys.exit(1) | |
#communicate("host:transport-usb:shell:ls /data") | |
communicate("framebuffer:") | |
data = s.recv(52) | |
fbinfo_unpack(data) | |
t0 = float(time.time()) | |
save() | |
t1 = float(time.time()) | |
print t1 - t0 | |