getevent
adb shell
getevent --help
获取触屏接收设备,操作界面,使用getevent -t,查看触屏输入设备 /dev/input/eventn
getevent -t
[ 100917.991550] /dev/input/event4: 0000 0000 00000000
事件录制
adb shell getevent -t /dev/input/eventn > getevent.txt
[时间戳] 事件类型(16进制) 事件码(16进制) 事件值(16进制)
[ 3929.717229] 0001 014a 00000001
sendevent
sendevent /dev/input/eventn 事件类型(10进制) 事件码(10进制) 事件值(10进制)
sendevent /dev/input/eventn 1 330 1
# getevent.txt 转send.sh
class Playback(object):
touch_device = "/dev/input/eventn"
def get_sendevent_sh(self, getevent_file):
# 若两个sendevent时间差 < 0.1s 认为在同一个操作内
mindiff = 0.1
data = {}
with open(getevent_file, mode="r", encoding="utf-8") as f:
for line in f.readlines():
matched = re.findall(r"[\d.a-f]+", line, re.I)
if len(matched) == 4:
event_timestamp, event_type, event_code, event_value = matched
event_type = self.hex_to_dec(event_type)
event_code = self.hex_to_dec(event_code)
event_value = self.hex_to_dec(event_value)
item = [str(event_type), str(event_code), str(event_value)]
if event_timestamp not in data:
data[event_timestamp] = [item]
else:
data[event_timestamp].append(item)
# 写sendevent文件
out_file = os.path.join(os.path.dirname(getevent_file), "sendevent.sh")
last_event_timestamp = None
items = []
def sendevent_line(event_list):
line = "\n".join(["" + "sendevent " + f"{self.touch_device} " + " ".join(items) for items in event_list])
return line
if len(data) == 0:
raise Exception("no event")
with open(out_file, mode="w+", encoding="utf-8") as f:
for event_timestamp, event_list in data.items():
last_event_timestamp = last_event_timestamp or event_timestamp
if last_event_timestamp != event_timestamp:
diff = float(event_timestamp) - float(last_event_timestamp)
if diff > mindiff:
line = sendevent_line(items)
f.write(f"{line}\n")
f.write(f"sleep {diff}; ")
items = event_list
else:
items.extend(event_list)
else:
items.extend(event_list)
last_event_timestamp = event_timestamp
line = sendevent_line(items)
f.write(f"{line}\n")
f.write(f"exit 0\n")
将sendevent.sh push 到/data/local/tmp目录下执行