Linux Android: 节点权限梳理

本文探讨了嵌入式系统中内核创建的节点、系统节点及动态节点的权限管理,详细介绍了如何修改/sys文件系统下文件的权限,以及在init.target.rc和ueventd.xxxx.rc中设置权限的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、内核创建的节点权限

例如修改内核创建/sys文件系统下的文件的权限时

将代码从

 __ATTR(type, 0644, xx_show, NULL); 


改为      

  __ATTR(type, 0666, xx_show, NULL); 

需要注意VERIFY_OCTAL_PERMISSIONS权限检查

 

二、系统的节点权限

通常在device目录下的init.target.rc中进行修改,例如:

    chmod 0777 /sys/class/leds/led-blink/trigger
    chmod 0777 /sys/class/leds/led-blink/brightness
    chmod 0777 /sys/class/leds/led-blink/delay_off

三、动态节点权限

主要是例如像通过USB插入后形成的“热插拔”设备节点,如鼠标,UVC设备等

通常在device目录下的ueventd.xxxx.rc中进行权限修改,例如

 

/dev/video* 0666 system camera 

 

<think>嗯,用户想要深入了解Android 9源码中的Input流程,我需要详细梳理这部分内容。首先,我应该回忆Android输入系统的基本结构,可能涉及到的模块包括InputManagerService、WindowManagerService、InputReader和InputDispatcher等。 接下来,用户可能需要知道整个流程是如何从硬件事件传递到应用的。我得从底层开始,比如Linux内核的输入设备驱动,然后到HAL层,再到Native层的InputReader线程读取事件,再转交给InputDispatcher分发。 要注意Android 9和之前版本的区别,比如可能有新的API或者架构调整。需要确认Android 9中是否有重大变更,比如Project Treble相关的内容是否影响HAL层,但Input子系统可能变化不大。 用户可能对事件的分发机制感兴趣,比如如何确定目标窗口,如何处理触摸事件的分发顺序,以及ANR的触发机制。这部分需要详细说明InputDispatcher的作用,如何与WindowManagerService交互,通过Socket通信传递事件。 另外,需要考虑代码的具体位置,比如frameworks/base/services/core/java/com/android/server/input/,以及Native部分的代码路径,比如frameworks/native/services/inputflinger/。可能需要提到关键的类和方法,比如InputManagerService的启动过程,EventHub如何监听设备节点。 还要注意事件的分发流程,包括添加到队列、寻找目标窗口、处理焦点切换、权限检查等步骤。可能需要解释InputChannel和WindowInputEventReceiver的作用,以及应用侧如何通过ViewRootImpl接收事件。 最后,用户可能需要一些调试方法,比如查看日志或者使用adb命令获取输入事件信息。这部分可以简要提及,帮助用户实际验证流程。 总之,回答需要结构清晰,从底层到上层逐步展开,结合关键代码和流程,确保用户能理解整个Input处理机制。同时,要使用中文,避免专业术语过多,适当解释概念,保持逻辑连贯。</think>好的,我将为您梳理Android 9(Pie)源码中Input事件处理的核心流程。这个涉及Linux内核到应用层的完整处理链路,以下是关键步骤分析: --- ### 一、硬件事件产生 1. **内核层**:输入设备(触摸屏/按键)通过`evdev`驱动生成`input_event` 2. **HAL层**:`EventHub`(位于`frameworks/native/services/inputflinger/EventHub.cpp`)通过`epoll`监听`/dev/input`节点 --- ### 二、InputReader处理阶段 ```cpp // frameworks/native/services/inputflinger/InputReader.cpp void InputReader::loopOnce() { size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer...); processEventsLocked(mEventBuffer, count); // 原始事件解析 } ``` 1. 将原始事件转换为`RawEvent` 2. 根据设备类型分类处理: - 触摸事件:生成`TouchInputMapper` - 物理按键:生成`KeyboardInputMapper` - 传感器事件:生成`SensorInputMapper` --- ### 三、InputDispatcher分发阶段 ```java // frameworks/base/services/core/java/com/android/server/input/InputManagerService.java class NativeInputManager { void notifyKey(int32_t eventType, int32_t deviceId...) { mService.mHandler.obtainMessage(...).sendToTarget(); } } ``` 1. **事件入队**:通过`InputDispatcher::enqueueInboundEventLocked`写入队列 2. **目标窗口查找**: - 通过`WindowManagerService`获取当前焦点窗口 - 检查窗口的`InputChannel`有效性 3. **分发逻辑**: - 按键事件:直接发送到焦点窗口 - 触摸事件:通过`findTouchedWindowTargetsLocked`计算触点所在的窗口 --- ### 四、跨进程通信机制 ```cpp // frameworks/base/core/java/android/view/InputChannel.java public final class InputChannel implements Parcelable { // 使用socket pair进行IPC通信 private static native void nativeSendSignal(...); } ``` 1. **InputChannel**:每个窗口通过`ViewRootImpl.addToDisplay`创建 2. **WindowInputEventReceiver**:应用层通过`Choreographer`接收事件 --- ### 五、应用层处理 ```java // frameworks/base/core/java/android/view/ViewRootImpl.java final class ViewPostImeInputStage extends InputStage { protected int onProcess(...) { if (event instanceof KeyEvent) { deliverKeyEvent(postEvent); } else { processPointerEvent(event); } } } ``` 1. `ViewRootImpl`通过`InputEventReceiver.dispatchInputEvent`接收事件 2. 事件经过`InputStage`责任链处理(`ViewPostImeInputStage`->`NativePostImeInputStage`) --- ### 六、ANR触发机制 1. **超时检测**:`InputDispatcher`设置5秒超时(按键事件) 2. 当事件未在`InputConfig.TIMEOUT`内完成处理: ```cpp // frameworks/native/services/inputflinger/InputDispatcher.cpp void doDispatchCycleLockedInterruptible(...) { if (timeoutTime <= currentTime) { onANRLocked(currentTime, ...); } } ``` --- ### 关键调试方法 1. 查看事件流: ```bash adb shell getevent -lt ``` 2. 监控Window焦点: ```bash adb shell dumpsys input ``` 3. 查看ANR日志: ```bash adb logcat | grep "Input event injection timed out" ``` 建议结合源码查看以下关键类: - `InputManagerService`(Java层入口) - `InputDispatcher.cpp`(核心分发逻辑) - `InputTransport.cpp`(跨进程通信实现) - `InputEventReceiver.java`(应用层接收入口) 需要更深入的代码分析可指定具体模块(如多点触控处理、手势识别等)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值