1、frameworks/base/services/java/com/android/server/MountListener.java
1)MountListener是一个线程,它的主循环函数是“run()”:
run函数会不停地调用“listenToSocket();”
2)listenToSocket函数会打开一个socket和"vold"守护进程进行通信,并监听来自"vold"守护进程的事件。如果监听到来自“vold”的事件,就会调用“handleEvent(event);”进行处理。
3)handleEvent函数会针对消息的类别分别进行相应的处理,比如:
} else if (event.equals(VOLD_EVT_EXTERNAL_UMS_CONNECTED)) {
mUmsConnected = true;
path = "/sdcard";
mService.notifyUmsConnected(path);
Log.d(TAG, "VOLD_EVT_EXTERNAL_UMS_CONNECTED " + event + path);
}
即当USB调试连接上时,会从“vold”收到VOLD_EVT_EXTERNAL_UMS_CONNECTED消息,然后就会调用到MountService.java的notifyUmsConnected函数。
2、frameworks/base/services/java/com/android/server/MountService.java
1)notifyUmsConnected函数:
会通过如下语句发送广播消息:
Intent intent = new Intent(Intent.ACTION_UMS_CONNECTED);
mContext.sendBroadcast(intent);
状态栏会捕捉到这个消息,然后显示相应的图标。
3、"vold"守护进程
"vold"守护进程会接收来自内核空间的事件,并进行相应的处理。
1)/system/core/vold/vold.c
主函数为main函数,在这个函数里主要接收来自内核空间的事件,并调用process_uevent_message进行处理。
2)/system/core/vold/uevent.c
process_uevent_message函数最终会调用”dispatch_uevent(event);“对消息进行分发。
dispatch_uevent会用参数去查询dispatch_table表,然后调用相应的事件处理函数,dispatch_table表定义如下:
static struct uevent_dispatch dispatch_table[] = {
{ "switch", handle_switch_event },
{ "battery", handle_battery_event },
{ "mmc", handle_mmc_event },
{ "scsi", handle_scsi_event },
{ "block", handle_block_event },
{ "bdi", handle_bdi_event },
{ "power_supply", handle_powersupply_event },
{ NULL, NULL }
};
以“switch”为例,当接收到内核的switch事件时,会调用handle_switch_event函数。
handle_switch_event函数判断事件的name和state:
static int handle_switch_event(struct uevent *event) {
......
} else if (!strcmp(name, "lcd_screen_lock")) {
if (!strcmp(state, "1"))
switch_lcdscreenlock(false);
else
switch_lcdscreenlock(true);
}
......
}
|
如果name是“lcd_screen_lock”:
如果state为“1”,则调用“switch_lcdscreenlock(false);”
如果state为“0”,则调用“switch_lcdscreenlock(true);”
3)/system/core/vold/switch.c
switch_lcdscreenlock的实现在switch.c中:
最终会调用到"send_msg(on ? VOLD_EVT_SCREENLOCK_ENABLED :
VOLD_EVT_SCREENLOCK_DISABLED);"语句,即通过socket发送VOLD_EVT_SCREENLOCK_ENABLED
或者VOLD_EVT_SCREENLOCK_DISABLED事件给监听“vold”守护进程的服务,我们这里就是MountListener线程。
MountListener.java-->handleEvent
函数中判断到VOLD_EVT_SCREENLOCK_ENABLED或者VOLD_EVT_SCREENLOCK_DISABLED事件后,会分别调用"mService.notifyScreenLockOn();"和mService.notifyScreenLockOff();":
} else if (event.startsWith(VOLD_EVT_SCREENLOCK_ENABLED)) {
mService.notifyScreenLockOn();
} else if (event.startsWith(VOLD_EVT_SCREENLOCK_DISABLED)) {
mService.notifyScreenLockOff();
}
"mService.notifyScreenLockOn();"和mService.notifyScreenLockOff();"有会分别调用sendBroadcast发送相应的消息给状态栏,以显示相应的信息:
void notifyScreenLockOff() {
if( Environment.isUnifiedDatabaseSupport() ) {
Intent intent = new Intent(Intent.ACTION_AUTOROTATE_SCREEN_DISABLED);
mContext.sendBroadcast(intent);
}
}
void notifyScreenLockOn() {
if( Environment.isUnifiedDatabaseSupport() ) {
Intent intent = new Intent(Intent.ACTION_AUTOROTATE_SCREEN_ENABLED);
mContext.sendBroadcast(intent);
}
}
阅读(2411) | 评论(0) | 转发(0) |