4.0Wifi加载流程,走读代码

来源:互联网 发布:双十一淘宝半价吗 编辑:程序博客网 时间:2024/05/30 23:05

转自http://blog.csdn.net/w250shini11/article/details/7795678

WifiServiceWifiMonitor是整个模块的核心部分,WifiStateMachine会创建WifMonitor来接受来自底层wpa_supplicant的事件。WifiService负责启动关闭wpa_supplicant、发命令给wpa_supplicant进程。

一、

1SystemServer启动后会加载一系列的Service,其中init2启动的就有ConnectivityService.

ConnectivityService.java(frameworks/base/services/java/com/android/server)会管理所有的Connectivity相关的比如APNWiFi.

2、并且在SystemServer中加载了WifiService

try {

Slog.i(TAG,"Wi-Fi Service");

wifi = new WifiService(context);

ServiceManager.addService(Context.WIFI_SERVICE, wifi);

} catch (Throwable e) {

reportWtf("starting Wi-Fi Service", e);

}

3、启动了WifiService,就相当于启动了WifiStateMachine,因为在WifiService构造函数中有:

mWifiStateMachine = new WifiStateMachine(mContext, mInterfaceName);

二、WiFi的启动过程:

1、用户在应用层开启了WiFi后,会调用到WifiEnabler.java中的mWifiManager.setWifiEnabled(isChecked)

2、查看WifiManager中的setWifiEnabled方法:

public boolean setWifiEnabled(boolean enabled){

try {

returnmService.setWifiEnabled(enabled);

} catch(RemoteException e) {

return false;

}

}

可以mService.setWifiEnabled(enabled);调用的WifiService中的setWifiEnabled方法,查看setWifiEnabled方法中有mWifiStateMachine.setWifiEnabled(enable);

3、查看WifiStateMachine类的setWifiEnabled方法:

public void setWifiEnabled(boolean enable) {

mLastEnableUid.set(Binder.getCallingUid());

if (enable) {

/* Argument isthe state that is entered prior to load */

sendMessage(obtainMessage(CMD_LOAD_DRIVER, WIFI_STATE_ENABLING, 0));

sendMessage(CMD_START_SUPPLICANT);

} else {

sendMessage(CMD_STOP_SUPPLICANT);

/* Argument isthe state that is entered upon success */

sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_STATE_DISABLED, 0));

}

}

因为此时enabletrue,所以sendMessage(obtainMessage(CMD_LOAD_DRIVER,WIFI_STATE_ENABLING, 0));会执行。

4、接下来会执行DriverLoadingState内部类,在其方法enter中有:

if(WifiNative.loadDriver()){

if(DBG) log("Driver load successful");

sendMessage(CMD_LOAD_DRIVER_SUCCESS);

}

WifiNative.loadDriver函数WifiNative.java (frameworks/base/wifi/java/android/net/wifi) AndroidWIFI系统的JNI的部分:

frameworks/base/core/jni/android_net_wifi_Wifi.cpp中的android_net_wifi_loadDriver()可以把wifi驱动模块装载

Wifi.c(hardware/libhardware_legacy/wifi)内核模块/system/lib/modules/wlan.ko中的wifi_load_driver()

设置wlan.driver.status属性为ok

5、(猜想)wifi驱动加载完毕后,应该加载wpa_supplicant了,于是,猜想,WifiStateMachine类汇总的DriverLoadingState状态执行完后,应该会进入DriverLoadedState状态(看名字是这样,可以打log验证下),在DriverLoadingState中的processMessage方法中有:

if(WifiNative.startSupplicant()){

if (DBG) log("Supplicant startsuccessful");

mWifiMonitor.startMonitoring();

transitionTo(mSupplicantStartingState);

}

上面这段代码是在case CMD_START_SUPPLICANT:中,(猜想),在DriverLoadingState状态执行完后应该有CMD_START_SUPPLICANT的时间发出。

此时,WifiMonitorstartMonitoring方法已经被调用:

public voidstartMonitoring() {

new MonitorThread().start();

}

MonitorThread被启动,一个循环,一直监听底层上报的事件。

看一下WifiNative.startSupplicant()

startSupplicant来启动JNIframeworks/base/core/jni/android_net_wifi_Wifi.cppandroid_net_wifi_startSupplicant调用驱动模块Wifi.c(hardware/libhardware_legacy/wifi) wlan.ko中的wifi_start_supplicant

6、至此wifi模块加载完毕。

三、

之后就需要:

1、 查找热点AP

2、 WiFi连接

3、 IP地址分配

此流程只是自己分析,可能有不正确之处