wifi 连接流程记录
connectToUserSelectNetwork 包括请求连接的netid号,请求的app uid ,已经是否是属于已经保存的app hasCredentialChanged
case WifiManager.CONNECT_NETWORK:
if (!connectToUserSelectNetwork(
netId, message.sendingUid, hasCredentialChanged))
mWifiConfigManager.getConfiguredNetwork(netId)//从config中获取netId的配置
if (!mWifiConfigManager.enableNetwork(netId, true, uid)
|| !mWifiConfigManager.checkAndUpdateLastConnectUid(netId, uid)) //启动netId,并且保证netId与上一次
else
mWifiConnectivityManager.setUserConnectChoice(netId);//记录用户选择的Uid,下次可以直接连接
forceReconnect 表示 如果已经连接到network,就不必重新连接,因此此时forceReconnect = false。若没有连接到则需要重新连接
if (!forceReconnect && mWifiInfo.getNetworkId() == netId) {
// We're already connected to the user specified network, don't trigger a
// reconnection unless it was forced.
logi("connectToUserSelectNetwork already connecting/connected=" + netId);
} else {
mWifiConnectivityManager.prepareForForcedConnection(netId);
startConnectToNetwork(netId, uid, SUPPLICANT_BSSID_ANY);
}
wifiConfigManager.java中enable过程需要完成哪些操作
if (!doesUidBelongToCurrentUser(uid)) {//属于当前用户
WifiConfiguration config = getInternalConfiguredNetwork(networkId);可以获取到config
if (!canModifyNetwork(config, uid, ALLOW_LOCKDOWN_CHECK_BYPASS))能够修改net参数
config.lastConnectUid = uid;//保存当前设置的uid
if (!updateNetworkSelectionStatus(
networkId, WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLE))//更新选择状态
if (disableOthers) { setLastSelectedNetwork(networkId);
saveToStore(true);//保存信息
状态机原理:在某一状态下,该状态的所有消息都是在同一process方法上处理的,只是线程不同而已。Process是主线程,其余sendmessege是分线程
connectToUserSelectNetwork
-> startConnectToNetwork
-> sendMessage(CMD_START_CONNECT, networkId, uid, bssid);
handle机制
connectmodestate 的case CMD_START_CONNECT:
-> if (mWifiNative.connectToNetwork(config)) {//调用了native 的connectToNetwork方法
->mSupplicantStaIfaceHal.connectToNetwork(configuration) //调用supplicantStaIfaceHal的接口
->if (!mCurrentNetworkRemoteHandle.select())//这个是SupplicantStaNetworkHal的接口
->mISupplicantStaNetwork.select(); //在往下就是AIDL方式调用的接口
->android.hardware.wifi.supplicant.V1_0.SupplicantStatus;HAL层
HAL层接口hardware/interfaces/wifi/supplicant/1.0/* 里面都是HIDL的接口函数,再往下就是supplicant的库函数了,暂时没有找到在哪里
同理回调函数也是先到supplicantStaNetworkHal中的stu子类中,然后通过handle机制,一步一步往上传递消