快速入口: Apn_change完整時序圖
1. APN概念
APN全稱是Access Point Name根欧,中文即接入點,是通過手機上網(wǎng)時必須配置的一個參數(shù)逗堵,它決定了手機通過哪種接入方式來訪問網(wǎng)絡(luò)慷妙。
2. Apn參數(shù)及初始化
Apn的創(chuàng)建在ContentProvider里面,他所在的Process啟動了芹枷,ContentProvider就會在ActivityThread中啟動衅疙,流程如下:
注:統(tǒng)一使用@類.方法表示流程中的方法
@SQLiteOpenHelper.getDatabaseLocked
@TelephonyProvider.DatabaseHelper.onCreate
createCarriersTable(db, CARRIERS_TABLE);//創(chuàng)建數(shù)據(jù)庫(carriers)
initDatabase(db);//初始化apn數(shù)據(jù)
Carriers內(nèi)的字段都定義在Telephony.java文件的子類Carriers中,各個字段詳情見附件1([Carriers參數(shù)定義]鸳慈。
Android的網(wǎng)絡(luò)配置作為資源文件寫入了XML(/frameworks/base/core/res/res/xml/apns.xml)饱溢,這個資源文件作為Android的默認(rèn)Apns配置,不建議修改該文件走芋,且一般為空绩郎。因為Apn的配置是根據(jù)不同的硬件產(chǎn)品而不同,所以為不同的硬件產(chǎn)品建立各自的配置文件(system/etc/apns-conf.xml) 翁逞,而不去改動默認(rèn)的配置文件(apns.xml)肋杖。
在apn數(shù)據(jù)庫的初始化中,會先加載系統(tǒng)apn然后加載廠商apn挖函。以下為部分代碼:
// Read internal APNS data
XmlResourceParser parser = r.getXml(com.android.internal.R.xml.apns)
loadApns(db, parser);
// Read external APNS data (partner-provided)
File confFile = new File(Environment.getRootDirectory(), "etc/apns-conf.xml");
loadApns(db, confparser);
3. Apn數(shù)據(jù)庫的增刪改查
(1)首先創(chuàng)建URI連接:
public Uri createUri = Uri.parse("content://telephony/carriers");
(2)然后根據(jù)前后文獲取ContentResolver訪問數(shù)據(jù)庫:
ContentResolver contentResolver =context.getContentResolver();
(3)寫一個要修改的參數(shù)對状植,contentValues 里面使用HashMap保存:
ContentValues contentValues =new ContentValues();
contentValues.put("name", apn.getName());
(4)增刪改查語句:
contentResolver.insert(createUri, contentValues);
contentResolver.delete(createUri,"_id=?",new String[] { id });
contentResolver.update(createUri, contentValues, null,null);
contentResolver.query(createUri,projection,selection,selectionArgs,sortOrder)
4. 上層設(shè)置默認(rèn)apn
用戶通過設(shè)置界面進入apn選項界面,當(dāng)更換當(dāng)前的apn選項時,會更新當(dāng)前的apn數(shù)據(jù)庫津畸,然后就會觸發(fā)重建數(shù)據(jù)連接流程振定,時序圖如下:
4.1上層UI進入apn界面流程
在設(shè)置界面中點擊“移動網(wǎng)絡(luò)”選項,進入手機移動網(wǎng)絡(luò)設(shè)置界面肉拓。然后點擊“接入點名稱”時會觸發(fā)點擊事件吩案,然后通過intent又返回到設(shè)置里面開啟apn界面,顯示當(dāng)前apn項,邏輯如下:
@leui_settings_headers//設(shè)置界面布局文件
android:targetClass="com.android.phone.MobileNetworkSettings">
@MobileNetworkSettings//移動網(wǎng)絡(luò)界面創(chuàng)建Options
mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet, mPhone.getPhoneId());
@GsmUmtsOptions//options界面就是“接入點名稱”選項菜單
intent.setAction(Settings.ACTION_APN_SETTINGS);//開啟ApnSettings
@ApnSettings.fillList//打開apn界面后遍歷當(dāng)前apn列表并顯示
@ApnPreference//承載一個apn顯示列
this(context, attrs, R.attr.apnPreferenceStyle);//引入apn的xml文件
@res/values/themes.xml:129:
<item name="apnPreferenceStyle">@style/ApnPreference</item>
@res/values/styles.xml:351://apn的界面有幾次跳轉(zhuǎn)帝簇,最后在styles中
<style name="ApnPreference">
<item name="android:layout">@layout/apn_preference_layout</item>
</style>
@apn_preference_layout//apn布局文件
4.2 UI重選apn
在apn界面點擊更換一個apn后,會通過uri更新當(dāng)前的apn數(shù)據(jù)庫靠益。接著Dctracker監(jiān)聽到了數(shù)據(jù)庫的變化丧肴,從而開始重新創(chuàng)建數(shù)據(jù)連接:
@ApnSettings.onPreferenceChange//ui改動preferapn
setSelectedApnKey((String) newValue);
@ApnSettings.setSelectedApnKey//更新apn數(shù)據(jù)庫
resolver.update(getUri(PREFERAPN_URI), values, null, null);
@DcTracker//mApnObserver監(jiān)聽apn數(shù)據(jù)庫變化
p.getContext().getContentResolver().registerContentObserver(Telephony.Carriers.CONTENT_URI, true, mApnObserver);
@DcTracker.ApnChangeObserver.onChange
sendMessage(obtainMessage(DctConstants.EVENT_APN_CHANGED));
@DcTracker.handleMessage//消息id為270355
case DctConstants.EVENT_APN_CHANGED//(270355)
@DcTracker.onApnChanged//創(chuàng)建數(shù)據(jù)連接的方法
tryRestartDataConnections(true, Phone.REASON_APN_CHANGED);
5. DcTracker創(chuàng)建數(shù)據(jù)連接
這里面,我們首先說一下會觸發(fā)Dctraker創(chuàng)建數(shù)據(jù)連接的幾個消息:
EVENT_APN_CHANGED//(270335)監(jiān)聽apn數(shù)據(jù)庫變化
EVENT_RECORDS_LOADED//(270338)卡加載
EVENT_VOICE_CALL_ENDED//(270344)
EVENT_ROAMING_ON//(270347)
EVENT_ROAMING_OFF//(270348)
EVENT_DATA_CONNECTION_ATTACHED//(270352)
EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED//(270357)
EVENT_DATA_RAT_CHANGED//(270377)監(jiān)聽底層主動上報的 RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED
EVENT_MODEM_DATA_PROFILE_READY//(270379)
在重選apn引起的創(chuàng)建數(shù)據(jù)連接流程中胧后,首先通過網(wǎng)絡(luò)類型獲取卡信息芋浮,讀取其中的mcc mnc值,再通過該值查找apn數(shù)據(jù)庫創(chuàng)建apn列表壳快,這些邏輯都在方法createAllApnList里面纸巷;有了apn列表之后,會先找一個初始的apn下發(fā)到modem眶痰,這一步的作用目前不是很明確瘤旨,像創(chuàng)建數(shù)據(jù)連接的一個預(yù)處理。它在以下幾種情況下被調(diào)用:
EVENT_RECORDS_LOADED
EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED
EVENT_DATA_RAT_CHANGED
EVENT_APN_CHANGED
然后依據(jù)當(dāng)前情況清空原有數(shù)據(jù)連接竖伯,重新創(chuàng)建存哲。
@DcTracker.tryRestartDataConnections//開始創(chuàng)建連接
createAllApnList//創(chuàng)建apn列表
getPreferredApn//有優(yōu)選apn則獲取
setPreferredApn(-1);//沒有則設(shè)為-1
setInitialAttachApn//設(shè)置初始apn(ia->Preferred->default->first)會通過RIL下發(fā)RIL_REQUEST_SET_INITIAL_ATTACH_APN命令,預(yù)綁定
cleanUpAllConnections
setupDataOnConnectableApns
接著setupDataOnConnectableApns方法選用apn列表中合適的apn開始創(chuàng)建數(shù)據(jù)連接七婴。trySetupData里面的buildWaitingApns方法會對apn列表進行進一步過濾祟偷,有PreferredApn則加入列表并直接返回,使用該apn;如沒有preferredApn會把apn表中滿足條件的apn都加入列表并返回打厘,再使用第一個apn創(chuàng)建連接修肠。
@DcTracker.setupDataOnConnectableApns
trySetupData
@DcTracker.trySetupData
buildWaitingApns
setupData
@DcTracker.setupData
apnSetting = apnContext.getNextWaitingApn();//使用第一個
dcac.bringUp(apnContext...);
經(jīng)過一系列的驗證,各個參數(shù)準(zhǔn)備完畢户盯,發(fā)出創(chuàng)建連接請求嵌施。走到狀態(tài)機,StateMachine的子類接受消息莽鸭,能繼續(xù)創(chuàng)建連接的有DcInactiveState/DcRetryingState艰管,這里我們用的是DcInactiveState。
@DcAsyncChannel.bringUp
sendMessage(DataConnection.EVENT_CONNECT...)
@StateMachine.SmHandler.processMsg
while (!curStateInfo.state.processMessage(msg)) {
@DataConnection.DcInactiveState.processMessage//當(dāng)前的子類狀態(tài)處理
onConnect(mConnectionParams);//EVENT_CONNECT//(關(guān)鍵字)
transitionTo(mActivatingState);//狀態(tài)由斷開變?yōu)檎谶B接
@DataConnection.onConnect
mPhone.mCi.setupDataCall(Integer.toString(cp.mRilRat + 2)...);//rillrat代表網(wǎng)絡(luò)類型蒋川,其值+2傳到ril牲芋。[部分log](#_部分log:)及[網(wǎng)絡(luò)類型](#_網(wǎng)絡(luò)類型:)詳情參見附件2。
@RIL.setupDataCall
RIL_REQUEST_SETUP_DATA_CALL//SETUP_DATA_CALL(關(guān)鍵字)
時序圖如下:
6. 底層網(wǎng)絡(luò)狀態(tài)變化觸發(fā)創(chuàng)建apn連接的流程
底層網(wǎng)絡(luò)狀態(tài)發(fā)生變化,會發(fā)出UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED消息通知上層缸浦。
@RIL.processUnsolicited
case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
mVoiceNetworkStateRegistrants.notifyRegistrants(new AsyncResult(null, null, null));//mVoiceNetworkStateRegistrants發(fā)出通知
@GsmServiceStateTracker//ServiceStateTracker//監(jiān)聽該通知
mCi.registerForVoiceNetworkStateChanged(this, EVENT_NETWORK_STATE_CHANGED, null);
mVoiceNetworkStateRegistrants.add(r);
上層收到通知夕冲,會向底層重新請求新的數(shù)據(jù)連接的各個參數(shù),具體下發(fā)的消息如下(以GsmServiceStateTracker為例):
EVENT_POLL_STATE_OPERATOR//spn
EVENT_POLL_STATE_GPRS//RilData
EVENT_POLL_STATE_REGISTRATION//服務(wù)狀態(tài)裂逐,RilVoice
EVENT_POLL_STATE_NETWORK_SELECTION_MODE//網(wǎng)絡(luò)模式
代碼邏輯如下:
@GsmServiceStateTracker.handleMessage
case EVENT_NETWORK_STATE_CHANGED
@GsmServiceStateTracker.pollState//下發(fā)四個命令
mPollingContext[0]++;
mCi.getOperator(obtainMessage(EVENT_POLL_STATE_OPERATOR, mPollingContext));
mPollingContext[0]++;
mCi.getDataRegistrationState(obtainMessage(EVENT_POLL_STATE_GPRS, mPollingContext));
mPollingContext[0]++;
mCi.getVoiceRegistrationState(obtainMessage(EVENT_POLL_STATE_REGISTRATION, mPollingContext));
mPollingContext[0]++;
mCi.getNetworkSelectionMode(obtainMessage(EVENT_POLL_STATE_NETWORK_SELECTION_MODE, mPollingContext));
各個請求連續(xù)發(fā)送完畢后歹鱼,底層會一一回復(fù)。然后上層收到新的參數(shù)卜高,重新配置各個參數(shù):運營商名稱弥姻,數(shù)據(jù)類型,voice類型掺涛,網(wǎng)絡(luò)模式庭敦。配置完后,開始創(chuàng)建數(shù)據(jù)連接薪缆。
@GsmServiceStateTracker.handleMessage
...
handlePollStateResult(msg.what, ar);
@GsmServiceStateTracker.handlePollStateResult//負(fù)責(zé)配置各個參數(shù)
mPollingContext[0]//;//當(dāng)mPollingContext[0]為0時才會走pollStateDone
@GsmServiceStateTracker.pollStateDone
notifyDataRegStateRilRadioTechnologyChanged();
@ServiceStateTracker.notifyDataRegStateRilRadioTechnologyChanged
mDataRegStateOrRatChangedRegistrants.notifyResult(new Pair<Integer, Integer>(drs, rat));
@DcTracker.handleMessage//DCTracker注冊mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged
case DctConstants.EVENT_DATA_RAT_CHANGED(270377)(this,DctConstants.EVENT_DATA_RAT_CHANGED, null);
onUpdateIcc//更據(jù)當(dāng)前網(wǎng)絡(luò)類型更新sim信息
tryRestartDataConnections//創(chuàng)建數(shù)據(jù)連接
底層網(wǎng)絡(luò)狀態(tài)變化后秧廉,觸發(fā)重新創(chuàng)建數(shù)據(jù)連接的整個時序圖如下:
7. 底層成功創(chuàng)建數(shù)據(jù)連接后的處理
當(dāng)?shù)讓映晒?chuàng)建數(shù)據(jù)連接后,會向上層發(fā)出RIL_REQUEST_SETUP_DATA_CALL消息拣帽。RIL層接受該消息后疼电,通知狀態(tài)機。狀態(tài)機根據(jù)底層上報的參數(shù)减拭,判斷出重新創(chuàng)建連接成功蔽豺,將狀態(tài)由DcActivatingState改為ActiveState。ActiveState又會發(fā)出通知告訴DcTrackerBase,而后續(xù)處理操作onDataSetupComplete由DcTrackerBase的子類DcTracker完成拧粪。
@RIL.run
case RIL_REQUEST_SETUP_DATA_CALL
@RIL.processResponse
@RIL.processSolicited
transitionTo(mActiveState);
@DcActivatingState.handleMessage()
case EVENT_SETUP_DATA_CONNECTION_DONE:
onSetupConnectionCompleted
transitionTo(mActiveState);
@DcActiveState.enter()
notifyAllOfConnected(Phone.REASON_CONNECTED);
@DataConnection.notifyAllOfConnected
notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason);
@DcTrackerBase.handleMessage
case EVENT_DATA_SETUP_COMPLETE
onDataSetupComplete():
@DcTracker.onDataSetupComplete
時序圖如下:
附件1_
創(chuàng)建carriers表語句:
db.execSQL("CREATE TABLE " + tableName +
"(_id INTEGER PRIMARY KEY," +
"name TEXT DEFAULT ''," +
"numeric TEXT DEFAULT ''," +
"mcc TEXT DEFAULT ''," +
"mnc TEXT DEFAULT ''," +
"apn TEXT DEFAULT ''," +
"user TEXT DEFAULT ''," +
"server TEXT DEFAULT ''," +
"password TEXT DEFAULT ''," +
"proxy TEXT DEFAULT ''," +
"port TEXT DEFAULT ''," +
"mmsproxy TEXT DEFAULT ''," +
"mmsport TEXT DEFAULT ''," +
"mmsc TEXT DEFAULT ''," +
"authtype INTEGER DEFAULT -1," +
"type TEXT DEFAULT ''," +
"current INTEGER," +
"protocol TEXT DEFAULT 'IP'," +
"roaming_protocol TEXT DEFAULT 'IP'," +
"carrier_enabled BOOLEAN DEFAULT 1," +
"bearer INTEGER DEFAULT 0," +
"bearer_bitmask INTEGER DEFAULT 0," +
"mvno_type TEXT DEFAULT ''," +
"mvno_match_data TEXT DEFAULT ''," +
"sub_id INTEGER DEFAULT " +
SubscriptionManager.INVALID_SUBSCRIPTION_ID +
"," +
"profile_id INTEGER DEFAULT 0," +
"modem_cognitive BOOLEAN DEFAULT 0," +
"max_conns INTEGER DEFAULT 0," +
"wait_time INTEGER DEFAULT 0," +
"max_conns_time INTEGER DEFAULT 0," +
"mtu INTEGER DEFAULT 0," +
"edited INTEGER DEFAULT " +
Telephony.Carriers.UNEDITED +
"," +
"read_only BOOLEAN DEFAULT 0," +
"UNIQUE (numeric, mcc, mnc, apn, proxy, port,
mmsproxy, mmsport, mmsc," +
"carrier_enabled, bearer, mvno_type, mvno_match_data, profile_id));");
carriers參數(shù)定義
定義在Telephony.Carriers中茫虽,
_id//key
name//Entry name
numeric//Numeric operator ID (as String). Usually MCC + MNC.
mcc//Mobile Country Code (MCC).
mnc//Mobile Network Code (MNC).
apn//APN name.
user//APN username.
server//Server address.
password//APN password.
proxy//Proxy address.
port//Proxy port.
mmsproxy//MMS proxy address.
mmsport//MMS proxy port.
mmsc//MMSC URL.
authtype//Authentication type.
(1:PAP/2:CHAP/3:PAP|CHAP)需要跟user password聯(lián)合使用。
type//Comma-delimited list of APN types.(default,mms,supl,dun,ims,ia...)
current// Is this the current APN?
Protocol
//The protocol to use to connect to this APN. One of the PDP_type values in TS 27.007 section 10.1.1. For example: IP, IPV6, IPV4V6, or PPP.
roaming_protocol
//The protocol to use to connect to this APN when roaming. The syntax is the same as protocol.
carrier_enabled//Is this APN enabled?
Bearer
//Radio Access Technology info. To check what values are allowed, refer to android.telephony.ServiceState. This should be spread to other technologies, but is currently only used for LTE (14) and eHRPD (13).
bearer_bitmask
//Radio Access Technology bitmask. To check what values can be contained, refer to android.telephony.ServiceState. 0 indicates all techs otherwise first bit refers to RAT/bearer 1, second bit refers to RAT/bearer 2 and so on. Bitmask for a radio tech R is (1 << (R - 1))
mvno_type
//MVNO type: SPN (Service Provider Name), IMSI, GID (Group Identifier Level 1).
mvno_match_data
//MVNO data. Use the following examples.
SPN: A MOBILE, BEN NL, ...
IMSI: 302720x94, 2060188, ...
GID: 4E, 33, ...
sub_id//The subscription to which the APN belongs to
profile_id//The profile_id to which the APN saved in modem
modem_cognitive//Is the apn setting to be set in modem
max_conns//The max connections of this apn
wait_time//The wait time for retry of the apn
max_conns_time//The time to limit max connection for the apn
mtu//The MTU size of the mobile interface to which the APN connected
edited//Is this APN added/edited/deleted by a user or carrier?
read_only//default?
附件2
網(wǎng)絡(luò)類型:
ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN
RIL_RADIO_TECHNOLOGY_UNKNOWN = 0;
RIL_RADIO_TECHNOLOGY_GPRS = 1;
RIL_RADIO_TECHNOLOGY_EDGE = 2;
RIL_RADIO_TECHNOLOGY_UMTS = 3;
RIL_RADIO_TECHNOLOGY_IS95A = 4;
RIL_RADIO_TECHNOLOGY_IS95B = 5;
RIL_RADIO_TECHNOLOGY_1xRTT = 6;
RIL_RADIO_TECHNOLOGY_EVDO_0 = 7;
RIL_RADIO_TECHNOLOGY_EVDO_A = 8;
RIL_RADIO_TECHNOLOGY_HSDPA = 9;
RIL_RADIO_TECHNOLOGY_HSUPA = 10;
RIL_RADIO_TECHNOLOGY_HSPA = 11;
RIL_RADIO_TECHNOLOGY_EVDO_B = 12;
RIL_RADIO_TECHNOLOGY_EHRPD = 13;
RIL_RADIO_TECHNOLOGY_LTE = 14;
RIL_RADIO_TECHNOLOGY_HSPAP = 15;
RIL_RADIO_TECHNOLOGY_GSM = 16;
RIL_RADIO_TECHNOLOGY_TD_SCDMA = 17;
SIM//RUIM//ISIM
SIMRecords(APPTYPE_USIM,APPTYPE_SIM)
RuimRecords(APPTYPE_RUIM,APPTYPE_CSIM)
IsimUiccRecords(APPTYPE_ISIM)
附件3
apn文件的替換
MTK平臺
@device/mediatek/common/device.mk
PRODUCT_COPY_FILES += device/mediatek/common/apns-conf.xml:system/etc/apns-conf.xml
修改為:
#PRODUCT_COPY_FILES += device/mediatek/common/apns-conf.xml:system/etc/apns-conf.xml
APN_PATH := device/mediatek/common
XXX_APN_CONFIG_FILE := $(if $(wildcard vendor/xxx/frameworks/etc/apnsconfig/apns-conf.xml),yes,no)
ifeq ($(XXX_APN_CONFIG_FILE),yes)
APN_PATH := vendor/xxx/frameworks/etc/apnsconfig
endif
PRODUCT_COPY_FILES := $(APN_PATH)/apns-conf.xml:system/etc/apns-conf.xml $(PRODUCT_COPY_FILES)
高通平臺
@xx/device/qcom/msm8994/msm8994.mk:69:
ifeq ($(wildcard $(QC_PROP_ROOT)/common-noship/etc/device-vendor-noship.mk),)
ifneq ($(call is-android-codename-in-list,GINGERBREAD HONEYCOMB),true)
APN_PATH := vendor/xxx/frameworks/etc/apnsconfig
PRODUCT_COPY_FILES := $(APN_PATH)/apns-conf.xml:system/etc/apns-conf.xml $(PRODUCT_COPY_FILES)
endif
endif
feature 控制_telephony.ct.apn
vendor/xxx/frameworks/featureslist/
手機目錄: system/etc/permissions/
附件4_部分log:
//////////////-DcTracker創(chuàng)建數(shù)據(jù)連接流程log//////////////////-
09-09 16:53:33.053 D/GsmDCT ( 3057): [1]handleMessage msg={ when=-546ms what=270352 obj=android.os.AsyncResult@3651063e target=com.android.internal.telephony.dataconnection.DcTracker }
09-09 16:53:33.358 D/GsmDCT ( 3057): [1]setupDataOnConnectableApns: dataAttached
09-09 16:53:33.360 D/GsmDCT ( 3057): [1]buildWaitingApns: usePreferred=true canSetPreferApn=true mPreferredApn=null operator=310410 radioTech=11
09-09 16:53:33.374 D/GsmDCT ( 3057): [1]createDataConnection() X id=0 dc={DC-1: State=DcInactiveState mApnSetting=null RefCount=0 mCid=-1 mCreateTime=-1 mLastastFailTime=-1 mLastFailCause=NONE mTag=1 mRetryManager=RetryManager: { forever=false maxRetry=0 curMaxRetry=0 retry=0 config={null} retryArray={}} mLinkProperties={LinkAddresses: [] Routes: [] DnsAddresses: [] Domains: null MTU: 0} linkCapabilities=[ Transports: CELLULAR Capabilities: NOT_RESTRICTED&TRUSTED&NOT_VPN LinkUpBandwidth>=5898Kbps LinkDnBandwidth>=14336Kbps Specifier: <1>] mApnContexts=[]}
09-09 16:53:33.374 D/GsmDCT ( 3057): [1]setupData: dcac=DC-1 apnSetting=[ApnSettingV3] Cingular 410, 446, 310410, wap.cingular, , http://mmsc.cingular.com/, wireless.cingular.com, , , -1, default | supl | mms, IP, IP, true, 0, 0, false, 0, 0, 0, 0, ,
09-09 16:53:33.385 D/DC-1 ( 3057): DcInactiveState: mag.what=EVENT_CONNECT
09-09 16:53:33.389 D/DC-1 ( 3057): onConnect: carrier='Cingular 410' APN='wap.cingular' proxy='' port=''
09-09 16:53:33.390 D/RILJ ( 3057): [3952]> SETUP_DATA_CALL 13 0 wap.cingular WAP@CINGULARGPRS.COM CINGULAR1 3 IP [SUB1]
//////////////-DcTracker創(chuàng)建數(shù)據(jù)連接流程log//////////////////-
//////////-底層網(wǎng)絡(luò)狀態(tài)變化log//////////-
09-10 07:53:32.374 D/GsmSST ( 3057): [GsmSST1] Poll ServiceState done: oldSS=[1 1 home null null null Unknown Unknown CSS not supported -1 -1 RoamInd=-1 DefRoamInd=-1 EmergOnly=false] newSS=[0 0 home AT&T AT&T 310410 UMTS HSPA CSS not supported -1 -1 RoamInd=-1 DefRoamInd=-1 EmergOnly=false] oldMaxDataCalls=20 mNewMaxDataCalls=20 oldReasonDataDenied=-1 mNewReasonDataDenied=-1
09-09 16:53:32.500 D/GsmSST ( 3057): [GsmSST1] notifyDataRegStateRilRadioTechnologyChanged: drs=0 rat=11
09-09 16:53:32.655 D/GsmDCT ( 3057): [1]handleMessage msg={ when=-150ms what=270377 obj=android.os.AsyncResult@29a9f9c0 target=com.android.internal.telephony.dataconnection.DcTracker }
//////////-底層網(wǎng)絡(luò)狀態(tài)變化log//////////-