现在的位置: 首页 > 综合 > 正文

4.0Wifi加载流程,走读代码

2014年11月09日 ⁄ 综合 ⁄ 共 3002字 ⁄ 字号 评论关闭

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地址分配

 

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

抱歉!评论已关闭.