转:http://blog.csdn.net/liuying_0408/article/details/7446629

趁做Android WIFI驱动移植,对Android WIFI框架做了深刻的分析,并做此文档共同学习。

对上层WIFI的应用,基本流程为:(1)WIFI初始化(2)Wifi启动(3)开始扫描AP(4)显示扫描的AP (5)配置AP (6)连接AP(7)获取IP地址(8)上网

一、Android WIFI模块初始化

上文Android系统启动分析讲到在SystemServer中实例化了ConnectivityService,接着的便是WIFI初始化:
frameworks/base/services/java/com/android/server/ConnectivityService.java
ConnectivityService 的构造函数会创建WifiService,

if (DBG) Log.v(TAG, "Starting Wifi Service.");
WifiStateTracker wst = newWifiStateTracker(context, mHandler);
WifiService wifiService = newWifiService(context, wst);
ServiceManager.addService(Context.WIFI_SERVICE, wifiService);

WifiStateTracker 会创建WifiMonitor 接收来自底层的事件,WifiService 和WifiMonitor 是整个模块的核心。WifiService 负责启动关闭wpa_supplicant、启动关闭WifiMonitor 监视线程和把命令下发给wpa_supplicant,而WifiMonitor 则负责从wpa_supplicant 接收事件通知。
具体流程图如下:

二、WIFI模块启动

WirelessSettings 在初始化的时候配置了由WifiEnabler 来处理Wifi 按钮 WirelessSettings 在初始化的时候配置了由WifiEnabler 来处理Wifi 按钮

Packages\apps\settings\src\com\android\settings\WirelessSettings.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.wireless_settings);
initToggles();
mAirplaneModePreference = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE);
}
private voidinitToggles() {
…………
mWifiEnabler = new WifiEnabler(
this, (WifiManager) getSystemService(WIFI_SERVICE),
(CheckBoxPreference) wifiPreference);
…………
}

当用户按下Wifi 按钮后,Android 会调用WifiEnabler 的onPreferenceChange,再由WifiEnabler调用WifiManager 的setWifiEnabled 接口函数,通过AIDL,实际调用的是WifiService 的setWifiEnabled 函数,WifiService 接着向自身发送一条MESSAGE_ENABLE_WIFI 消息,在处理该消息的代码中做真正的使能工作:
首先装载WIFI 内核模块(该模块的位置硬编码为"/system/lib/modules/libertas_sdio.ko" ),
然后启动wpa_supplicant ( 配置文件硬编码为"/data/misc/wifi/wpa_supplicant.conf"),再通过WifiStateTracker 来启动WifiMonitor 中的监视线程。
WifiEnabler.java

public booleanonPreferenceChange(Preference preference, Object value) {
// Turn on/off Wi-Fi
setWifiEnabled((Boolean) value);
}
private voidsetWifiEnabled(final boolean enable) {
if (!mWifiManager.setWifiEnabled(enable)) {
}
}

WifiManager.java
public boolean setWifiEnabled(boolean enabled) {
returnmService.setWifiEnabled(enabled);
}
IWifiManager mService;
interface IWifiManager{
…………
booleanstartScan(boolean forceActive);
booleansetWifiEnabled(boolean enable);
…………
}
IWifiManger.aidl编译后生成了IWifiManger.java,并生成IWifiManger.Stub(服务器端抽象类)和IWifiManger.Stub.Proxy(客户端代理实现类)。WifiService通过继承IWifiManger.Stub实现,而客户端通过getService()函数获取IWifiManger.Stub.Proxy(即Service的代理类),将其作为参数传递给WifiManger,供其与WifiService通信时使用。
WifiService.java

public booleansetWifiEnabled(boolean enable) {
…………
sendEnableMessage(enable, true, Binder.getCallingUid());
…………
}
private void sendEnableMessage(boolean enable, boolean persist, int uid) {
Message msg = Message.obtain(mWifiHandler,
(enable ? MESSAGE_ENABLE_WIFI : MESSAGE_DISABLE_WIFI),
(persist ? 1 : 0), uid);
msg.sendToTarget();
}
public voidhandleMessage(Message msg) {
switch (msg.what) {
caseMESSAGE_ENABLE_WIFI:
setWifiEnabledBlocking(true, msg.arg1 == 1, msg.arg2);
case MESSAGE_START_WIFI:
mWifiStateTracker.restart();
case MESSAGE_DISABLE_WIFI:
setWifiEnabledBlocking(false, msg.arg1 == 1, msg.arg2);
case MESSAGE_STOP_WIFI:
mWifiStateTracker.disconnectAndStop();
break;
}
}
}
private booleansetWifiEnabledBlocking(boolean enable, boolean persist, int uid) {
if (enable) {
if (!WifiNative.loadDriver()) {
setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
}
if (!WifiNative.startSupplicant()) {
WifiNative.unloadDriver();
setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
}
registerForBroadcasts();
mWifiStateTracker.startEventLoop();
} else {
………………
}
// Success!
setWifiEnabledState(eventualWifiState, uid);
}
private void setWifiEnabledState(int wifiState, int uid) {
// Broadcast
final Intent intent = new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION);
}
JNIandroid_net_wifi_wifi.cpp
// ----------------------------------------------------------------------------

/*
*JNI registration.
*/
staticJNINativeMethodgWifiMethods[] = {
/* name, signature, funcPtr */
{ "loadDriver", "()Z", (void *)android_net_wifi_loadDriver },
{ "startSupplicant", "()Z", (void *)android_net_wifi_startSupplicant },
{ "scanResultsCommand", "()Ljava/lang/String;", (void*) android_net_wifi_scanResultsCommand },
{ "reconnectCommand", "()Z", (void *)android_net_wifi_reconnectCommand },
{ "scanCommand", "(Z)Z", (void*) android_net_wifi_scanCommand },
}
1)static jbooleanandroid_net_wifi_loadDriver(JNIEnv* env, jobject clazz)
{
return (jboolean)(::wifi_load_driver() == 0);
}
2)static jboolean android_net_wifi_startSupplicant(JNIEnv* env, jobject clazz)
{
return (jboolean)(::wifi_start_supplicant() == 0);
}
3)WifiStateTracker.java
mWifiStateTracker.startEventLoop();
public void startEventLoop() {
mWifiMonitor.startMonitoring();
}
//WifiMonitor.java
public void startMonitoring() {
newMonitorThread().start();
}

当使能成功后,会广播发送WIFI_STATE_CHANGED_ACTION这个Intent 通知外界WIFI已经成功使能了。//Success!后广播的。

更多相关文章

  1. [Android]高性能MMKV数据交互分析-MMKV初始化
  2. [Fuzz]Android模糊测试
  3. Android(安卓)intent flag 详解
  4. Android问题集锦之三十三:避免每次启动AS都要fetching Android(安
  5. Android(安卓)PMS(一)-启动流程
  6. Android系统使用global key 一键启动指定APP或者打开WiFi/蓝牙等
  7. Android(安卓)插件化分析(3)- Activity启动流程
  8. android HAL层
  9. 【Android系统视窗模块】Android(安卓)8与Android(安卓)9分屏模

随机推荐

  1. fifo 简单实现
  2. Android开发调试常用命令
  3. Android(安卓)拍照后显示照片
  4. root_android_open_dev
  5. Activity销毁时返回数据
  6. Android(安卓)百度 Map -----定位功能(工
  7. Android电子书翻书效果
  8. android监测本地服务
  9. android-仿iOS弹出框
  10. 常用 RecyclerView LayoutManager ItemDe