【私人备忘录】Android P 数据业务开启代码流程(一)

一、上层:
上层调用TelephonyManager.setDataEnabled(true)

二、Telephony Services:
TelephonyManager.setDataEnabled(true) → PhoneInterfaceManager.setUserDataEnabled(phone.setUserDataEnabled) → GsmCdmaPhone.setUserDataEnabled

三、Telephony Frameworks:
GsmCdmaPhone.setUserDataEnabled(mDcTracker.setUserDataEnabled) → DcTracker.setUserDataEnabled(onSetUserDataEnabled) → DcTracker.onTrySetupData() → setupDataOnConnectableApns → trySetupData(boolean retValue = setupData(apnContext, radioTech, dataConnectionReasons.contains(DataAllowedReasonType.UNMETERED_APN))) → setupData(dcac.bringUp(apnContext, profileId, radioTech, unmeteredUseOnly, msg, generation)) → DcAsyncChannel.bringUp(sendMessage(DataConnection.EVENT_CONNECT, mLastConnectionParams)) → DataConnection(关闭到开启,先看DcInactiveState,case EVENT_CONNECT).onConnect(mDataServiceManager.setupDataCall) → DataServiceManager.setupDataCall(mIDataService.setupDataCall) → CellularDataService. setupDataCall(mPhone.mCi.setupDataCall) → RIL.setupDataCall(radioProxy.setupDataCall)
备注:
1、DcTracker的onSetUserDataEnabled中mPhone.notifyUserMobileDataStateChanged通知数据发生变化,如果是开启数据还会reevaluateDataConnections()和onTrySetupData,我们主要看onTrySetupData。
2、关于DcAsyncChannel和DataConnection什么时候勾搭上的,看下DcTracker中DcAsyncChannel怎么创建的DcAsyncChannel dcac = telephonyComponentFactory.makeDcAsyncChannel(conn, LOG_TAG),其中conn是DataConnection,它牛逼哄哄,是个StateMachine,这个不是本文重点,不深入讲了。
3、DataConnection在走DcInactiveState.onConnect方法之后还调用了transitionTo(mActivatingState),onConnect中发布了EVENT_SETUP_DATA_CONNECTION_DONE,这个很关键,后面会用上。
4、CellularDataService的父类DataService中IDataServiceWrapper extends IDataService.Stub,setupDataCall辗转一下调用serviceProvider.setupDataCall,根据多态,调用CellularDataService.CellularDataServiceProvider.setupDataCall。

四、RILD:
radioProxy.setupDataCall → ril_service.cpp(setupDataCall) → Vendor RIL → ril_service.cpp(setupDataCallResponse) → RadioResponse.setupDataCallResponse(responseSetupDataCall(sendMessageResponse(rr.mResult, setupDataCallResult))) → msg.sendToTarget()
备注:
1、msg.sendToTarget()中的msg是rr.mResult,这个rr是根据responseInfo的serial获取来的,因为serial是mRequestList的key,获取的是当初CellularDataService中的handler中发送的那个message = Message.obtain(mHandler, SETUP_DATA_CALL_COMPLETE),所以sendToTarget就返回给调用者处理。

五、Telephony Frameworks:
CellularDataService(case SETUP_DATA_CALL_COMPLETE) → callback.onSetupDataCallComplete → DataConnection.DcActivatingState.EVENT_SETUP_DATA_CONNECTION_DONE(transitionTo(mActiveState)) → DcActiveState.enter(notifyAllOfConnected(Phone.REASON_CONNECTED)) → notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason) → DcTracker(case DctConstants.EVENT_DATA_SETUP_COMPLETE).onDataSetupComplete → DcTracker.completeConnection(mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType())) → Phone.notifyDataConnection(mNotifier.notifyDataConnection) → DefaultphoneNotifier.notifyDataConnection(doNotifyDataConnection) → mRegistry.notifyDataConnectionForSubscriber → TelephonyRegistry.notifyDataConnectionForSubscriber()
1、r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState[phoneId]);和网络变化差不多。
2、broadcastDataConnectionStateChanged(state, isDataAllowed, reason, apn, apnType, linkProperties, networkCapabilities, roaming, subId);
3、broadcastPreciseDataConnectionStateChanged(state, networkType, apnType, apn, reason, linkProperties, "", subId);
备注:
1、这个callback就是DataConnection调用setupDataCall时候传入的msg,这个msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp),就是是之前第三点备注中发布的那个。

六、上层:
r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState[phoneId]),和网络变化流程一样,上层可以通过TelephonyManager来设置监听。或者接收广播就可以无法无天了。

七、另外:
DcActiveState.enter中除了notifyAllOfConnected之外还干了一件很重要的事:mNetworkAgent = new DcNetworkAgent();
NetworkAgent(netId = cm.registerNetworkAgent) → ConnectivityManager.registerNetworkAgent(mService.registerNetworkAgent) → ConnectivityService.registerNetworkAgent(mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT, nai))) → handleRegisterNetworkAgent(updateNetworkInfo(nai, networkInfo))
1、networkAgent.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED) → NetworkMonitor.DefaultState(transitionTo(mEvaluatingState)) → EvaluatingState.enter(sendMessage(CMD_REEVALUATE, ++mReevaluateToken, 0)) → transitionTo(mValidatedState) → ValidatedState.enter(mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED, NETWORK_TEST_RESULT_VALID, mNetId, null))) → ConnectivityService(case NetworkMonitor.EVENT_NETWORK_TESTED)
1.1、updateCapabilities(oldScore, nai, nai.networkCapabilities) → rematchAllNetworksAndRequests(nai, oldScore) → rematchNetworkAndRequests(sendUpdatedScoreToFactories(nri.request, score)更新一波分数)
1.2、updateInetCondition(nai) 
1.3、nai.asyncChannel.sendMessage(NetworkAgent.CMD_REPORT_NETWORK_STATUS, (valid ? NetworkAgent.VALID_NETWORK : NetworkAgent.INVALID_NETWORK), 0, redirectUrlBundle) → NetworkAgent.networkStatus(msg.arg1, redirectUrl)
2、notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_PRECHECK) 
3、mNetd.createPhysicalNetwork(networkAgent.network.netId, getNetworkPermission(networkAgent.networkCapabilities)) → NetworkManagementService.createPhysicalNetwork(mConnector.execute("network", "create", netId, permission)) → NativeDaemonConnector.execute → netd

数据业务流程比较复杂,上面只是一个开启过程的大致流程,还有许多细节需要深入研究。

发布了15 篇原创文章 · 获赞 107 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/llleahdizon/article/details/89704230
今日推荐