Android 網路 --framework層面 -three
- 工廠的初始化
- 工廠的初始化
- 工廠注冊到CS
- app申請網路情景分析
- CS側代碼片段分析(重點)
- WIFI 網路工廠處理onNeedNetworkFor
- 總結
在<<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的層面梳理完成了,比較簡陋,但自認為抓住了重點, 歡迎各位同學一起討論學習!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/241038.html
標籤:其他
