ConnectivityService
管理网络连接的服务层,其中维护了 NetworkAgent 对象列表,每种网络连接都会创建对应的 Agent 用于管理;
NetworkAgent 其实是通过 AsyncChannel 与 ConnectivityService 之间通信的
- ConnectivityService:handleRegisterNetworkProvider 中参数为 NetworkProviderInfo,其中包含 Messenger 成员,通过其 AsyncChannel 的 connect 连接;
- ConnectivityService:在 InternalHandler 中处理消息 EVENT_REGISTER_NETWORK_PROVIDER,就是上面的连接过程;
- ConnectivityService:在 registerNetworkFactory 或者 registerNetworkProvider 中向内部发送了上面的消息,从而触发处理过程;
- ClientModeImpl:在 registerNetworkFactory 中初始化了 ConnectivityManager 对象 mCm 为 CONNECTIVITY_SERVICE 对象引用,然后调用了 WifiNetworkFactory 对象 mNetworkFactory 的 register 注册,这里 NetworkFactory 是基类,其 register 中创建了 NetworkProvider 对象,并且调用了 CONNECTIVITY_SERVICE 的 registerNetworkProvider 将其注册
/* Registers this NetworkFactory with the system. May only be called once per factory. */
public void register() {
if (mProvider != null) {
throw new IllegalStateException("A NetworkFactory must only be registered once");
}
if (DBG) log("Registering NetworkFactory");
mProvider = new NetworkProvider(mContext, NetworkFactory.this.getLooper(), LOG_TAG) {
@Override
public void onNetworkRequested(@NonNull NetworkRequest request, int score,
int servingProviderId) {
handleAddRequest(request, score, servingProviderId);
}
@Override
public void onNetworkRequestWithdrawn(@NonNull NetworkRequest request) {
handleRemoveRequest(request);
}
};
((ConnectivityManager) mContext.getSystemService(
Context.CONNECTIVITY_SERVICE)).registerNetworkProvider(mProvider);
}
- ClientModeImpl:在 CMD_BOOT_COMPLETED 消息处理时进行 registerNetworkFactory 操作,最终回归到 ConnectivityService 的 registerNetworkProvider
- ClientModeImpl:在 handleBootCompleted 中发出 CMD_BOOT_COMPLETED 消息;
- WifiServiceImpl:在 handleBootCompleted 中调用了 mClientModeImpl.handleBootCompleted(),系统中 SystemService 启动流程中 onBootPhase 调用了每种 Service 的 handleBootCompleted 接口;
进而在 ConnectivityService:handleRegisterNetworkProvider 中 connect 之后调用了 sendAllRequestsToProvider 调用了 NetworkProviderInfo 的 requestNetwork 接口,其实就是通过 AsyncChannel 发送了 CMD_REQUEST_NETWORK 消息;
void requestNetwork(NetworkRequest request, int score, int servingProviderId) {
if (isLegacyNetworkFactory()) {
mAsyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score,
servingProviderId, request);
} else {
sendMessageToNetworkProvider(NetworkProvider.CMD_REQUEST_NETWORK, score,
servingProviderId, request);
}
}
对 ClientModeImpl 来讲是 WifiNetworkFactory 采用了 AsyncChannel,调用了 handleMessage 进行处理:
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CMD_REQUEST_NETWORK: {
handleAddRequest((NetworkRequest) msg.obj, msg.arg1, msg.arg2);
break;
}
case CMD_CANCEL_REQUEST: {
handleRemoveRequest((NetworkRequest) msg.obj);
break;
}
case CMD_SET_SCORE: {
handleSetScore(msg.arg1);
break;
}
case CMD_SET_FILTER: {
handleSetFilter((NetworkCapabilities) msg.obj);
break;
}
}
}
其 handleAddRequest 调用了 needNetworkFor 接口,WifiNetworkFactory 重写了该接口,进入了连接和扫描的过程。
在 ClientModeImpl 中 L2ConnectedState 状态下的 enter 过程中创建了 WifiNetworkAgent 对象 mNetworkAgent,通过其 register 接口将 NetworkAgent 对象调用 CONNECTIVITY_SERVICE 服务的 registerNetworkAgent 注册;
registerNetworkAgent 执行了 mDeps.getNetworkStack().makeNetworkMonitor 操作,传入了 NetworkMonitorCallbacks 对象;
在 NetworkStackService 中的 NetworkStackConnector 中执行了 makeNetworkMonitor 操作,解这调用了 INetworkMonitorCallbacks 的 onNetowrkMonitorCreated 接口,传入了新创建的 NetworkMonitorConnector 对象;
在 ConnectivityService 中,NetworkMonitorCallbacks 的 onNetworkMonitorCreated 接口中调用了 mHandler 的 sendMessage 发出了 EVENT_REGISTER_NETWORK_AGENT 消息,触发其中 InternalHandler 的 handleMessage 被调用,从而 调用 handleRegisterNetworkAgent;
handleRegisterNetworkAgent 启动了 NetworkMonitor (NetworkMonitorConnector)状态机,并且调用了 nai.asyncChannel.connect(mContext, mTrackerHandler, nai.messenger); 进行了 AsyncChannel 的连接,其中 nai 就是上面 registerNetworkAgent 创建的 NetworkAgentInfo 对象,从而连接到对应的 WifiNetworkAgent;
在回过去,这里调用了 updateLinkProperties 更新从 NetworkAgent 发送过来的 LinkProperties 信息;
其处理过程发生在 handleUpdateLinkProperties 接口,是在 maybeHandleNetworkAgentMessage 处理 NetworkAgent.EVENT_NETWORK_PROPERTIES_CHANGED 消息时调用,而实际上是在 NetworkStateTrackerHandler 类的 handleMessage 处理过程中;
NetworkStateTrackerHandler 在 ConnectivityService 中的对象 mTrackerHandler 在 handleRegisterNetworkProvider 中被用于连接处理 syncChannel 消息,该消息来自 NetworkProvider;
同样它被用来在上面提到的 handleRegisterNetworkAgent 中处理 AsyncChannel 的消息,也就是来自 NetworkAgent 的消息;
在 ClientModeImpl 中 updateLinkProperties 接口调用了 mNetworkAgent 也就是 WifiNetworkAgent 的 sendLinkProperties 接口发送 LinkProperties 用于更新;
前面博文分析过,ClientModeImpl 在 DefaultState 下处理所有的 CMD_UPDATE_LINKPROPERTIES 消息,调用 updateLinkProperties 发出。