WifiService和WifiMonitor是整个模块的核心部分,WifiStateMachine会创建WifMonitor来接受来自底层wpa_supplicant的事件。WifiService负责启动关闭wpa_supplicant、发命令给wpa_supplicant进程。
一、
1、SystemServer启动后会加载一系列的Service,其中init2启动的就有ConnectivityService.
ConnectivityService.java(frameworks/base/services/java/com/android/server)会管理所有的Connectivity相关的比如APN,WiFi.
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));
}
}
因为此时enable为true,所以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) Android的WIFI系统的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的时间发出。
此时,WifiMonitor的startMonitoring方法已经被调用:
public voidstartMonitoring() {
new MonitorThread().start();
}
MonitorThread被启动,一个循环,一直监听底层上报的事件。
看一下WifiNative.startSupplicant():
startSupplicant来启动JNI:frameworks/base/core/jni/android_net_wifi_Wifi.cpp的android_net_wifi_startSupplicant调用驱动模块Wifi.c(hardware/libhardware_legacy/wifi) wlan.ko中的wifi_start_supplicant
6、至此wifi模块加载完毕。
三、
之后就需要:
1、 查找热点AP
2、 WiFi连接
3、 IP地址分配
此流程只是自己分析,可能有不正确之处