1. 程式人生 > >Android 6.0 自動開啟移動資料流程

Android 6.0 自動開啟移動資料流程

  在M版本,觸發建立預設的資料連線的機制跟以前的版本有比較大的變化,本文主要介紹觸發建立資料連線的開始階段,而建立data call的過程跟之前是一樣的,只要條件準備好了發起就可以了。

step 1:在ConnectivityService構造的時候就建立了一個預設的default Request,mDefaultRequest

網路工廠連線上以後,就請求網路連線

step 2:在ConnectivityService:handleAsyncChannelHalfConnect裡,如果已經連線到網路工廠,就把網路請求發到對應的網路工廠

在日誌裡會打印出下面的訊息

01-12 14:55:53.066 D/ConnectivityService( 1170): NetworkFactory connected
01-12 14:55:53.066 D/ConnectivityService( 1170): send CMD_REQUEST_NETWORK

接著是網路工廠處理請求CMD_REQUEST_NETWORK

step 3:NetworkFactory:handleAddRequest進行處理,呼叫evalRequest來判斷是開啟網路,還是釋放網路,如果開啟則呼叫needNetworkFor,如果是釋放則呼叫releaseNetworkFor

現在先關注行動網路開啟資料的,由於行動網路的網路工廠是TelephonyNetworkFactory,在dctController裡定義的

step 4:TelephonyNetworkFactory:needNetworkFor

檢查sub id是否符合,還有apn是否支援,如果符合條件,則呼叫requestNetwork

對應的log

01-12 14:55:59.236 D/QtiDctController( 3208): [TNF 2147483643]Cellular needs Network for NetworkRequest [ id=1, legacyType=-1, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN] ]

step 5:DctController:request

把請求加入到佇列mRequestInfos中,緊接著調processRequests來處理佇列中的請求

step 6:QtiDctController:onProcessRequest

根據請求判斷是否需要切DDS,需要的話呼叫handleDdsSwitch

01-12 14:56:03.496 D/QtiDctController( 3208): getTopPriorityRequestPhoneId = 1, priority = 0
01-12 14:56:03.496 D/QtiDctController( 3208): phoneId = 1
01-12 14:56:03.496 D/QtiDctController( 3208): activePhoneId = -1
01-12 14:56:03.496 D/QtiDctController( 3208): ddsPhoneId = 1
01-12 14:56:03.496 D/QtiDctController( 3208): maxDataCap = -1
01-12 14:56:03.496 D/QtiDctController( 3208): Modem is DSDS-Data capable.
01-12 14:56:03.496 D/QtiDctController( 3208): ON_DEMAND_REQ_DSDS

step 7: qtiDctController:handleDdsSwitch

根據情況是要關閉當前的資料,還是開始建立連線,關閉呼叫doDisconnectAll,建立連線調doConnect

01-12 14:56:03.496 D/QtiDctController( 3208): doConnect phoneId = 1

step 8:qtiDctController:doConnect

呼叫informDdsToRil通知底層預設的dds,然後通過DcSwitchAsyncChannel的connect傳送請求REQ_CONNECT

狀態的的跳轉過程如下:IdleState->AttachingState->AttachedState->DetachingState->IdleState

在AttachingState會呼叫setDataAllowed為true,DetachingState會setDataAllowed為false

setDataAllowed會把某個phone的ps變為attached,從而觸發建立data call

12-31 16:37:44.635 D/DcSwitchSM( 5990): [DcSwitchStateMachine-1] IdleState: REQ_CONNECT, apnRequest=[ request=NetworkRequest [ id=8, legacyType=2, [ Transports: CELLULAR Capabilities: MMS&NOT_RESTRICTED&TRUSTED&NOT_VPN Specifier: <2>] ], executed=false, priority=4]
12-31 16:37:44.635 D/DcSwitchSM( 5990): [DcSwitchStateMachine-1] AttachingState: enter
12-31 16:37:44.635 D/DcSwitchSM( 5990): [DcSwitchStateMachine-1] AttachingState executeAll due to autoAttach
12-31 16:37:44.635 D/DcSwitchSM( 5990): [DcSwitchStateMachine-1] AttachingState: REQ_CONNECT, apnRequest=[ request=NetworkRequest [ id=8, legacyType=2, [ Transports: CELLULAR Capabilities: MMS&NOT_RESTRICTED&TRUSTED&NOT_VPN Specifier: <2>] ], executed=false, priority=4]
12-31 16:37:48.385 D/DcSwitchSM( 5990): [DcSwitchStateMachine-1] AttachingState: EVENT_DATA_ATTACHED
12-31 16:37:48.385 D/DcSwitchSM( 5990): [DcSwitchStateMachine-1] AttachedState: enter
12-31 16:37:52.165 D/DcSwitchSM( 5990): [DcSwitchStateMachine-1] AttachedState: REQ_DISCONNECT_ALL
12-31 16:37:52.165 D/DcSwitchSM( 5990): [DcSwitchStateMachine-1] DetachingState: enter
12-31 16:37:52.935 D/DcSwitchSM( 5990): [DcSwitchStateMachine-1] DetachingState: EVENT_DATA_DETACHED
12-31 16:37:52.935 D/DcSwitchSM( 5990): [DcSwitchStateMachine-1] IdleState: enter