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
Android之wifi工作流程
Android Wifi的工作流程 一、WIFI工作相關部分 Wifi 網絡卡狀態 1. WIFI_STATE_DISABLED:WIFI網絡卡不可用 2. WIFI_STATE_DISAB