1. 程式人生 > >Android Wifi框架流程分析

Android Wifi框架流程分析

這裡寫圖片描述

這裡寫圖片描述

//在 SystemServer 啟動的時候,啟動WifiService呼叫關係如下:
public static void main(String[] args) {
        new SystemServer().run();
    }
private void run() {
……
startOtherServices();
……
}
startOtherServices(){
......
               mSystemServiceManager.startService(WIFI_P2P_SERVICE_CLASS);
                mSystemServiceManager.startService(WIFI_SERVICE_CLASS);
                mSystemServiceManager.startService(
                            "com.android.server.wifi.WifiScanningService"
); mSystemServiceManager.startService("com.android.server.wifi.RttService"); …… }

當用戶按下 Wifi 按鈕後, 在設定裡呼叫 WifiEnabler 的 onSwitchChanged()方法, 在這個方法裡又 呼叫 WifiManager 的 setWifiEnabled 介面函式,通過 AIDL,實際呼叫的是 WifiService (即WifiServiceImpl)的setWifiEnabled 函式:

//setWifiEnabled 函式:
// WifiServiceImpl.java
public synchronized boolean setWifiEnabled(boolean enable) { …… mWifiController.obtainMessage(CMD_WIFI_TOGGLED, mWifiIpoOff ? 1 : 0) …… } // WifiController.java //其建構函式如下: WifiController(Context context, WifiServiceImpl service, Looper looper) { super(TAG, looper); …… addState(mDefaultState); addState(mApStaDisabledState, mDefaultState); addState(mStaEnabledState, mDefaultState); addState(mDeviceActiveState, mStaEnabledState); …… if
(isScanningAlwaysAvailable) { setInitialState(mStaDisabledWithScanState); } else { setInitialState(mApStaDisabledState); } …… }

然後看類:class ApStaDisabledState extends State {
……

public boolean processMessage(Message msg) {
            SXlog.d(TAG, getName() + msg.toString() + "\n");
            switch (msg.what) {
                case CMD_WIFI_TOGGLED:
                case CMD_AIRPLANE_TOGGLED:
    ……
     if (mSettingsStore.isWifiToggleEnabled()) {

                        if (doDeferEnable(msg)) {
                            if (mHaveDeferredEnable) {
                                //  have 2 toggles now, inc serial number an ignore both
                                mDeferredEnableSerialNumber++;
                            }
                            mHaveDeferredEnable = !mHaveDeferredEnable;
                            break;
                        }
                        if (mDeviceIdle == false) {
                            transitionTo(mDeviceActiveState);
                        } else {
                            checkLocksAndTransitionWhenDeviceIdle();
                        }
                    ///M: check scan always avaliable only when ipo change from ipo on to off or airplane   //mode with no  ipo off
                    }
    ……
class StaEnabledState extends State {
        @Override
        public void enter() {

            if (DBG) log(getName() + "\n");
            mWifiStateMachine.setSupplicantRunning(true);
        }
       ……
}

class DeviceActiveState extends State {
        @Override
        public void enter() {
            if (DBG) log(getName() + "\n");

            mWifiStateMachine.setOperationalMode(WifiStateMachine.CONNECT_MODE);
            mWifiStateMachine.setDriverStart(true);
            mWifiStateMachine.setHighPerfModeEnabled(false);
        }
        ……
}

// WifiStateMachine.java
public void setSupplicantRunning(boolean enable) {
        if (enable) {
            sendMessage(CMD_START_SUPPLICANT);
        } else {
            sendMessage(CMD_STOP_SUPPLICANT);
        }
    }
public void setDriverStart(boolean enable) {
        if (enable) {
            sendMessage(CMD_START_DRIVER);
        } else {
            sendMessage(CMD_STOP_DRIVER);
        }
    }
這樣一來又要看WifiStateMachine裡的狀態
InitialState
public boolean processMessage(Message message) {
            logStateAndMessage(message, getClass().getSimpleName());
            switch (message.what) {
                case CMD_START_SUPPLICANT:
                    if (mWifiNative.loadDriver()) {
                        ……
                       /* Stop a running supplicant after a runtime restart
                        * Avoids issues with drivers that do not handle interface down
                        * on a running supplicant properly.
                        */
                        mWifiMonitor.killSupplicant(mP2pSupported);
                        if(mWifiNative.startSupplicant(mP2pSupported)) {
                            setWifiState(WIFI_STATE_ENABLING);
                            if (DBG) log("Supplicant start successful");
                            mWifiMonitor.startMonitoring();
                            transitionTo(mSupplicantStartingState);
                        } ……

}

首先裝載 WIFI 核心模組(該模組的位置硬編碼為“/system/lib/modules/wlan.ko” ), 然 後 啟 動 wpa_supplicant ( 配 置 文 件 硬 編 碼 為“/data/misc/wifi/wpa_supplicant.conf”) 啟動 WifiMonitor 中的監視執行緒。


當使能成功後,會廣播發送 WIFI_STATE_CHANGED_ACTION 這個 Intent 通知外界 WIFI已 經 成 功 使 能 了 。 WifiSettings 創 建 的 時 候 就 會 向 Android 注 冊 接 收WIFI_STATE_CHANGED_ACTION,因此它會收到該 Intent,從而開始掃描。          if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
                    WifiManager.WIFI_STATE_UNKNOWN));
        } 

private void updateWifiState(int state) {
        Activity activity = getActivity();
        if (activity != null) {
            activity.invalidateOptionsMenu();
        }

        switch (state) {
            case WifiManager.WIFI_STATE_ENABLED:
                mScanner.resume();
……

void resume() {
            if (!hasMessages(0)) {
                sendEmptyMessage(0);
            }
        }
public void handleMessage(Message message) {
            if (mWifiSettings.mWifiManager.startScan()) {
                mRetry = 0;
            }
……
//最後就是往 wpa_supplicant 傳送 SCAN 命令.

這裡寫圖片描述

當 wpa_supplicant 處理完 SCAN 命令後,它會向控制通道傳送事件通知掃描完成,從而wifi_wait_for_event 函式會接收到該事件,由此 WifiMonitor 中的 MonitorThread 會被執行,處理事件: void handleEvent(int event, String remainder) { case SCAN_RESULTS:
mStateMachine.sendMessage(SCAN_RESULTS_EVENT);
最後就是在WifiStateMachine中傳送廣播:SCAN_RESULTS_AVAILABLE_ACTION.
WifiSettings註冊了此廣播, 收到後會更新UI顯示列表.
這裡寫圖片描述

相關推薦

Android Wifi框架流程分析

//在 SystemServer 啟動的時候,啟動WifiService呼叫關係如下: public static void main(String[] args) { new SystemServer().run(); } pr

Android wifi 掃描流程 分析

void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec) { int res; if (wpa_s->p2p_mgmt) { wpa_dbg(wpa_s, MSG_DEBU

[譯]Android Application啟動流程分析

譯者注: 原文分成兩個部分, 連結如下: http://multi-core-dump.blogspot.com/2010/04/android-application-launch.html http://multi-core-dump.blogspot.com/2010/04/

Android wifi開啟流程(Android O)

根據自己的理解整理了Android O的wifi啟動流程,為便於理解,繪製了Android O wifi架構圖。有理解不到之處和錯誤之處,請各位指出,一起學習。 一. Android O wifi 架構: 由於Android O的Treble化,Android O

Android 呼吸燈流程分析(一)

一、Android 呼吸燈的使用      在講呼吸燈實現流程之前,我們先看一下如何使用它。      Android提供了呼吸燈的介面,我們可以通過該介面,控制呼吸燈的閃爍頻率和佔空比。具體程式碼如下: package com.example.test; import

Android Application啟動流程分析

作者曾經在高通的Android效能組工作, 主要工作是優化Android Application的啟動時間. 1, App基礎理論 要想優化App啟動時間, 第一步就是了解App啟動程序的工作原理. 有幾個基礎理論: Android Application與其他移

Android 呼吸燈流程分析(二)

一、Android呼吸燈Driver實現       1、註冊驅動       程式碼位置:mediatek/kernel/drivers/leds/leds_drv.c 602static struct platform_driver mt65xx_leds_drive

wifi連線流程分析

Wifi 連線部分 當用戶選擇一個AP時會彈出一個AP引數配置對話方塊,此對話方塊會顯示當前選擇的AP訊號強度,若此AP設定了密碼則需要使用者輸入密碼才能登入。WifiSettings中的onPreferenceTreeClick會被呼叫@Override pub

android wifi斷開原因分析

最近在解bug的過程中經常遇到密碼正確但處於saved的狀態,總結原因有已下幾種:1 在ASSOCIATING階段由於丟包導致ASSOC REJECT03-16 09:22:12.440 D/WifiMonitor( 924): Event [IFNAME=wlan0 CT

Android Activity啟動流程分析

概述 Activity作為Android的四大元件之一,Android主要的介面組成部分,用於直接跟使用者進行互動操作,在面試中與Activity相關的知識也是經常被問到,如果你面試的高階崗位,那麼對Activity的啟動和繪製流程就必須的熟悉,本文將從Act

Android 4.4Telephony流程分析SIM卡開機時的資料載入

本文程式碼以MTK平臺Android 4.4為分析物件,與Google原生AOSP有些許差異,請讀者知悉。 本文主要介紹sim卡資料的讀取過程,當射頻狀態處於準備狀態時,此時UiccCardApplication應處於AppState.APPSTATE_READ

android camera2 API流程分析

Android camera2 API流程分析 Android5.0之後,新推出來了一個類,android.hardware.ca

android之MTP框架流程分析

1 static void android_mtp_MtpServer_add_storage(JNIEnv *env, jobject thiz, jobject jstorage) 2 { 3 Mutex::Autolock autoLock(sMutex); 4 5

Android之 MTP框架流程分析 (3)

前面轉發了篇部落格介紹了MTP, 偏重於上層,已經很清楚了。這篇側重於底層,按照一定的流程講。 1. 程式碼位置 packages/providers/MediaProvider/src/com/android/providers/media/MtpReceiver.j

Android MTP框架流程分析

packages/providers/MediaProvider/src/com/android/providers/media/MtpReceiver.java packages/providers/MediaProvider/src/com/android/providers/media/MtpS

Android之 MTP框架流程分析

1 static void android_mtp_MtpServer_add_storage(JNIEnv *env, jobject thiz, jobject jstorage) 2 { 3 Mutex::Autolock autoLock(sMutex); 4 5

Android Camera fw學習(四)-recording流程分析

應用開發 facet internal server 中一 sca med erase 流程分析 Android Camera fw學習(四)-recording流程分析 備註:備註:本文是Android5.1學習筆記。博文按照軟件啟動流程分析。   且行且惜,一步一個腳印

[Abp 源碼分析] 一、Abp 框架啟動流程分析

arch rep man job dsi 法則 依賴 gconf dep Abp 不一定僅用於 Asp.Net Core 項目,他也可以在 Console 與 WinFrom 項目當中進行使用,所以關於啟動流程可以分為兩種,一種是 Asp.Net Core 項目的啟動流程

三大框架(ssh)學習——Struts2工作流程分析

Struts2工作流程分析   STRUTS2框架內部流程 1. 客戶端傳送請求的tomcat伺服器。伺服器接受,將HttpServletRequest傳進來。 2. 請求經過一系列過濾器(如:ActionContextCleanUp、SimeMesh等) 3. Fil

Androidwifi工作流程

Android Wifi的工作流程 一、WIFI工作相關部分 Wifi 網絡卡狀態 1.    WIFI_STATE_DISABLED:WIFI網絡卡不可用 2.    WIFI_STATE_DISAB