背景:
近来有学员朋友问到了模拟事件输入相关内容,一般这块知识大部分学员朋友第一时间想到肯定是使用input相关的命令进行输入不就可以了。
例如如下:
adb shell input tap 100 1800
但是也有学员朋友提出,这种只能注入事件,一般都是基于现有的一些event进行注入
add device 1: /dev/input/event6
name: "uinput-fpc"
add device 2: /dev/input/event5
name: "msm8996-tasha-mtp-snd-card Button Jack"
add device 3: /dev/input/event4
name: "msm8996-tasha-mtp-snd-card Headset Jack"
add device 4: /dev/input/event3
name: "pwm-ir"
add device 5: /dev/input/event1
name: "gpio-keys"
add device 6: /dev/input/event0
name: "qpnp_pon"
add device 7: /dev/input/event2
name: "atmel-maxtouch"
但是如果需要新建立一个device,然后进行事件模拟注入呢?这种情况应该使用uinput相关的进行操作。
这个uinput相关内容确实属于一个比较陌生的知识领域,所以马哥接下来将带领大家一起来探索挖掘出相关的uinput的内容,及使用uinput来实现模拟事件的注入等。
uinput相关介绍
uinput通过创建一个虚拟的输入设备接口,允许用户在没有物理输入设备的情况下模拟输入操作。它允许开发者在软件层面模拟硬件设备的行为,这对于开发和测试涉及输入设备的软件非常有用。uinput支持多种输入事件,包括键盘按键、鼠标移动和点击等,使得开发者可以方便地测试和调试相关的应用程序。
android上uinput相关内容:
android本身是自带了相关的uinput节点:
emu64x:/ # ls -l /dev/uinput
crw-rw---- 1 uhid uhid 10, 223 2025-05-06 12:16 /dev/uinput
系统其实也有相关的uinput的命令源码:
uinput命令源码路径
frameworks/base/cmds/uinput
frameworks/base/cmds/uinput$ tree
.
├── Android.bp
├── examples
│ └── test-touchpad.evemu
├── jni
│ ├── Android.bp
│ ├── com_android_commands_uinput_Device.cpp
│ └── com_android_commands_uinput_Device.h
├── MODULE_LICENSE_APACHE2
├── NOTICE
├── OWNERS
├── README.md
├── src
│ └── com
│ └── android
│ └── commands
│ └── uinput
│ ├── Device.java
│ ├── EvemuParser.java
│ ├── Event.java
│ ├── EventParser.java
│ ├── InputAbsInfo.aidl
│ ├── JsonStyleParser.java
│ └── Uinput.java
├── TEST_MAPPING
├── tests
│ ├── Android.bp
│ ├── AndroidManifest.xml
│ └── src
│ └── com
│ └── android
│ └── commands
│ └── uinput
│ └── tests
│ └── EvemuParserTest.java
└── uinput.sh
14 directories, 21 files
但是具体这个uinput命令如何使用呢?其实系统中并没有看到有详细的使用方式,所以这个uinput的使用门槛其实比较高
作业布置:
uinput其实本质是linux上就自带的,并不是android特有的,主要完全也可以基于标准的linux相关接口就可以对/dev/uinput进行相关的操作和使用,所以一共给大家布置两个题目
题目1:
编写一个native可执行程序,基于标准的/dev/uinput节点,实现一个模拟鼠标,可以实现对鼠标位置的控制
题目2
请针对android上源码
frameworks/base/cmds/uinput
编译成的uinput命令进行相关的使用,要写出详细可以用的实战使用uinput命令的方式,解决目前aosp上uinput命令不知道怎么使用的痛点
更多framework实战干货,请关注下面“千里马学框架”