Linux/Android——Input系统之frameworks层InputManagerService (六)

Android Framework面试核心:Binder机制与系统级问题排查 Binder机制作为Android系统进程间通信(IPC)的核心组件,其设计原理与性能优化是Framework工程师必须掌握的底层知识。从内核空间的Binder驱动实现到应用层的接口定义,理解线程池管理、数据传输优化等关键技术点,能够有效解决跨进程通信中的ANR、死锁等稳定性问题。在系统服务架构设计中,ActivityManagerService、WindowManagerService等核心模块的交互机制,以及Native崩溃分析、锁竞争检测等实战技能,都是大厂面试的高频考察方向。通过源码级深度剖析和真实 阅读详情

      上一篇Linux/Android——input系统之 kernel层 与 frameworks层交互 (五)  中有介绍kernel层一下以及与android这边frameworks层之间的联系,算是打通android 应用层与 kernel驱动层,对整个input系统的学习是至关重要的,其中frameworks层只是简单记录了几个接入点,这里开始分析frameworks层的细节部分。


                                            撰写不易,转载需注明出处:http://blog.youkuaiyun.com/jscese/article/details/42392311

input服务的启动:

 android启动的时候会启动很多个service,这个可以参考SystemServer.java ,会启动InputManagerService这个服务:


   Slog.i(TAG, "Input Manager");
            inputManager = new InputManagerService(context, wmHandler);

...

            ServiceManager.addService(Context.INPUT_SERVICE, inputManager);

直接看InputManagerService.java中的start函数:

    public void start() {
        Slog.i(TAG, "Starting input manager");
        nativeStart(mPtr);   //调用了本地方法,JNI对应的cpp 在server下的jni目录下

...

}

这个牵扯到android的server的jni,最开始是在SystemServer中加载android_server这个动态库,

至于这个动态库的编译可参考/frameworks/base/services/jni/Android.mk中的内容

所以在调用这个nativeStart方法时,相关的动态库已经加载到SystemServer的进程中。


先看下这个start函数在jni文件中的实现,frameworks/base/services/jni/com_android_server_input_InputManagerService.cpp中:

static void nativeStart(JNIEnv* env, jclass clazz, jint ptr) {
    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);  //这个NativeInputManager 是在上面InputMangerService构造的时候调用nativeInit时new出来的

    status_t result = im->getInputManager()->start(); //这里是调用了NativeInputManager中的InputManager中的start方法,同样这个InputManager是NativeInputManager构造的时候new出来的
    if (result) {
        jniThrowRuntimeException(env, "Input manager could not be started.");
    }
}

其实熟悉JNI的话,我分析到这里,就应该差不多了。。对于JNI 不是很了解的话可以参考我之前的博客: Andorid——ubuntu下的 NDK / JNI


看下NativeInputManager构造函数中的:

    sp<EventHub> eventHub = new EventHub();
    mInputManager = new InputManager(eventHub, this, this);

这里的JNI部分就不多说了,现在就看这个InputManager的start方法,上面提到到Android.mk,可以看到include了一个libinput的动态库,

而这个动态库的路径是在/frameworks/base/services/input下,这就明了啦.此目录下有InputManager.cpp . EventHub.cpp等

直接看start:

status_t InputManager::start() {
    status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);  //这个mDispatcherThread是在InputManager构造函数里调用initialize初始化,这里很明显启动了这个名为InputDispatcher的线程
    if (result) {
        ALOGE("Could not start InputDispatcher thread due to error %d.", result);
        return result;
    }

    result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY); //同上,开启线程
    if (result) {
        ALOGE("Could not start InputReader thread due to error %d.", result);

        mDispatcherThread->requestExit();
        return result;
    }

    return OK;
}


到这里算是看到真面目的感觉,看这两个线程,字面意思,一个是分发给input事件给当前的activity的,一个是读取从下层发上来的input事件的



InputDispatcher分发:

 从上面的线程启动分析:

bool InputDispatcherThread::threadLoop() {
    mDispatcher->dispatchOnce();
    return true;
}
调用分发一次的函数:

void InputDispatcher::dispatchOnce() {
    nsecs_t nextWakeupTime = LONG_LONG_MAX;
    { // acquire lock
        AutoMutex _l(mLock);
        mDispatcherIsAliveCondition.broadcast();

        // Run a dispatch loop if there are no pending commands.
        // The dispatch loop might enqueue commands to run afterwards.
        if (!haveCommandsLocked()) {           //如果有缓存的命令就调用下面的runCommand去执行,没有的话这里去检查是否有新的input事件,这里定义一个唤醒时间控制
            dispatchOnceInnerLocked(&nextWakeupTime);
        }

        // Run all pending commands if there are any.
        // If any commands were run then force the next poll to wake up immediately.
        if (runCommandsLockedInterruptible()) {
            nextWakeupTime = LONG_LONG_MIN;
        }
    } // release lock

    // Wait for callback or timeout or wake.  (make sure we round up, not down)
    nsecs_t currentTime = now();
    int timeoutMillis = toMillisecondTimeoutDelay(currentTime, nextWakeupTime);
    mLooper->pollOnce(timeoutMillis);  //执行上面一次分发之后,就进入了loop,这个loop会持续的检测对应的管道中是否有内容可读,而另外一个线程InputReader 读取到input事件之后就会往这个管道写入
}

这个是处理input事件的,后续分析,先看怎么读取事件.



InputReader读取:

  源码位于frameworks/base/libs/ui/InputReader.cpp ,开启线程如下:

bool InputReaderThread::threadLoop() {
    mReader->loopOnce();
    return true;
}

这里看这个loopOnce:

void InputReader::loopOnce() {

...

   size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);  //这里去获取event事件

...

        if (count) {
            processEventsLocked(mEventBuffer, count); //如果获取到事件,就处理
        }

...

}

可以看到这里就到了获取event事件了。上一篇中有提到!

getEvent中会一直read,直到get到event之后,通过precessevent处理,最终会唤醒上面介绍到的InputDispatcherThread,通知它有新的事件来了





智能车赛道识别:八邻域算法的实战解析与优化 本文深入解析了智能车赛道识别中八邻域算法的核心原理与实战优化。作为兼顾性能与稳定性的经典方案,该算法通过模拟探险家环顾八方的策略,能精准追踪弯道与直道边界。文章详细拆解了代码逻辑,并提供了边界平滑、异常处理及应对十字路口、环岛等复杂场景的关键优化策略,助力开发者提升智能车视觉系统的鲁棒性与实时性。 阅读详情

相关推荐

numeca linux 11,NUMECA FINE/Turbo16下载-NUMECA FINE/Turbo16官方版v16.0 最新版 - 起点软件园...

NUMECA FINE/Turbo16,空气动力学模拟工具,帮助小伙伴随时仿真模拟,让小伙伴可以模拟出最真实的环境,让小伙伴可以轻松完成环境模拟的服务,帮助小伙伴更好的解决自己的课题研究!NUMECA FINE/Turbo16说明1、支持在64位WINDOWS操作系统和LINUX操作系统下运行2、基于全二阶精度的数值格式,保证了计算精度3、采用先进的全多重网格技术和基于密度的求解方法保证了快速的流...

weixin_39858298的博客 1624

InputManagerService Input输入系统 InputManager

在android系统中目录下/dev/input/下记录着输入设备的设备节点,用户空间可以通过ioctl的方式获取设备节点的输入设备类型、厂商、描述信息等。android通过监听该目录的变化进行添加和删除设备节点,通过监听具体的设备节点的写入,来进行对输入事件的解析,再传送到具体的事件处理View等。Android系统接收到的原始事件为上述格式,但是这种事件并不会很好的被app使用并且识别,所以android系统会将原始事件解析成KeyEvent和MotionEvent类型。

qq_41305245的博客 2008

MSPM0G3507+逐飞库:5分钟搞定KEIL环境配置与LED闪烁(附常见错误解决)

本文详细介绍了如何使用MSPM0G3507微控制器和逐飞库快速配置KEIL开发环境,并实现LED闪烁功能。从芯片支持包安装、逐飞库工程配置到烧录调试,提供了完整的步骤和常见错误解决方案,帮助开发者5分钟内完成环境搭建。

lambda的博客 1195

Android InputManagerService分析(基于Android 8.0)

InputManagerService

he980725866的博客 1242

Cadence17.4 Allegro PCB制板(gerber / 光绘)文件输出的顺序及注意点

Cadence Allegro PCB制板文件输出 (gerber 光绘文件输出)

weixin_45331044的博客 1万+

遥感数据处理之MCD19A2数据的处理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 这一段时间一直在做modis气溶胶产品——MCD19A2这个数据的处理工作,总结了一些东西,在这里分享一下。 modis数据一般可以用MCTK和MRT这两个工具进行处理,下面先介绍一下用这两种工具处理MCD19A2的流程: 先解众惑:为什么使用MCD19A2数据处理出来的结果会有3个或4个或5个波段。 这里使用HDF Exploer这个软件,下载链接 1.使用MCTK处......

weixin_42176976的博客 1万+

【Android Framework (十一) 】- InputManagerService

InputManagerService是一个系统服务,主要处理Input事件的传递,包括键盘、鼠标、触摸屏等等,它和WMS密切相关。

不靠谱先森的博客 874

基于Simulink的占空比调制DTC降低转矩脉动

修改传统SVPWM模块,输入占空比d和有效矢量索引,计算Ton​=d∗Tc​、Toff​=(1−d)∗Tc​,生成对称PWM波形(替代开关表直接输出)。:低速时(n<500rpm)减小dmax​=0.6(避免磁链畸变),高速时(n>2000rpm)增大dmax​=0.8(提升动态响应);kT​/kψ​:转矩/磁链误差增益(需整定,如kT​=0.02/(N⋅m),kψ​=0.1/Wb);(θ为电压矢量与磁链夹角)。② SVM-DTC(占空比计算模块启用,d0​=0.5,kT​=0.02,kψ​=0.1)。

amy_mhd的博客 87

Android 12系统源码_输入系统(二)InputManagerService服务

结合Android12系统源码梳理InputManagerService服务的启动流程,梳理IMS模块的设计架构。

AfinalStone的专栏 1814

【光子 AI 】LangGraph:Graph = 有向有环图 + 状态机实现原理详解:数据结构模型与核心算法代码实现逻辑解析

LangGraph核心原理解析:基于Pregel模型的消息传递图,结合有向有环图和状态机特性。关键实现包括:1) 共享状态机制(TypedDict/Pydantic模型)配合Reducer逻辑实现状态更新;2) 图拓扑结构通过邻接表维护节点和条件边;3) 检查点机制支持状态持久化和恢复。运行时采用Pregel循环算法,通过超级步迭代执行节点函数、应用状态归约、条件路由下一批节点,同时支持人工中断和异步并行处理。该架构使LangGraph具备循环执行、条件跳转等DAG无法实现的动态流程控制能力。

AI天才研究院 1036

边缘计算与产业生态系统

目录 文章目录目录边缘计算产业参与者边缘计算产业生态系统 边缘计算产业参与者 边缘计算领域参与者众多,主流公司以打造生态优势为目标,基于自身服务层级向产业链上下两端进行拓展,目前市场主要参与者有: 系统集成商:在产业头部,具有广泛的能力,可以集成不同生态系统公司的产品,具有一定的全球性属性,在边缘计算领域大多由云服务商、电信运营商担任。 云服务商:具有领先的云技术优势与应用生态体系,同时拥有全球性资源布局与市场资源生态,并渴望成为边缘计算主导者。 电信运营商:具有边缘基础设施优势,以及不可替代的

烟云的计算 2103

十分钟了解Android触摸事件原理(InputManagerService)

点击屏幕InputManagerService的Read线程捕获事件,预处理后发送给Dispatcher线程Dispatcher找到目标窗口通过Socket将事件发送到目标窗口APP端被唤醒找到目标窗口处理事件作者:看书的小蜗牛十分钟了解Android触摸事件原理(InputManagerService)作者:看书的小蜗牛链接:https://www.jianshu.com/p/f05d6b05ba17来源:简书著作权归作者所有。

chuyouyinghe的专栏 1379

30.Labview如何读懂别人程序、修改程序?

之前写过一次教大家的文章,这次教大家如何学习别人的程序,和如何搭建一套适合自己的程序框架。这里事先说明一下:要想搭好程序框架,一定要先把自己的系统,逻辑是什么!这非常重要,是决定你程序的关键因素。废话不多扯,直接说重点。

关注我,更多技术问题欢迎私聊~ 2447

Linux/Android——Input系统之frameworks层InputManagerService (六)【转】

本文转载自:http://blog.youkuaiyun.com/u013491946/article/details/72638954 版权声明:免责声明: 本人在此发文(包括但不限于汉字、拼音、拉丁字母)均为随意敲击键盘所出,用于检验本人电脑键盘录入、屏幕显示的机械、光电性能,并不代表本人局部或全部同意、支持或者反对观点。如需要详查请直接与键盘生产厂商法人代表联系 .挖井挑水无水表,不会网购无快递 ...

zzb2760715357的博客 95

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android /inputmanager-jni,Linux/Android——Input系统之frameworks层InputManagerService (六)【转】...

上一篇Linux/Android——input系统之 kernel层 与 frameworks层交互 (五)中有介绍kernel层一下以及与Android这边frameworks层之间的联系,算是打通android 应用层与 kernel驱动层,对整个input系统的学习是至关重要的,其中frameworks层只是简单记录了几个接入点,这里开始分析frameworks层的细节部分。input服务的...

weixin_34020067的博客 240

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android 7系统输入(一)从硬件到应用的事件旅程

本文是Android输入系统系列文章的第一篇,从宏观架构角度解析事件从硬件到应用的分发全链路。文章首先提出研究输入系统的必要性,指出应用层事件分发机制无法解决深层问题(如ANR机制、外设接入等)。随后通过分层架构图展示事件流水线:硬件驱动→内核层(/dev/input/eventX)→Native层(EventHub采集、InputReader加工、InputDispatcher分发)→Java层(InputManagerService)→应用层(ViewRootImpl)。重点剖析了Linux内核的inp

AfinalStone的专栏 420

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 输入系统

在 Linux 输入子系统(Input Subsystem)中,多点触控(Multi-Touch)事件通过一系列以 ABS_MT_ 开头的绝对坐标类事件代码(ABS 代表 Absolute Position)来描述每个触摸点(Slot)的属性。// JNI层:nativeInit(com_android_server_input_InputManagerService.cpp)NativeInputManager* im = new NativeInputManager(...);

blueheart05的专栏 1417

Android 知识体系

Android归档前言 前言 感谢: Gityuan:Android系统架构开篇 刘望舒的博客:知识体系

许浑的博客 8199

Android 7系统输入(三)InputReader — 原始事件到Android事件的转换引擎

文章摘要: 本文是Android输入事件处理系列第三篇,聚焦InputReader的核心作用——将EventHub采集的原始事件(RawEvent)转换为Android框架可识别的KeyEvent/MotionEvent。InputReader运行在独立线程中,通过主循环loopOnce()处理事件流,其核心流程包括:读取原始事件、根据设备类型选择对应InputMapper(如Keyboard/TouchMapper)进行转换、批量通知InputDispatcher。文章详细剖析了InputDevice的创

AfinalStone的专栏 248

【Android】图文解密Android InputManagerService

【Android】图文解密Android InputManagerService

Making Life Better. Making Others Better. 1044

Android Input子系统 -- InputManagerService启动

InputManagerService是Android framework中核心service之一,Android framework层涉及的代码也是非常多, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 frameworks/native/services/inputflinger/ - InputDispatche...

zhangjie201412的专栏 1000

android11 input 事件 1 初始化

evenhub 通过epool_create 、epoll_add、 epoll_wait 监测/dev/input/eventX ,是否有事件。listener 实际上就是InputDispatcher,调用InputDispatcher::notifyKey 传递事件。com_android_server_input_InputManagerService.cpp 是jni 实现。将event组合成了一个notifykeyArgs数据结构,同时调用了listener的notifykey方法。

u012794472的专栏 725

Android InputManagerService的创建和启动

Android输入系统分为Java和Native部分,其中初始化是从Java部分开始的,然后再完成Native部分的初始化。

xiaokangss的博客 1196

如何基于scrcpy改造实现大厂一键连招/触摸宏功能(带java源码)-千里马安卓framework实战

已经分享过如何实现这种大厂里面一键连招,触摸宏的功能,原理本身是对dev/input下面的节点进行读取保存文件,然后在读取文件进行写入dev/input下面的节点,从而实现了触摸事件的读取和写入,不过这个一定要root的手机版本。很多同学就提出是否可以考虑参考scrcpy的事件注入,即已经实现了触摸注入了,只需要再额外补充一个事件的录制保存文件既可以。可以看的出这里重点的方案就是scrcpy如何获取用户的触摸事件,即要监听到全局的触摸事件。通过上面几步骤就完成了监听触摸事件保存到文件的操作。

learnframework的博客 1455
上一篇: Linux/Android——input系统之 kernel层 与 frameworks层交互 (五)
下一篇: Linux/Android——Input系统之InputReader (七)
南丶烟
博客等级 码龄14年 569粉丝 98原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值