android 4.0 wifi初始化(應用層 + 框架層)
1、在android/frameworks/base/services/java/com/android/server/目錄下
SystemServer.java 中
class ServerThread extends Thread {
。。。。。。。。。。。。。。。。。。。。。。。
@Override
public void run() {
。。。。。。。。。。。。。。。。。。。。
ConnectivityService connectivity = null;
WifiP2pService wifiP2p = null;
WifiService wifi = null;
。。。。。。。。。。。。。。。。。。
try { //實例化WifiP2pService
Slog.i(TAG, "Wi-Fi P2pService");
wifiP2p = new WifiP2pService(context);
ServiceManager.addService(Context.WIFI_P2P_SERVICE, wifiP2p);
} catch (Throwable e) {
reportWtf("starting Wi-Fi P2pService", e);
}
try { //實例化WifiService
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);
}
try { //實例化ConnectivityService
Slog.i(TAG, "Connectivity Service");
connectivity = new ConnectivityService(
context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
networkStats.bindConnectivityManager(connectivity);
networkPolicy.bindConnectivityManager(connectivity);
wifi.checkAndStartWifi();
wifiP2p.connectivityServiceReady();
connectivity.startCne();
} catch (Throwable e) {
reportWtf("starting Connectivity Service", e);
}
。。。。。。。。。。。。。。。。。
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。
}
在ServerThread.run()中實例化WifiP2pService、WifiService、ConnectivityService,並將三個服務均添加到ServiceManager中。在實例化ConnectivityService中,檢測和啓動wifi。
註釋:對象實例化的同時就會分配存儲空間,然後對成員變量進行初始化賦值,再執行構造函數。這個過程就是對象初始化。調用構造函數只是初始化的一部分。
有關於addService():
./base/core/java/android/os/ServiceManager.java
在android/frameworks/base/core/java/android/os/ServiceManager.java中:
public final class ServiceManager {
。。。。。。。。。。。。。
/**
* Place a new @a service called @a name into the service
* manager.
*
* @param name the name of the new service
* @param service the service object
*/
public static void addService(String name, IBinder service) {
try {
getIServiceManager().addService(name, service, false);
} catch (RemoteException e) {
Log.e(TAG, "error in addService", e);
}
}
。。。。。。。。。。。。。。。。。
}
由上可知:
ServiceManager.addService(Context.WIFI_SERVICE, wifi):
將名字爲“Context.WIFI_SERVICE”的wifi 服務添加到service manager中。
2、frameworks/base/services/java/com/android/server/ConnectivityService.java
在ConnectivityService 的構造函數會創建WifiStateTracker,
public class ConnectivityService extends IConnectivityManager.Stub {
.........................
public ConnectivityService(Context context, INetworkManagementService netd,
INetworkStatsService statsService, INetworkPolicyManager policyManager)
{
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
/*
* Create the network state trackers for Wi-Fi and mobile
* data. Maybe this could be done with a factory class,
* but it's not clear that it's worth it, given that
* the number of different network types is not going
* to change very often.
*/
//創建WifiStateTracker
for (int netType : mPriorityList) {
switch (mNetConfigs[netType].radio) {
case ConnectivityManager.TYPE_WIFI:
mNetTrackers[netType] = new WifiStateTracker(netType,
mNetConfigs[netType].name);
mNetTrackers[netType].startMonitoring(context, mHandler);
break;
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
}
.........................
}
3、android/frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java
在WifiStateTracker中實例化WifiManager和WifiReceiver。
/**
* Track the state of wifi for connectivity service.
*
* @hide
*/
public class WifiStateTracker implements NetworkStateTracker {
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
/**
* Begin monitoring wifi connectivity
*/
public void startMonitoring(Context context, Handler target) {
mCsHandler = target;
mContext = context;
mWifiManager=(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
mWifiStateReceiver = new WifiStateReceiver();
mContext.registerReceiver(mWifiStateReceiver, filter);
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
}
4、在WifiService中實例化WifiStateMachine,在WifiStateMachine中實例化WifiMonitor。
在android/frameworks/base/services/java/com/android/server中
WifiService.java:
/**
* WifiService handles remote WiFi operation requests by implementing
* the IWifiManager interface.
*/
//TODO: Clean up multiple locks and implement WifiService
// as a SM to track soft AP/client/adhoc bring up based
// on device idle state, airplane mode and boot.
public class WifiService extends IWifiManager.Stub {
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
WifiService(Context context) {
。。。。。。。。。。。。。。。。。。。。。。。。。
mWifiStateMachine = new WifiStateMachine(mContext, mInterfaceName);
mWifiStateMachine.enableRssiPolling(true);
。。。。。。。。。。。。。。。。。。。。。。。。。
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
}
在WifiStateMachine中實例化WifiMonoitor,
/**
* Track the state of Wifi connectivity. All event handling is done here,
* and all changes in connectivity state are initiated here.
*
* Wi-Fi now supports three modes of operation: Client, Soft Ap and Direct
* In the current implementation, we do not support any concurrency and thus only
* one of Client, Soft Ap or Direct operation is supported at any time.
*
* The WifiStateMachine supports Soft Ap and Client operations while WifiP2pService
* handles Direct. WifiP2pService and WifiStateMachine co-ordinate to ensure only
* one exists at a certain time.
*
* @hide
*/
public class WifiStateMachine extends StateMachine {
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
private WifiMonitor mWifiMonitor;
mWifiMonitor = new WifiMonitor(this, mWifiNative);
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
}
WifiStateMachine 會創建WifiMonitor 接收來自底層的事件,WifiService 和WifiMonitor 是整個模塊的核心。WifiService 負責啓動關閉wpa_supplicant、啓動關閉WifiMonitor 監視線程和把命令下發給wpa_supplicant,而WifiMonitor 則負責從wpa_supplicant 接收事件通知。