Android 网络代理的创建

20 篇文章 5 订阅

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 发出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值