




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android APN开发流程分析2 Data Connect流程分析Android的数据连接是基于PPP方式的,主要步骤为:首先通过AT命令激活PDP连接,然后利用pppd通过数据端口完成拨号连接;数据连接的核心控制类是DataConnectionTracker,存在于GSMPhone里,数据连接不需要用户的干预,在APN设置好之后,在适当的情况下就会自动激活,激活的入口点是:DataConnectionTracker.trySetupDatasetupData PdpConnection.connetcCommandsInterface.setupDefaultPDP,通过PdpConnection访问GSMPhone中的RIL层的setupDefaultPDP实现,setupDefaultPDP的结果由EVENT_SETUP_PDP_DONE返回,如果成功,则开始调用pppd完成实际连接,这是通过DataLink.connect实现的;DataLink只是抽象基类,此处它的实现类是PppLink,实现DataLinkInterface接口,所以DataLink.connect实际上调用PppLink.connect,它通过SystemService.start(SERVICE_PPPD_GPRS)开始pppd服务,并通过checkPPP函数访问Linux的sys文件系统来查询pppd的连接状态,如果成功,便可以将LINKUP的消息通知出去以完成连接流程。3 APN流程分析接入点使用在我看来主要包括接入点的创建、接入点的切换以及接入点的删除三个方面,我们下面按照android源码,按照程序调用的先后顺序依次分析其流程;3.1 Create New APN流程分析Android因为是以事件驱动的,因此在诸如接入点设置这样的操作的时候,都是从按键触发事件开始的:Activity.java里的onKeyDown函数;由于是基于EVENT驱动的,因此在每一个动作的时候都会触发一定Type的Message,因此对于源代码流程的分析也比较有利;Create New APN的过程主要就是APN如name、port、proxy等的添加以及在设置的过程里状态的切换等;一、下面为这个过程里JAVA Framework调用的过程:1、 ActivityManagerService.java:startActivity:说明:界面跳转,使用隐式的界面跳转,这个过程是基于事件的,在Android中,传递数据使用Intent,Intent相当于各个Activity之间的桥梁,可以传递数据,可以通过Intent启动另外一个Activity。Intent有显式和隐式之分,显式的是直接什么要启动的组件,比如Service或者Activity,隐式的通过配置的datatype、url、action来找到匹配的组件启动。2、telephony/TelephonyProvider.java:insert函数:说明:通过对URL 的s_urlMatcher.match,URL_TELEPHONY宏的处理,对Name,APN等的检查和容错3、MobileDataStateTracker.java:MobileDataStateReceiver函数说明:这个是这部分处理的一个核心函数,该函数的一个实现为onReceive(),在此函数里对于APN的各种参数如Type(isApnTypeIncluded(apnTypeList))以及状态state进行判断和转换,在这个时候,状态的切换为:old =CONNECTED and new state=DISCONNECTED4、ConnectivityService.java:handleMessage()函数说明:由于系统本身就是事件驱动的,因此这个handleMessage被调用来完成network state状态的改变:DISCONNECTED/DISCONNECTED,并且在这个函数实现了WIFI接入点有关判断;5、GpsLocationProvider.java:updateNetworkState函数说明:GPS状态的更新6、MobileDataStateTracker.java:MobileDataStateReceiver()函数:说明:类似(3),只是状态切换变为:state= CONNECTING, old= DISCONNECTED, reason= apnChanged7、NetworkStateTracker.java:setDetailedState()函数说明:该函数记录网络状态的改变,并在改变的时候发送一个notify事件:Message msg = mTarget.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);8、ConnectivityService.java:handleMessage()函数:说明:类似(4),状态:CONNECTING/CONNECTING9、Checkin.java:updateStats函数:说明:update statistics in the database10、MobileDataStateTracker.java:MobileDataStateReceiver说明:处理在onReceive里,状态为:state= CONNECTED, old= CONNECTING, reason= apnChanged11、NetworkStateTracker.java:setDetailedState()函数说明:(7),状态:old =CONNECTING and new state=CONNECTED12、NetworkStateTracker.java:updateNetworkSettings函数说明:该函数从Network TCP buffer读取network设置参数,并设置网络13、ConnectivityService。java:handleDnsConfigurationChange说明:从dnsList里读取预设的dns 通过writePidDns设置dns二、下面分析RIL Java层的处理:该部分的核心实现存在于Ril.java以及GsmDataConnectionTracker.java之中,Ril.java中RIL.RILSender负责处理命令的发送,RIL.RILReceiver用于处理命令响应以及主动上报信息的接收;Ril.Java中一个命令发送的流程为:RILRequest.obtain(命令ID)复制参数通过Send()函数发送EVENT_SEND在RILSender线程中处理EVENT_SEND将命令写到out stream(socket);Ril.java响应和主动上报消息的流程为:RILReceiver线程监视mSocket inputreadMessage(读取完整响应)processReponse分别处理RESPONSE_UNSOLICITED(主动上报)与REPONSE_SOLICITED(命令响应)RILD守护进程里的Request都是由RIL.java发起3.2 APN 切换流程分析1、ApnPreference.java: onCheckedChanged说明:检查接入点切换的ID是否合法2、MobileDataStateTracker.java:MobileDataStateReceiver说明:处理在onReceive里,状态为:state= DISCONNECTED, old= CONNECTED3、ConnectivityService.java:handleMessage()函数:说明:状态:DISCONNECTED/DISCONNECTED4、ActivityThread.java:getProvider说明:ActivityThread.java是app里的一个实例,在main里创建了一个thread,在getProvider里 holder = ActivityManagerNative.getDefault().getContentProvider(getApplicationThread(), name);进行了判断5、Checkin.java:updateStats函数:说明:update statistics in the database,会对PHONE_GPRS_ATTEMPTED进行判断,在emulator里会报Cant update stat PHONE_GPRS_ATTEMPTED: java.lang.IllegalArgumentException: Unknown URL content:/android.server.checkin/stats的错误6、MobileDataStateTracker.java:MobileDataStateReceiver说明:处理在onReceive里,state= CONNECTED, old= CONNECTING7、NetworkStateTracker.java:setDetailedState()函数说明:状态:old =CONNECTING and new state=CONNECTED8、ConnectivityService.java:handleMessage()函数:说明:状态:CONNECTED/CONNECTED9、NetworkStateTracker.java:updateNetworkSettings函数说明:该函数从Network TCP buffer读取network设置参数,并设置网络10、ConnectivityService.java:handleDnsConfigurationChange说明:从dnsList里读取预设的dns 通过writePidDns设置dns3.3 RILD源码分析RIL对对消息的处理是将消息通过LocalSocket发送到以rild为名称的有名端口。这个有名Socket的创建在ril.cpp代码中。s_fdListen = android_get_control_socket(SOCKET_NAME_RIL)RILD是守护进程,执行的过程为:获取参数打开功能库建立事件循环执行RIL_InitRIL_register;事件循环式核心,通过Select多路复用机制,读取来自上层的Socket接口的具体操作命令,同时一些命令Timeout唤醒机制,也通过Select实现;1. Request流程命令下发流程:首先从JAVA层通过Socket将命令发送到RIL层的RILD守护进程,RILD中负责监听的ril_event_loop消息循环中的Select发现RILD Socket有了请求连接信号,建立一个record_stream,打通与上层的数据通道并开始接收请求数据,数据通道的回调函数processCommandsCallback()会保证收到一个完整的Request后,将其送达processCommandBuffer()函数;解析过程:processCommandBuffer()从Socket中序列化的数据流里还原信息,将其组织到RequestInfo中;RequestInfo数据结构如下(存在于ril.cpp中):typedef struct RequestInfo int32_t token; /this is not RIL_Token CommandInfo *pCI; struct RequestInfo *p_next; char cancelled; char local; / responses to local commands do not go back to command process RequestInfo;RIL层以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()完成驱动层的发送,writeline通过驱动程序节点的文件描述符进行写操作实现控制。2. Response流程Response有两类:unsolicited表示主动上报的消息,如来电,来短信等,而solicited是AT命令的响应,判断是否是solicited的依据有两点:一是当前用AT命令正在等待响应;二是读取的响应符合该AT命令的响应格式。对于Response流程来讲,流程是从Modem设备发回响应数据开始的。RIL通过readerLoop函数,利用readline逐行读取响应数据,随后通过processLine进行分析,主动上报的一般以+XXXX的形式出现,而AT命令的响应格式则有一行或多行之分,但最终一定以OK或者ERROR结尾,于是PrcessLine有以下几种情况:1)、没有AT命令等待响应或不符合AT响应格式,一般是主动上报行,由handleUnsolicited处理,handl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 艾灸与用火安全知识培训课件
- 课程资源共享线上教学线下教学衔接计划
- (2025年标准)退卡金协议书
- (2025年标准)冷库维保协议书
- 2025年占用小区道路协议书
- 房屋建筑工程质量风险防范体系与措施
- 学校安全隐患排查岗位职责
- 苏教版五年级音乐专题活动计划
- (2025年标准)委托家人收款协议书
- 5G助力金融科技创新心得体会
- 散裂中子源项目进展课件
- 病历书写基本规范-课件
- 魔兽世界85-90升级路线(BL)
- 纤支镜在麻醉科的应用
- 微生物发酵中药研究进展
- 《矿业权评估指南》
- 机动车维修竣工出厂合格证样式
- 手机拍照技巧大全课件
- 工业建筑钢筋工程监理实施细则
- 2023版北京协和医院重症医学科诊疗常规
- 人工膝关节置换术护理查房
评论
0/150
提交评论