mTracker ----- MPDP

PhoneBase.java
public void notifyDataConnection(String reason){
boolean supportMpdp = SystemProperties.getBoolean("persist.telephony.mpdp",true);
if(supportMpdp)
mNotifier.notifyDataConnectionMpdp(Phone.APN_TYPE_DEFAULT, this, reason);
else
mNotifier.notifyDataConnection(this, reason);
}

调用PhoneBase.java 的 notifyDataConnection 有
trySetupData 在
1.CdmaDataConnectionTracker
2.GsmDataConnectionTracker
3.MpdpMsmsGsmDataConnectionTracker
4.MsmsGsmDataConnectionTracker

setupData 在
1.CdmaDataConnectionTracker
2.GsmDataConnectionTracker

先关注MpdpMsmsGsmDataConnectionTracker.java的trySetupData
(MsmsGsmDataConnectionTracker.java)onEnableNewApn -> (MsmsGsmDataConnectionTrackerProxy.java)onEnableNewApn -> onEnableNewApnInternal -> trySetupData(Phone.REASON_APN_SWITCHED);

关注MsmsGsmDataConnectionTracker.java的onEnableNewApn
MpdpMsmsGsmDataConnectionTracker.java onEnableApn -> onEnableNewApn
DataConnectionTracker handleMessage & onEnableApn -> onEnableNewApn

关注MpdpMsmsGsmDataConnectionTracker.java 的 onEnableApn
DataConnectionTracker.java handleMessage EVENT_ENABLE_NEW_APN
关键此Tracker对象是哪个子类的对象。应该存在一个mTracker数组中。

继续跟踪:EVENT_ENABLE_NEW_APN
setEnabled 发送了这个消息,调用这个函数的enableApnType定义在DataConnectionTracker.java和MpdpMsmsGsmDataConnectionTracker.java

在CdmaDataConnectionTracker和GsmDataConnectionTracker中定义了onReceive;在PhoneBase.java中也定义了enableApnType
分别有intent为android.intent.action.CONNECT_CDMA和android.intent.action.CONNECT_GSM

关注PhoneBase.java中的enableApnType
有PoneProxy和PhoneInterfaceManager调用。

MobileDataStateTracker.java reconnect -> setEnableApn -> mPhoneService.enableApnType

关注reconnect
ConnectivityService.java
handleSetMobileData -> mNetTrackers[ConnectivityManager.TYPE_MOBILE].reconnect();
setMobileDataEnabledByPhoneId -> mNetTrackers[ConnectivityManager.TYPE_MOBILE].reconnect();
startUsingNetworkFeature -> network.reconnect()
tryFailover -> checkTracker.reconnect()

ConnectivityManager.java
setMobileDataEnabledByPhoneId -> mService.setMobileDataEnabledByPhoneId

...

现在关注多PDP的流程:
由上流程知,关键在创建的时候对象是不是MpdpMsmsGsmDataConnectionTracker
找到创建的地方:frameworks/base/telephony/java/com/android/internal/telephony/gsm/MsmsGsmDataConnectionTrackerProxy.java
public static GsmDataConnectionTracker getTrackerInstance(GSMPhone phone){
int phoneId = phone.getPhoneId();
boolean supportMpdp = SystemProperties.getBoolean("persist.telephony.mpdp",true);
if(supportMpdp){
sTracker = new MpdpMsmsGsmDataConnectionTracker[PhoneFactory.getSimCount()];
sTracker[phoneId] = new MpdpMsmsGsmDataConnectionTracker(phone);
} else {
sTracker = new MsmsGsmDataConnectionTracker[PhoneFactory.getPhoneCount()];
sTracker[phoneId] = MsmsGsmDataConnectionTracker(phone);
}
return sTracker[phoneId];
}
在MpdpMsmsGsmDataConnectionTracker.java 的 getTrackerInstance函数中,可以看到sTracker是一个只有一个元素的数组,因为G+C项目的getSimCount()的值为1.

=====================================================================================================================================
ConnectivityService.java private ConnectivityService(Context context){
mNetTrackers = new NetworkStateTracker[ConnectivityManager.MAX_NETWORK_TYPE + 1]; [15]
}
  
public static final int TYPE_MOBILE = 0;
public static final int TYPE_WIFI = 1;
public static final int TYPE_MOBILE_MMS = 2;
public static final int TYPE_MOBILE_SUPL = 3;
public static final int TYPE_MOBILE_DUN = 4;
public static final int TYPE_MOBILE_HIPRI = 5;
public static final int TYPE_WIMAX = 6;
public static final int TYPE_BLUETOOTH = 7;
public static final int TYPE_DUMMY = 8;
public static final int TYPE_ETHERNET = 9;
public static final int TYPE_MOBILE_DM = 10;
public static final int MAX_RADIO_TYPE = TYPE_MOBILE_DM; 10
public static final int TYPE_MOBILE_MMS_EXTERNAL = TYPE_MOBILE_DM + PhoneFactory.getPhoneCount(); //mms0 and mms1 12
public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_MMS_EXTERNAL + PhoneFactory.getPhoneCount();//dm0 and dm1 14
    public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;

1.GSM DATA + GSM MMS: cmnet + cmwap
2.GSM DATA + CDMA MMS: cmnet + ctwap
路由表:http://www.cnblogs.com/jimwind/archive/2013/06/07/3123251.html


mApnType
   
static final String APN_TYPE_ALL = "*";
static final String APN_TYPE_DEFAULT = "default";
static final String APN_TYPE_MMS = "mms";
static final String APN_TYPE_SUPL = "supl";
static final String APN_TYPE_DUN = "dun";
static final String APN_TYPE_HIPRI = "hipri";
static final String APN_TYPE_DM = "dm";


原文地址:https://www.cnblogs.com/jimwind/p/3175153.html