Android 网络 --framework层面 -three
在<<Android 网络 --framework层面 -one>>文章中提到了NetworkFactory,本章较为详细的学习介绍下
- NetworkFactory 望文生义,就是网络的工厂, 它是系统中的网络工厂,也是CS向链路网络请求的统一接口,这个工厂可以生产网络也能releaseNetwork
- 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