关注
Android 网络 --framework层面 -three


在<<Android 网络 --framework层面 -one>>文章中提到了NetworkFactory,本章较为详细的学习介绍下

  1. NetworkFactory 望文生义,就是网络的工厂, 它是系统中的网络工厂,也是CS向链路网络请求的统一接口,这个工厂可以生产网络也能releaseNetwork
  2. Android系统启动之初,数据和WiFi就通过WifiNetworkFactory和TelephonyNetworkFactory将自己注册到CS中,方便CS迅速响应网络请求

工厂的初始化

工厂的初始化

在frameworks/opt/telephony/src/java/com/android/internal/telephony/PhoneFactory.java
中的makeDefaultPhone方法中进行了初始(数据网络)

for (int i = 0; i < numPhones; i++) {
    sTelephonyNetworkFactories[i] = new TelephonyNetworkFactory(
            sPhoneSwitcher, sc, sSubscriptionMonitor, Looper.myLooper(),
            sContext, i, sPhones[i].mDcTracker);
}
根据卡的数量初始化对应的TelephonyNetworkFactory,一个卡一个

在frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java中初始化(wifi网络)

 void maybeRegisterNetworkFactory() {
        if (mNetworkFactory == null) {
            checkAndSetConnectivityInstance();
            if (mCm != null) {
                mNetworkFactory = new WifiNetworkFactory(getHandler().getLooper(), mContext,
                        NETWORKTYPE, mNetworkCapabilitiesFilter);
                mNetworkFactory.setScoreFilter(60);
                mNetworkFactory.register();
            }
        }
  }

工厂注册到CS

NetworkFactory继承自Handler,并通过AsyncChannel(对Messenger的一种包装,维护了连接的状态,本质上使用Messenger)建立了CS和TelephonyNetworkFactory之间的单向通信:

void register() {
    if (DBG) log("Registering NetworkFactory");
    if (mMessenger == null) {
        // 创建以自己为Handler的Messenger并传递给CS
        //
        mMessenger = new Messenger(this);
        ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger, LOG_TAG);
    }}

app申请网络情景分析

已数据网络为例子,且此次申请的request且现有NetworkAgent没有一个 “满足”的–导致新的NetworkAgent创建

CS侧代码片段分析(重点)

app可以通过requestNetwork申请网络,所有的requestNetwork网络都会已 NetworkRequestInfo 保存到HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests

public NetworkRequest requestNetwork(NetworkCapabilities networkCapabilities,
        Messenger messenger, int timeoutMs, IBinder binder, int legacyType) {

	NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType,
        nextNetworkRequestId(), type);
	NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder);
}

NetworkRequestInfo其实就是networkRequest一个包装,主要为了和messenger、binder对应,messenger为了分发消息对应的app ,binder为了监听app挂掉把对应的networkRequest在cs的mNetworkRequests中remove掉

handleRegisterNetworkRequest的方法

private void handleRegisterNetworkRequest(NetworkRequestInfo nri) {
   // hashmap的put
    mNetworkRequests.put(nri.request, nri);
    // 这个方法非常复杂,前面文章已经介绍过了
    // Attempt to rematch all Networks with NetworkRequests.  This may result in Networks being disconnected.
//  这边就给这个request寻找一个合适的NetworkAgentInfo ,此例没有
    rematchAllNetworksAndRequests(null, 0);
    if (nri.request.isRequest() && getNetworkForRequest(nri.request.requestId) == null) {
        sendUpdatedScoreToFactories(nri.request, 0);
    }
}

此处 rematchAllNetworksAndRequests(null, 0); null代表了这个request 遍历所有的NetworkAgentInfo,找到一个"满足的"
getNetworkForRequest(nri.request.requestId) =null 此例子中因为没有一个NetworkAgentInfo符合当前的requset,所以走入

sendUpdatedScoreToFactories(nri.request, 0);

进而调用的TelephonyNetworkFactory的onNeedNetworkFor(Message msg)

private void onNeedNetworkFor(Message msg) {

    mDcTracker.requestNetwork(networkRequest, localLog);

}

选择一个合适的apn, 这个apn的选择和request网络的networkCapabilities 参数有关系(type), 最终导致setupData的调用,

private boolean setupData(ApnContext apnContext, int radioTech, boolean unmeteredUseOnly) {
    applyNewState(ApnContext apnContext, boolean enabled, boolean met) 
};

拨号成功后,就会dataConnection会切换mActiveState状态,创建DcNetworkAgent, 一个网络创建成功了,CS中多了一个NetworkAgentinfo

接下来就是调用CS中的registerNetworkAgent 通过updateNetworkInfo中rematchNetworkAndRequests将此次的networkrequest加入到NetworkAgentinfo中

WIFI 网络工厂处理onNeedNetworkFor

我们可以看到,在数据网络中 数据网络工厂处理onNeedNetworkFor 是网络拨号(setupData),那WIFI中是怎么处理的呢?

protected void needNetworkFor(NetworkRequest networkRequest, int score) {
            synchronized (mWifiReqCountLock) {
                if (++mConnectionReqCount == 1) {
                    if (mWifiConnectivityManager != null && mUntrustedReqCount == 0) {
                        mWifiConnectivityManager.enable(true);
                    }
                }
            }
		 }

是的,使能了WifiConnectivityManager,启动了连接扫描,这样可能会使WIFI连接到一个可用网络,进而产生出一个WifiNetworkAgent !!

总结

至此,android网络 FWK的层面梳理完成了,比较简陋,但自认为抓住了重点, 欢迎各位同学一起讨论学习!!

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/dongziqi_csdn/article/details/111769018

文章分类Android

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--