C语言实现 input事件模拟
c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
int main() {
int fd = open("/dev/input/event0", O_RDWR);
if (fd < 0) {
perror("Failed to open device");
return -1;
}
// 定义 8 个输入事件(按顺序模拟按键按下和释放)
struct input_event events[] = {
// KEY_314 按下
{.type = EV_KEY, .code = 314, .value = 1},
{.type = EV_SYN, .code = SYN_REPORT, .value = 0},
// KEY_212 按下
{.type = EV_KEY, .code = 212, .value = 1},
{.type = EV_SYN, .code = SYN_REPORT, .value = 0},
// KEY_212 释放
{.type = EV_KEY, .code = 212, .value = 0},
{.type = EV_SYN, .code = SYN_REPORT, .value = 0},
// KEY_314 释放
{.type = EV_KEY, .code = 314, .value = 0},
{.type = EV_SYN, .code = SYN_REPORT, .value = 0}
};
// 批量发送事件
for (int i = 0; i < sizeof(events)/sizeof(events[0]); i++) {
if (write(fd, &events[i], sizeof(struct input_event)) < 0) {
perror("Failed to send event");
close(fd);
return -1;
}
}
close(fd);
return 0;
}
静态交叉编译
c
aarch64-linux-gnu-gcc-10 123.c -o startup_camera_common --static
可以模拟 简单按键事件
为什么不用 shell命令
比如
adb shell "sendevent /dev/input/event0 0001 314 00000001"
adb shell "sendevent /dev/input/event0 0000 0000 00000000"
adb shell "sendevent /dev/input/event0 0001 212 00000001"
adb shell "sendevent /dev/input/event0 0000 0000 00000000"
adb shell "sendevent /dev/input/event0 0001 212 00000000"
adb shell "sendevent /dev/input/event0 0000 0000 00000000"
adb shell "sendevent /dev/input/event0 0001 314 00000000"
adb shell "sendevent /dev/input/event0 0000 0000 00000000"
sendevent 是 busybox命令, 每次执行八条命令 耗时过长, 在抓 perfetto的时候 会看到耗时特别久, 对于分析按键触发的性能事件有很大的干扰!