Android 网络 --framework层面 -three

本文详细介绍了Android系统中网络工厂的初始化过程,包括数据网络和WiFi网络如何注册到核心服务(CS)。重点分析了当应用程序申请网络时,CS如何响应并选择合适的APN进行网络连接,以及WiFi网络工厂如何处理网络请求,涉及到的组件如NetworkFactory、AsyncChannel和NetworkRequestInfo。最后,文章总结了Android网络框架的关键点,适合对Android网络感兴趣的读者深入学习。
部署运行你感兴趣的模型镜像


在<<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的层面梳理完成了,比较简陋,但自认为抓住了重点, 欢迎各位同学一起讨论学习!!

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值