2022年AndroidAPN开发流程分析 .pdf
《2022年AndroidAPN开发流程分析 .pdf》由会员分享,可在线阅读,更多相关《2022年AndroidAPN开发流程分析 .pdf(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Android APN 开发流程分析2 Data Connect流程分析Android 的数据连接是基于PPP方式的,主要步骤为:首先通过AT命令激活 PDP 连接,然后pppd通过数据端口完成拨号连接;数据连接的核心控制类是DataConnectionTracker ,存在于 GSMPhone 里,数据连接不需要用干预,在 APN 设置好之后,在适当的情况下就会自动激活,激活的入口点是:DataConnectionTracker.trySetupDat asetupDat aPdpConnection.connet cCommandsInterface.setupDefaultPDP,通过
2、PdpConnection 访问 GSMPhoneRIL 层的 setupDefaultPDP 实现, setupDefaultPDP 的结果由 EVENT_SETUP_PDP_DONE返回,如果成则开始调用 pppd 完成实际连接,这是通过DataLink.connect实现的;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 25 页 - - - - - - - - - DataLink 只是抽象基类,此处它的实现类是PppLink,实现 DataLinkInterfa
3、ce接口,所以DataLink.connect实际上调用 PppLink.connect ,它通过 SystemService.start(SERVICE_PPPD_开始 pppd 服务,并通过 checkPPP函数访问 Linux 的 sys 文件系统来查询 pppd的连接状态, 如果便可以将 LINKUP的消息通知出去以完成连接流程。2 Data Connect流程分析Android 的数据连接是基于PPP方式的,主要步骤为:首先通过AT命令激活 PDP连接,然后利用 pppd 通过数据端口完成拨号连接;数据连接的核心控制类是DataConnectionTracker ,存在于 GSMPh
4、one 里,数据连接不需要用户的干预,在APN 设置好之后,在适当的情况下就会自动激活,激活的入口点是: DataConnectionTracker.trySetupDat asetupDat aPdpConnection.connet cCommandsInterface.setupDefaultPDP,通过PdpConnection 访问 GSMPhone 中的 RIL 层的 setupDefaultPDP 实现,setupDefaultPDP 的结果由 EVENT_SETUP_PDP_DONE返回,如果成功,则开始调用 pppd 完成实际连接,这是通过DataLink.connect实现
5、的;DataLink 只是抽象基类,此处它的实现类是PppLink,实现DataLinkInterface接口, 所以 DataLink.connect实际上调用 PppLink.connect ,它通过 SystemService.start(SERVICE_PPPD_GPRS)开始 pppd服务,并通过checkPPP函数访问 Linux 的 sys 文件系统来查询pppd的连接状态,如果成功,便可以将 LINKUP的消息通知出去以完成连接流程。3.3 RILD 源码分析RIL 对对消息的处理是将消息通过LocalSocket 发送到以rild 为名称的有名端口。这个有名Socket的创建
6、在ril.cpp代码中。s_fdListen = android_get_control_socket(SOCKET_NAME_RIL) RILD是守护进程,执行的过程为:获取参数 打开功能库建立事件循环执行RIL_Init RIL_register ; 事件循环式核心, 通过 Select 多路复用机制, 读取来自上层的Socket名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 25 页 - - - - - - - - - 接口的具体操作命令,同时一些命令Timeout
7、 唤醒机制,也通过Select 实现;1. Request流程命令下发流程:首先从JAVA 层通过 Socket 将命令发送到RIL 层的 RILD 守护进程,RILD 中负责监听的ril_event_loop 消息循环中的Select发现 RILD Socket 有了请求连接信号,建立一个record_stream,打通与上层的数据通道并开始接收请求数据,数据通道的回调函数processCommandsCallback()会保证收到一个完整的Request 后,将其送达 processCommandBuffer ()函数;解析过程: processCommandBuffer ()从Socke
8、t 中序列化的数据流里还原信息,将其组织到 RequestInfo 中; RequestInfo 数据结构如下(存在于ril.cpp 中) :typedef struct RequestInfo int32_t token; /this is not RIL_TokenCommandInfo *pCI;struct RequestInfo *p_next;char cancelled;char local; / responses to local commands do not go back to command process RequestInfo;RIL 层以 Request 号为基
9、础采用表驱动方式分发请求,CommandInfo 结构表示命令的信息,关联了Request 号和实际的请求函数,以及响应函数之间的关系;分发流程: s_callback.onRequest()完成分发操作,s_callback 获取自libreference-ril的 RIL_RadioFunction结构指针, Request 请求在这里转入底层的libreference-ril 处理,handler 是 reference-ril.cpp 中的 Request。onRequest根据 Request 号进行简单的switch 分发, 然后将命令和参数转换成对应的AT命令,由 writeli
10、ne ()完成驱动层的发送,writeline 通过驱动程序节点的文件描述符进行写操作实现控制。2. Response流程Response有两类: unsolicited 表示主动上报的消息,如来电,来短信等,而solicited 是AT 命令的响应,判断是否是solicited 的依据有两点:一是当前用AT 命令正在等待响应;二是读取的响应符合该AT 命令的响应格式。对于 Response流程来讲,流程是从Modem 设备发回响应数据开始的。RIL 通过 readerLoop 函数,利用readline 逐行读取响应数据,随后通过processLine 进名师资料总结 - - -精品资料欢迎
11、下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 25 页 - - - - - - - - - 行分析,主动上报的一般以+XXXX的形式出现,而AT 命令的响应格式则有一行或多行之分,但最终一定以OK 或者 ERROR 结尾,于是PrcessLine 有以下几种情况:1) 、 没有AT 命令等待响应或不符合AT 响 应格 式,一般是主动上报行,由handleUnsolicited 处理, handleUnsolicited onUnsolicetd RIL_onUnsolicitedResponse;2) 、
12、 isFinalResponseSucess/isFinalResponseError 是最终响应行, 转到 handleFinalResponse处理, handleFInalResponse 会发送线程同步信号,激活等到的发送线程;3) 、符合当前AT 命令响应格式的行,解析并获取数据,这是响应处理的中间过程,然后继续收到最终响应行,然后进入2)流程最后的发送动作由sendResponse sendResponseRaw blockingWrite通过 Socket回传给上层来完成,响应解析由上层完成。Android MMS 源码流程(一)2010-06-25 08:21 概述MMS 的收
13、发操作借助于手机的短信机制,实际收发过程需要网络的APN 支持,使用特定的 APN 接入点实现 MMS 数据的真实发送和接收;源码流程1) Telephpony.java getOrCreateThreadId() 函数:目录:说明:这个函数根据接收者列表和未保存的消息返回一个线程ID,如果这个消息开始一个新的线程,那么函数分配一个线程ID,否则返回一个适当的已经存在的线程 ID;2) MmsMessageSender.java sendMessage()函数:目录:说明:对 Mms 进行封包3) 再一次调用第一步函数4) ConnectivityService.java startUsing
14、NetworkFeature() 函数:目录:说明:该函数为实现Mms 网络连接的关键函数,下面我们详细分析:A、enforceChangePermission() :判断调用的进程是否具有操作权限,如果不具有,抛出一个 SecurityException异常,并强制准许权限B、 ConnectivityManager.isNetworkTypeValid(networkType) 来判断networkType 是否合法,如果不合法返回一个APN_REQUEST_FAILED ,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名
15、师精心整理 - - - - - - - 第 4 页,共 25 页 - - - - - - - - - 在这里用到了最重要的ConnectivityManager 类:public class ConnectivityManager定义在frameworksbasecorejavaandroidnet 的 ConnectivityManager.java 里,其主要作用为:1、监视网络连接,如WIFI 、GPRS、UMTS 等2、当网路连接出现变化的时候,发送广播intents3、当一个网络连接丢失之后,尝试连接另一个网络4、为 App 提供粗粒度、细粒度的有效网络状态查询C、 FeatureU
16、ser f = new FeatureUser(networkType, feature, binder);新建一个 FeatureUser类变量,该类实现:当调用进程died 时发送一个Notice,这样就可以自我老化D、int usedNetworkType = networkType;if(networkType = ConnectivityManager.TYPE_MOBILE) if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS) usedNetworkType = ConnectivityManager.TYPE_MOBIL
17、E_MMS; else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL) usedNetworkType = ConnectivityManager.TYPE_MOBILE_SUPL; else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN) usedNetworkType = ConnectivityManager.TYPE_MOBILE_DUN; else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_HIP
18、RI) usedNetworkType = ConnectivityManager.TYPE_MOBILE_HIPRI;这段代码获取使用的网络类型;E、NetworkStateTracker network = mNetTrackersusedNetworkType;NetworkStateTracker类在 NetworkStateTracker.java里:每个子类保持跟踪一个网络接口的连接状态,一个网络的状态信息由一个Tracker类保持,基类管理 network-type-independent 网络状态F、mFeatureUsers.add(f);列表操作,将 f 添加到列表的 en
19、dG、if (!mNetRequestersPidsusedNetworkType.contains(currentPid) / this gets used for per-pid dns when connectedmNetRequestersPidsusedNetworkType.add(currentPid);判断网络操作需要的Pid 是否包含当前 Pid,如果不包含就添加进去H、mHandler.sendMessageDelayed(mHandler.obtainMessage(名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
20、- - 名师精心整理 - - - - - - - 第 5 页,共 25 页 - - - - - - - - - NetworkStateTracker.EVENT_RESTORE_DEFAULT_NETWORK,f), getRestoreDefaultNetworkDelay();消息发送,问题:消息的Handle函数也在该文件本地,?I、if (ni.isConnectedOrConnecting() = true) &!network.isTeardownRequested() if (ni.isConnected() = true) / add the pid-specific dns
21、Log.d(TAG, fanyl test + before handleDnsConfigurationChange);handleDnsConfigurationChange();if (DBG) Log.d(TAG, special network already active);return Phone.APN_ALREADY_ACTIVE;if (DBG) Log.d(TAG, special network already connecting);return Phone.APN_REQUEST_STARTED;这里判断网络是正在连接还是已经连接完成,如果是已经连接完成,就去设置
22、Dns,并返回 already状态J、network.reconnect()如果网络不是已经连接完成的状态的话,这里触发一个重新连接,直到网络状态变成 isConnected ;Android MMS 源码流程(二)2010-06-25 08:21 5) 接下来的操作存在于DataConnectionTracker.java里: public synchronized int enableApnType(String type) :该函数确保用指定的类型连接APN, 成功返回 APN_ALREADY_ACTIVE或者 APN_REQUEST_STARTEDprivate void setEna
23、bled(int id, boolean enable) :发送 EVENT_ENABLE_NEW_APN事件protected synchronized void onEnableApn(int apnId, int enabled)该实例主要功能是判断目前是enable还是 disable APN,如果是 enable的话,调用 onEnableNewApn();实现 enable APN,如果是 disable的话,根据enabledCount ,onCleanUpConnection关闭 APN 或者改为默认连接6) public void handleMessage(Message
24、msg) ,ConnectivityService.java里进入到对事件 EVENT_STATE_CHANGED 的处理, state= CONNECTED, old= CONNECTING, reason= apnChanged, apnTypeList= mms ,应该是最后调用了handleConnect(info);发送一个广播事件7) MobileDataStateTracker.java :MobileDataStateReceiver类的 public void onReceive(Context context, Intent intent) 函数里处理 case CONNE
25、CTED处理;调用 setDetailedState (NetworkStateTracker类实例)发送了名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 25 页 - - - - - - - - - EVENT_STATE_CHANGED 事件8) 然后又跳回 ConnectivityService.java里的 handleMessage函数EVENT_STATE_CHANGED 事件的 CONNECTED 状态处理9)handleConnect里最后调用 updat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年AndroidAPN开发流程分析 2022 AndroidAPN 开发 流程 分析
限制150内