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