input 之我见1

input 之我见1

  1. InputMangerService是怎么产生的?
base/services/java/com/android/server/SystemServer.java
            Slog.i(TAG, "Input Manager");                                                                                                                
            inputManager = new InputManagerService(context, wmHandler);

InputManagerService的代码位于

frameworks/base/services/java/com/android/server/input/InputManagerService.java
  1. 一开机的时候, SystemServer 会启动 InputManagerService, 这时 InputManagerService 又会去启动两个Thread,InputReaderThread,InputDispatcherThread和一个 EventHubInterface .

如何来生成两个Thread?

InputManagerSerivice.java中的构造函数
InputManagerService()
->
nativeInit()
->
com_android_server_input_InputManagerService.cpp
nativeInit()
->
new NativeInputManager()
->
new InputManager()
->
framework/native/service/inputflinger(androidL)
InputManager::InputManager(
        const sp<EventHubInterface>& eventHub,
        const sp<InputReaderPolicyInterface>& readerPolicy,
        const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
    mDispatcher = new InputDispatcher(dispatcherPolicy);
    mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
    initialize();
}
=>
void InputManager::initialize() {
    mReaderThread = new InputReaderThread(mReader);
    mDispatcherThread = new InputDispatcherThread(mDispatcher);
}


以InputReaderThread为例
InputReader.cpp
InputReaderThread::InputReaderThread(const sp<InputReaderInterface>& reader) :
        Thread(/*canCallJava*/ true), mReader(reader) {
}

InputReaderThread::~InputReaderThread() {
}

bool InputReaderThread::threadLoop() {
    mReader->loopOnce();//这里的mReader就是InputReader的实例
    return true;
}
->
void InputReader::loopOnce() {
...
size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);//EventHubInterface,getEvents就是读driver的/dev目录
...

}
其中,这个线程有一个非常重要的函数getEvents,就是这个线程主要的工作
getEvents(){
...
for(; ;)
{
...
readNotifyLocked()
...
}
}
会不停的读系统输入设备的状态。


}
  1. 因此输入事件处理流程跟此三位角色有关系.InputReaderThread从EventHubInterface抓取新的inputevent, 然后在依各个的eventtype 进入各个的 event mapper, 各个的 event mapper 处理输入事件完之后,InputReaderThread 将new input 放进 Queue 中. 之后 InputDispatcherThread再从Queue中取出Input Event 放入共享内存中. 此时再通知 View 去共享内存抓取 new Input Event, 取完之后再通知InputDispatcherThread是否可以再放新的InputEvent到共享内存中,

    这段话这样解释。

这里写图片描述

引用\[1\]:adb命令可以模拟简单的按键事件,当触摸屏不好使的时候就可以用咯。上篇有提到adb devices命令,就是用usb连接到手机或平板,这个时候就可以用adb shell 命令打开手机或平板终端了。输入input 回车有: 。 引用\[2\]:adb shell input命令使用说明 usage: input ... input text <string> input keyevent <key code number or name> input \[touchscreen|touchpad\] tap <x> <y> input \[touchscreen|touchpad\] swipe <x1> <y1> <x2> <y2> input trackball press input trackball roll <dx> <dy> 1. adb shell input text 。 引用\[3\]:模拟按键,可以是数字、符键或者是功能按键,keyevent后可以是按键的码值或者按键的名称,按键列表见文末的介绍,举例如下: //模拟按下数字0键 adb shell input keyevent "KEYCODE_0" //模拟按下返回键 adb shell input keyevent 4 3. adb shell input \[touchscreen|touchpad\] tap x y 。 问题:adb shell中的input命令有哪些用法? 回答: 在adb shell中,input命令有以下几种用法: 1. input text <string>: 模拟输入文本,可以输入任意字符串。 2. input keyevent <key code number or name>: 模拟按键事件,可以是按键的码值或者按键的名称。例如,模拟按下数字0键可以使用命令adb shell input keyevent "KEYCODE_0",模拟按下返回键可以使用命令adb shell input keyevent 4。 3. input \[touchscreen|touchpad\] tap <x> <y>: 模拟触摸屏幕上的点击事件,需要指定点击的坐标。例如,使用命令adb shell input touchscreen tap 100 200可以模拟在坐标(100, 200)处点击屏幕。 #### 引用[.reference_title] - *1* [adb shell input 命令](https://blog.csdn.net/yicao821/article/details/7327953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [adb shell input命令使用说明](https://blog.csdn.net/qq_45477402/article/details/124659939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可夫小子

感谢大佬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值