AndroidAPN开发流程分析知识讲解.doc
《AndroidAPN开发流程分析知识讲解.doc》由会员分享,可在线阅读,更多相关《AndroidAPN开发流程分析知识讲解.doc(59页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Good is good, but better carries it.精益求精,善益求善。AndroidAPN开发流程分析-AndroidAPN开发流程分析2DataConnect流程分析Android的数据连接是基于PPP方式的,主要步骤为:首先通过AT命令激活PDP连接,然后利用pppd通过数据端口完成拨号连接;数据连接的核心控制类是DataConnectionTracker,存在于GSMPhone里,数据连接不需要用户的干预,在APN设置好之后,在适当的情况下就会自动激活,激活的入口点是:DataConnectionTracker.trySetupDatasetupDataPdpCon
2、nection.connetcCommandsInterface.setupDefaultPDP,通过PdpConnection访问GSMPhone中的RIL层的setupDefaultPDP实现,setupDefaultPDP的结果由EVENT_SETUP_PDP_DONE返回,如果成功,则开始调用pppd完成实际连接,这是通过DataLink.connect实现的;DataLink只是抽象基类,此处它的实现类是PppLink,实现DataLinkInterface接口,所以DataLink.connect实际上调用PppLink.connect,它通过SystemService.start
3、(SERVICE_PPPD_GPRS)开始pppd服务,并通过checkPPP函数访问Linux的sys文件系统来查询pppd的连接状态,如果成功,便可以将LINKUP的消息通知出去以完成连接流程。2DataConnect流程分析Android的数据连接是基于PPP方式的,主要步骤为:首先通过AT命令激活PDP连接,然后利用pppd通过数据端口完成拨号连接;数据连接的核心控制类是DataConnectionTracker,存在于GSMPhone里,数据连接不需要用户的干预,在APN设置好之后,在适当的情况下就会自动激活,激活的入口点是:DataConnectionTracker.trySetu
4、pDatasetupDataPdpConnection.connetcCommandsInterface.setupDefaultPDP,通过PdpConnection访问GSMPhone中的RIL层的setupDefaultPDP实现,setupDefaultPDP的结果由EVENT_SETUP_PDP_DONE返回,如果成功,则开始调用pppd完成实际连接,这是通过DataLink.connect实现的;DataLink只是抽象基类,此处它的实现类是PppLink,实现DataLinkInterface接口,所以DataLink.connect实际上调用PppLink.connect,它通
5、过SystemService.start(SERVICE_PPPD_GPRS)开始pppd服务,并通过checkPPP函数访问Linux的sys文件系统来查询pppd的连接状态,如果成功,便可以将LINKUP的消息通知出去以完成连接流程。3.3RILD源码分析RIL对对消息的处理是将消息通过LocalSocket发送到以rild为名称的有名端口。这个有名Socket的创建在ril.cpp代码中。s_fdListen=android_get_control_socket(SOCKET_NAME_RIL)RILD是守护进程,执行的过程为:获取参数打开功能库建立事件循环执行RIL_InitRIL_r
6、egister;事件循环式核心,通过Select多路复用机制,读取来自上层的Socket接口的具体操作命令,同时一些命令Timeout唤醒机制,也通过Select实现;1.Request流程命令下发流程:首先从JAVA层通过Socket将命令发送到RIL层的RILD守护进程,RILD中负责监听的ril_event_loop消息循环中的Select发现RILDSocket有了请求连接信号,建立一个record_stream,打通与上层的数据通道并开始接收请求数据,数据通道的回调函数processCommandsCallback()会保证收到一个完整的Request后,将其送达processCom
7、mandBuffer()函数;解析过程:processCommandBuffer()从Socket中序列化的数据流里还原信息,将其组织到RequestInfo中;RequestInfo数据结构如下(存在于ril.cpp中):typedefstructRequestInfoint32_ttoken;/thisisnotRIL_TokenCommandInfo*pCI;structRequestInfo*p_next;charcancelled;charlocal;/responsestolocalcommandsdonotgobacktocommandprocessRequestInfo;RIL
8、层以Request号为基础采用表驱动方式分发请求,CommandInfo结构表示命令的信息,关联了Request号和实际的请求函数,以及响应函数之间的关系;分发流程:s_callback.onRequest()完成分发操作,s_callback获取自libreference-ril的RIL_RadioFunction结构指针,Request请求在这里转入底层的libreference-ril处理,handler是reference-ril.cpp中的Request。onRequest根据Request号进行简单的switch分发,然后将命令和参数转换成对应的AT命令,由writeline()完
9、成驱动层的发送,writeline通过驱动程序节点的文件描述符进行写操作实现控制。2.Response流程Response有两类:unsolicited表示主动上报的消息,如来电,来短信等,而solicited是AT命令的响应,判断是否是solicited的依据有两点:一是当前用AT命令正在等待响应;二是读取的响应符合该AT命令的响应格式。对于Response流程来讲,流程是从Modem设备发回响应数据开始的。RIL通过readerLoop函数,利用readline逐行读取响应数据,随后通过processLine进行分析,主动上报的一般以+XXXX的形式出现,而AT命令的响应格式则有一行或多行
10、之分,但最终一定以OK或者ERROR结尾,于是PrcessLine有以下几种情况:1)、没有AT命令等待响应或不符合AT响应格式,一般是主动上报行,由handleUnsolicited处理,handleUnsolicitedonUnsolicetdRIL_onUnsolicitedResponse;2)、isFinalResponseSucess/isFinalResponseError是最终响应行,转到handleFinalResponse处理,handleFInalResponse会发送线程同步信号,激活等到的发送线程;3)、符合当前AT命令响应格式的行,解析并获取数据,这是响应处理的中间
11、过程,然后继续收到最终响应行,然后进入2)流程最后的发送动作由sendResponsesendResponseRawblockingWrite通过Socket回传给上层来完成,响应解析由上层完成。AndroidMMS源码流程(一)2010-06-2508:21概述MMS的收发操作借助于手机的短信机制,实际收发过程需要网络的APN支持,使用特定的APN接入点实现MMS数据的真实发送和接收;源码流程1)Telephpony.javagetOrCreateThreadId()函数:目录:frameworksbasecorejavaandroidprovider说明:这个函数根据接收者列表和未保存的消
12、息返回一个线程ID,如果这个消息开始一个新的线程,那么函数分配一个线程ID,否则返回一个适当的已经存在的线程ID;2)MmsMessageSender.javasendMessage()函数:目录:packagesappsmmssrccomandroidmmstransaction说明:对Mms进行封包3)再一次调用第一步函数4)ConnectivityService.javastartUsingNetworkFeature()函数:目录:frameworkbaseservicesjavacomandroidserver说明:该函数为实现Mms网络连接的关键函数,下面我们详细分析:A、enfo
13、rceChangePermission():判断调用的进程是否具有操作权限,如果不具有,抛出一个SecurityException异常,并强制准许权限B、ConnectivityManager.isNetworkTypeValid(networkType)来判断networkType是否合法,如果不合法返回一个APN_REQUEST_FAILED,在这里用到了最重要的ConnectivityManager类:publicclassConnectivityManager定义在frameworksbasecorejavaandroidnet的ConnectivityManager.java里,其主
14、要作用为:1、监视网络连接,如WIFI、GPRS、UMTS等2、当网路连接出现变化的时候,发送广播intents3、当一个网络连接丢失之后,尝试连接另一个网络4、为App提供粗粒度、细粒度的有效网络状态查询C、FeatureUserf=newFeatureUser(networkType,feature,binder);新建一个FeatureUser类变量,该类实现:当调用进程died时发送一个Notice,这样就可以自我老化D、intusedNetworkType=networkType;if(networkType=ConnectivityManager.TYPE_MOBILE)if(Te
15、xtUtils.equals(feature,Phone.FEATURE_ENABLE_MMS)usedNetworkType=ConnectivityManager.TYPE_MOBILE_MMS;elseif(TextUtils.equals(feature,Phone.FEATURE_ENABLE_SUPL)usedNetworkType=ConnectivityManager.TYPE_MOBILE_SUPL;elseif(TextUtils.equals(feature,Phone.FEATURE_ENABLE_DUN)usedNetworkType=ConnectivityMana
16、ger.TYPE_MOBILE_DUN;elseif(TextUtils.equals(feature,Phone.FEATURE_ENABLE_HIPRI)usedNetworkType=ConnectivityManager.TYPE_MOBILE_HIPRI;这段代码获取使用的网络类型;E、NetworkStateTrackernetwork=mNetTrackersusedNetworkType;NetworkStateTracker类在NetworkStateTracker.java里:每个子类保持跟踪一个网络接口的连接状态,一个网络的状态信息由一个Tracker类保持,基类管理ne
17、twork-type-independent网络状态F、mFeatureUsers.add(f);列表操作,将f添加到列表的endG、if(!mNetRequestersPidsusedNetworkType.contains(currentPid)/thisgetsusedforper-piddnswhenconnectedmNetRequestersPidsusedNetworkType.add(currentPid);判断网络操作需要的Pid是否包含当前Pid,如果不包含就添加进去H、mHandler.sendMessageDelayed(mHandler.obtainMessage(N
18、etworkStateTracker.EVENT_RESTORE_DEFAULT_NETWORK,f),getRestoreDefaultNetworkDelay();消息发送,问题:消息的Handle函数也在该文件本地,?I、if(ni.isConnectedOrConnecting()=true)&!network.isTeardownRequested()if(ni.isConnected()=true)/addthepid-specificdnsLog.d(TAG,fanyltest+beforehandleDnsConfigurationChange);handleDnsConfig
19、urationChange();if(DBG)Log.d(TAG,specialnetworkalreadyactive);returnPhone.APN_ALREADY_ACTIVE;if(DBG)Log.d(TAG,specialnetworkalreadyconnecting);returnPhone.APN_REQUEST_STARTED;这里判断网络是正在连接还是已经连接完成,如果是已经连接完成,就去设置Dns,并返回already状态J、network.reconnect()如果网络不是已经连接完成的状态的话,这里触发一个重新连接,直到网络状态变成isConnected;Andro
20、idMMS源码流程(二)2010-06-2508:215)接下来的操作存在于DataConnectionTracker.java里:publicsynchronizedintenableApnType(Stringtype):该函数确保用指定的类型连接APN,成功返回APN_ALREADY_ACTIVE或者APN_REQUEST_STARTEDprivatevoidsetEnabled(intid,booleanenable):发送EVENT_ENABLE_NEW_APN事件protectedsynchronizedvoidonEnableApn(intapnId,intenabled)该实例
21、主要功能是判断目前是enable还是disableAPN,如果是enable的话,调用onEnableNewApn();实现enableAPN,如果是disable的话,根据enabledCount,onCleanUpConnection关闭APN或者改为默认连接6)publicvoidhandleMessage(Messagemsg),ConnectivityService.java里进入到对事件EVENT_STATE_CHANGED的处理,state=CONNECTED,old=CONNECTING,reason=apnChanged,apnTypeList=mms,应该是最后调用了han
22、dleConnect(info);发送一个广播事件7)MobileDataStateTracker.java:MobileDataStateReceiver类的publicvoidonReceive(Contextcontext,Intentintent)函数里处理caseCONNECTED处理;调用setDetailedState(NetworkStateTracker类实例)发送了EVENT_STATE_CHANGED事件8)然后又跳回ConnectivityService.java里的handleMessage函数EVENT_STATE_CHANGED事件的CONNECTED状态处理9)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AndroidAPN 开发 流程 分析 知识 讲解
限制150内