[RK3288][Android6.0] WiFi在Settings中的热点开启流程小结

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92


在Settings中选择要打开wifi热点功能:

调用流程如下:

onPreferenceTreeClick ->  TetherSettings.java
    startProvisioningIfNecessary ->
        startTethering ->
            mWifiApEnabler.setSoftapEnabled ->
                setSoftapEnabled -> WifiApEnabler.java
                    setWifiTethering ->     TetherUtil.java
                        wifiManager.setWifiApEnabled ->
                            mService.setWifiApEnabled ->
                                setWifiApEnabled ->    WifiServiceImpl.java
                                    mWifiController.obtainMessage(CMD_SET_AP,...).sendToTarget ->
                                        mWifiStateMachine.setHostApRunning -> ApStaDisabledState 类
                                            setHostApRunning ->  WifiStateMachine.java
                                                 sendMessage(CMD_START_AP, wifiConfig); ->
                                                    mWifiNative.loadDriver ->     InitialState类
                                                        loadDriver ->    WifiNative.java
                                                            android_net_wifi_loadDriver -> com_android_server_wifi_WifiNative.cpp
                                                                wifi_load_driver -> wifi.c    //加载wifi驱动
                                                                    rk_wifi_load_driver
                                                    enableSoftAp ->    
                                                        mNwService.wifiFirmwareReload ->    
                                                            wifiFirmwareReload ->    NetworkManagementService.java
                                                                mConnector.execute("softap", "fwreload", wlanIface, mode); ->
                                                                    fwReloadSoftap -> SoftapController.cpp
                                                        WifiNative.startHal
                                                        transitionTo(mSoftApStartingState); ->
                                                            enter -> SoftApStartingState类
                                                                mWifiApConfigChannel.sendMessage(CMD_SET_AP_CONFIG, config); ->
                                                                    transitionTo(mActiveState); ->    WifiApConfigStore.java InactiveState类
                                                                        enter ->    ActiveState类
                                                                            writeApConfiguration    //ap配置更新到/misc/wifi/softap.conf文件中
                                                                startSoftApWithConfig(config) ->  SoftApStartingState类
                                                                    startSoftApWithConfig ->            
                                                                        run -> WifiStateMachine.java
                                                                            mNwService.startAccessPoint ->   
                                                                                startAccessPoint ->  NetworkManagementService.java
                                                                                     mConnector.execute("softap", "startap");   
                                                                                        execute ->    NativeDaemonConnector.java
                                                                                             execute(DEFAULT_TIMEOUT, cmd, args);
                                                                                                executeForList ->
                                                                                                    makeCommand

                                                                                                    mOutputStream.write    //通过socket发送cmd给netd.

                                                                                                                                             //mOutputStream在listenToSocket()初始化.   

                                                       


Netd接收到命令后:

SocketListener::runListener -> SocketListener.cpp
    onDataAvailable ->
        FrameworkListener::onDataAvailable ->    FrameworkListener.cpp
            FrameworkListener::dispatchCommand ->
                c->runCommand ->    //支持各种命令,这里是softap.
                    CommandListener::SoftapCmd::runCommand
                        sSoftapCtrl->startSoftap ->     //sSoftapCtrl在CommandListener::CommandListener()构造函数中赋值,是类SoftapController
                            SoftapController::startSoftap  -> SoftapController.cpp
                                pid = fork    //创建一个进程来处理.
                                execl(HOSTAPD_BIN_FILE, HOSTAPD_BIN_FILE,"-e", WIFI_ENTROPY_FILE,HOSTAPD_CONF_FILE, (char *) NULL)

                              

static const char HOSTAPD_BIN_FILE[]    = "/system/bin/hostapd";

所以本质上执行的是/system/bin/hostapd
hostapd -e /data/misc/wifi/entropy.bin /data/misc/wifi/hostapd.conf

参考网友画的网络框架图,因此分三个部分,分别是WIFI, DNS以及SoftAP.

[RK3288][Android6.0] WiFi在Settings中的热点开启流程小结_第1张图片


参考:

http://blog.csdn.net/jshazk1989/article/details/8988444

http://blog.csdn.net/tony_hrwk/article/details/17550497

状态机:

http://blog.csdn.net/wsb1321/article/details/8021620

http://www.cnblogs.com/bastard/archive/2012/06/05/2536258.html

你可能感兴趣的:(子类__WiFi)