Android系统的流程如下:
1 system server的main函数中:ServerThread thr = new ServerThread(); 启动了Server进程
2 ServerThread类的initAndLoop()函数有如下代码:
boolean disableMedia = SystemProperties.getBoolean("config.disable_media", false);
if (!disableMedia) {
try {
Slog.i(TAG, "Wired Accessory Manager");
// Listen for wired headset changes
inputManager.setWiredAccessoryCallbacks(new WiredAccessoryManager(context, inputManager));
} catch (Throwable e) {
reportWtf("starting WiredAccessoryManager", e);
}
}
上述代码创建了WiredAccessoryManager类
3 在WiredAccessoryManager类的构造函数中:private final WiredAccessoryObserver mObserver; mObserver = new WiredAccessoryObserver();
创建了Observer类
4 WiredAccessoryObserver类,继承自UEventObserver,负责完成UEvent的事件监控。其构造函数中:mUEventInfo = makeObservedUEventList(); 实现了对UEvent List的注册。
5 makeObservedUEventList函数,返回值为List<UEventInfo>,每个节点为需要监测的UEvent类型。
Linux内核的代码流程:
1 相关核心文件为:
/drivers/switch/switch_gpio.c
/drivers/switch/switch_class.c
2、在/sys/class/switch目录下创建某个具体设备,通过switch_dev_register(&headset->sdev);来实现,创建完成后出现/sys/class/switch/XXX(如hdmi、h2w等)
3、在/sys/class/switch/的具体设备文件节点目录下创建设备的属性文件(比如“name”和“state”),创建完成后出现/sys/class/switch/XXX/name和/sys/class/switch/XXX/state,具体实现如下:
static DEVICE_ATTR(state, S_IRUGO | S_IWUSR, state_show, NULL); // state_show实现对state属性文件读操作
static DEVICE_ATTR(name, S_IRUGO | S_IWUSR, name_show, NULL);//name_show实现对name属性文件读操作
int ret;
ret = device_create_file(sdev->dev, &dev_attr_name);
ret = device_create_file(sdev->dev, &dev_attr_state);

本文详细分析了Android系统中WiredAccessoryManager如何监听和处理UEvent事件,从System Server启动到创建WiredAccessoryObserver进行监控。同时探讨了Linux内核层面,涉及switch_gpio.c和switch_class.c,设备在/sys/class/switch目录下的创建以及属性文件的读写操作。
605

被折叠的 条评论
为什么被折叠?



