Android 网络整体架构
Android 网络中,在底层实现两个虚拟串口:
1、Command 命令通道:建立或断开网络建立
2、Data 数据通道:基于TCP/IP 网络通信协议的数据传输
DataConnection 在Telephony Frameworks 层中用来管理手机上网连接
Android 最大支持9个数据连接类型,但同一时刻仅有一个是有效的;
DataConnection 继承 StateMachine 类(State设计模式)的抽象类,其子类 GsmDataConnection 和 CdmaDataConnection;
定义了6个内部类:
DcDefaultState 默认状态定义,作为其他5个状态对象的父对象
DcInactiveState 不活动的状态定义,作为初始化状态,在不使用、断开数据连接、数据连接异常时回到此状态
DcActivatingState 正在激活的状态定义
DcActiveState 活动中的状态定义,连接网络成功
DcDisconnectingState 正在断开的状态定义
DcDisconnectionErrorCreatingConnection 断开失败并且正在创建的状态定义,连接网络失败
这些内部类都有enter、exit 和 processMessage 三个重要方法
enter :在状态转换时,进入此状态的操作
exit :在状态转换时,退出此状态的操作
processMessage :根据Handler 消息类型进入不同的分支进行处理
DataConnection 类关键属性
ApnSetting mApnSetting APN 配置信息
PhoneBase phone Phone对象
LinkProperties mLinkProperties 网络连接的基本信息
HashMap<Integer, FailCause> sErrorCodeToFailCauseMap 记录所以数据连接失败原因
FailCause lastFailCause 记录最后一次数据连接失败原因
DcXXXState mXXXState 数据连接的6中状态
DataConnection 抽象类关键方法
StateMachine 状态机,实现了State 设计模式的应用
State 设计模式将对象的状态封装成一个对象,在不同状态下,同样的调用执行不同的操作;
Context 上下文维护对个State 子类的实例,每个实例实现该状态的操作;Context只需固定调用State.Handle方法,交由ConcreteState对象的Handle处理;
StateMachine 类共有6个内部类:
ProcessedMessageInfo 已处理的消息实体类
ProcessedMessages 已处理的消息类
SmHandler 消息处理核心类,负责Handler 消息的发生和接收用来管理和更新State对象
HaltingState 关闭的状态类
QuittingState 正在退出的状态类
StateInfo 状态实体类型
StateMachine 运行过程:
addState 增加管理的状态对象
setInitialState 设置状态的初始化对象
start 开始运行状态机
addState 增加管理的状态对象,这些状态对象之间存在着树状关系,一个State对象不会处理的消息交由父节点处理,这是职责链设计模式
StateInfo addState(State state, State parent)
SmHandler 内部类作为自定义的Handler 消息处理对象
private DataConnection(PhoneBase phone, String name, int id, 419 DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, 420 DcController dcc) { 441 442 addState(mDefaultState); 443 addState(mInactiveState, mDefaultState); 444 addState(mActivatingState, mDefaultState); 445 addState(mRetryingState, mDefaultState); 446 addState(mActiveState, mDefaultState); 447 addState(mDisconnectingState, mDefaultState); 448 addState(mDisconnectingErrorCreatingConnection, mDefaultState); 449 setInitialState(mInactiveState); //设置初始化的State对象 450 451 mApnContexts = new ArrayList<ApnContext>(); 452 if (DBG) log("DataConnection constructor X"); 453 }
start() 启动方法的调用则是在子类GSMDataconnection和CDMADataconnection 类完成
APN (Access Point Name) 是通过手机上网必现配置的一个参数,决定手机通过哪种接入方式访问网络;
启动手机后,所以的APN 配置信息都会保存在telephony.db 的SQLite 的数据库表名未carriers 的表中;
adb pull /data/data/com.android.providers.telephony/databases/telephony.db
telephony.db 数据库文件carriers 表:
name APN 配置名称
numeric 运营商编号
apn APN 接入点,比如中国移动有两个接入点:cmwap 和 cmnet
proxy 代理服务器地址
port 端口号
mmsproxy 彩信代理服务器地址
mmsport 彩信代理服务器端口号
mmsc 彩信接入服务地址
type APN 接入类型
Android 支持的 APN 类型,最多支持5种 APN 类型:
default 默认数据类型,即浏览器、Email等手机普通上网数据连接
mms 发送和接收彩信使用的数据连接
supl 支持AGPS 的数据连接
dun(dial-up-network) 拨号连接
hipri 扩张
以上数据连接优先级是由低到高
Android 中新增 APN 配置
1、修改配置文件
2、进入Call Setting 模块设置 APN 配置信息
配置 APN 信息,是修改 $workdir/development/data/etc/apns-conf.xml 配置文件
开机自动建立 default 默认数据连接
查看手机上网的基本参数配置
adb shell netcfg 查看网络基本信息,如网卡名称、状态、IP地址、Mac地址
adb shell ip route 查看IP路由表
完成DataConnection 数据连接的创建和设置:
1、初始化ApnContext,APN 上下午信息
2、SIM 卡加载完成后,设置创建DataConnection 数据连接
3、激活创建的DataConnection 数据连接
初始化ApnContext :
initApnContextAndDataConnection 获取 defaultEnable 和 networkConfigStrings 参数
networkConfigStrings 方法在 frameworks/base/core/res/res/values/configs.xml 配置文件中定义
onSetDependencyMet ,applyNewState 更新数据连接的状态;
创建DataConnection 连接
SIM 卡中联系人加载完成发出 EVENT_RECORDS_LOADED , GSMDataConnectionTracker 接收消息,调用onRecordsLoaded 完成default 默认数据连接的创建和激活:
1、createAllApnList 创建 ApnSetting (APN 配置信息的实体对象)对象列表
2、notifyOffApnsOfAvailability 发出数据连接变化的消息通知
3、setupDataOnReadyApns 创建和激活DataConnection 数据连接
onRecordsLoaded --> setupDataOnReadyApns --> trySetupData --> setupDate 完成数据连接的创建 --> createDataConnection 负责dc 对象的创建
激活DataConnection 数据连接
EVENT_DATA_SETUP_COMPLETE 消息创建,调用bringUp 激活当前数据连接;
创建EVENT_CONNECT,调用父类StateMachine的sendMessage方法,继而调用mSmHandler.sendMessage;
sMsHander 负责完成StateMachine 状态机的消息处理,handleMessage --> processMsg --> curStateInfo.state.processMessage
设置初始状态InactiveState,调用内部processMessage,继而调用onConnect 和 transitionTo