2. 自动打开网卡并启动wpa_supplicant
图形界面可以正常启动网卡并开始AP扫描,但通过命令行wpa_cli无法启动,为此修改wpa_supplicant程序,输出所有argv参数,然后通过图形界面的设置来启动AP扫描,设置->无线接口->启动WiFi,输出如下参数:
1257946571.827087: /system/bin/wpa_supplicant
1257946571.827453: -Dtiwlan0
1257946571.827545: -itiwlan0
1257946571.827636: -c/data/misc/wifi/wpa_supplicant.conf
手工输入 wpa_supplicant -Dtiwlan0 -itiwlan0 -c/data/misc/wifi/wpa_supplicant.conf 还是启动失败。通过跟踪图形界面的java代码,定位android/packages/apps/Settings/src/com/android/settings/wifi下的java文件,确定是WifiEnabler.java,调用路径为:WifiEnabler->WifiManager.setWifiEnabled 接口函数,通过AIDL->WifiServic.setWifiEnabled函数,它向自身发送一条 MESSAGE_ENABLE_WIFI 消息, 处理代码handleMessage中调用setWifiEnabledBlocking,该函数代码如下:
…
if (enable) {
if (!WifiNative.loadDriver()) {}
if (!WifiNative.startSupplicant()) {}
..... } else {
if (!WifiNative.stopSupplicant()) {}
if (!WifiNative.unloadDriver()) { }
}
}
WifiNative.java使用JNI机制,对应的c文件是android/hardware/libhardware_legacy/wifi/wifi.c, 其中包括以下核心函数:
int wifi_load_driver();
int wifi_unload_driver();
int wifi_start_supplicant();
int wifi_stop_supplicant();