AndroidDATA主要流程
⽂章⽬录
1. 数据连接建⽴(Android O 为基准)
1.1 数据连接主要流程
1. 上层 APP(如 MMS)需要使⽤⽹络连接时,⾸先将请求发送到 ConnectivityManager 。
2. 之后由 ConnectivityService 对请求进⾏分发,属于数据通信的请求会被分发到 TelephonyNetworkFactory 中进⾏请求的优先级
评估处理,从⽽决定是否需要切换数据主卡以满⾜此次请求。
3. 真正建⽴连接是在 DcTracker 中,该类会检查当前设备状态(是否驻⽹,是否漫游,数据开关是否打开等),如条件允许则通过
DataConnection 发起⽹络连接。
4. DataConnection 为状态机,初始为未激活状态,收到建⽴连接的请求后进⼊激活中状态,在此状态中
通过 RILJ 的接⼝发起⽹络连
接建⽴流程,请求随之进⼊RIL层。
5. DataConnection 在激活中状态 等待底层数据连接建⽴的响应,如modem返回数据连接建⽴成功则进⼊激活状态,创建⽹络客户端
注册到 ConnectivityManager 中,并通知上层数据连接建⽴成功;如modem返回数据连接建⽴失败,则回到未激活状态,上报连接建⽴失败,DcTracker 根据modem返回的重试建议,决定是否发起重试。
1.2 需注意的细节
数据连接的建⽴其实在设备开机的时候就会开始,⼀般在SIM 卡加载完成之后会尝试建⽴数据连接,另外如果APN 信息变化,飞⾏模式开关(Radio 开关)也会触发数据连接重建。在数据连接质量极差(只有上⾏没有下⾏)时,会触发 Do Recovery 机制重启Radio,Q上的新特性会根据数据连接的建⽴情况(IMS,Default)来判断⽹络质量,如果 IMS 连接先⾏建⽴⽽后Default连接建⽴失败,会导致Detach发⽣,这是⼀个Bug。
Android P 之后在 DataConnection 中与 RILJ 交互的代码被抽取出来,封装成了 DataService 服务,
专门⽤来处理数据相关的与RILJ交互的业务。
Android Q 之后, 在 DcTracker 与 DataConnection 之间起到连接作⽤的 DcAsyncChannel 被剔除,DcTracker直接与
DataConnection 交互。
2. 信号上下⾏显⽰
2.1 信号上下⾏主要流程
1. 数据连接建⽴成功之后,会通过Phone对象将该信息传播出来。
2. Phone对象 notify 的过程其实是通过 DefaultPhoneNotifier 对象来完成的,⽽其真正起到唤醒监听者的作⽤的其实是
TelephonyRegistry 对象。
3. TelephonyRegistry 类可以看做是 Phone 数据的集散中⼼,其他模块通过TelephonyManager 注册 Listener 到
TelephonyRegistry,之后有对应事件到来,回调函数都会被调⽤,其他模块据此得到Phone数据。
4. 信号上下⾏的显⽰依赖以上流程,MobileSignalController 注册监听,有数据上下⾏变化时拿到数据,将其封装到MobileState 对象
中,之后通过回调将状态变化通知到 SignalClusterView 中,该类对应于状态栏信号相关的图标,进⽽刷新图标显⽰。
5. 在 Android 原⽣系统中,QuickSetting⾯板也存在信号的显⽰,其流程与状态栏更新显⽰类似,都是通过接⼝回调完成。
2.2 需注意的细节
1. Android P 之后状态栏信号显⽰架构变化较多,SignalClusterView 被废弃,取⽽代之的是MobileStatusBarView。在这之
上,MobileSignalController 与 MobileStatusBarView没有直接交互,⽽是通过以下链式关系完成交互的。
MobileSignalController ->StatusBarSignalPolicy->StatusBarIconController->MobileStatusBarView
2. Phone 对象 notify 数据的流程很关键,在此处可以实现很多feature。例如信号的延时下降,可以在此处通过定时任务控制
TelephonyRegistry 调⽤ listener 回调函数,从⽽实现多点同步的信号延迟下降。另外在Android O 中 ServiceStateTracker 根据信号对象变化来决定是否 notify 信号改变的代码有个bug,就是⽤于记录旧值的信号对象从来没有被赋值。 该问题在之后的版本中被修复了,那笔提交与笔者有些许关系。
3. 数据重连
3.1 数据重连主要流程
1. 其实该部分在数据连接建⽴的部分就有提及,modem 返回数据连接建⽴失败后会有⼀个重试机制。
2. 如果 modem 建议的 delay 值⼤于 0, 则上层通过定时任务重新开始数据连接的建⽴流程。
制作android软件流程
3.2 需注意的点
数据重连对 APN 是有要求的,在⼀个APN上最多重试 3 次,3 次之后还没有成功则标记其永久失败,不会再使⽤该APN重试了。这⾥涉及到了 ApnContext 与 ApnSetting的概念。
ApnContext
ApnContext 对应的是⼀种业务能⼒,也可以说对应了⼀种 ApnType,⽐如 IMS,Default。在DcTracker中完成初始化创建
(initApnContext()⽅法)
APNSetting
APN 是⼀条⽹络接⼊点的记录,在 TelephonyProvider 中完成插⼊数据库表。ApnSetting 就是APN数据库记录对应的封装对象,可以看成是⼀个容器 bean。
通常建⽴数据连接需要使⽤ DataConnection,⽽ DataConnection 只是⼀个连接,该连接承载的能⼒由 ApnContext 决定。ApnContext 是⼀种业务能⼒,它⼜可以对应多个ApnSetting,因为同样的⽹络能⼒(例如Default)可以由多个不同的 APN 配置达到,这就像我们想要去超市,可以开车,也可以选择步⾏。
4. 数据主卡切换
4.1 数据切换主要流程
1. 当数据主卡为sim1 时,⽤户偏偏要使⽤ sim2 发送彩信,则会触发数据主卡的切换流程
2. 该流程和之前提到的 评估⽹路请求有关,在 initApnContext 的时候,通常MMS 的优先级⽐ Default 的优先级⾼,这样继承了
NetworkFactory 的 PhoneSwitcher 评估后会判断需优先满⾜ MMS 请求,从⽽触发切换数据的⾏为。另外 NetworkFactory 也有评分机制,当多种连接并存时(数据连接,wifi等)所有 NetworkFactory 都能收到request,但是只有能够满⾜request并且评分更⾼的 NetworkFactory 有权处理对应的 request。
优先级由 networkAttributes 数组来定义,⼀般有如下定义:
<item>"wifi,1,1,1,-1,true"</item>
以逗号为分割,其中第四个值为优先级,数值越⼤优先级也就越⾼
3. 这时需要先将 sim1 的数据连接去激活,然后激活sim2 的数据连接,之后就是建⽴sim2数据连接的流程。
4.2 需注意的细节
1. 不同平台此处流程略有不同,不过主要是回调机制的不同,有些平台是使⽤CallBack 回调,有些则是使⽤notify 监听。
2. 请求评估主要是使⽤⼀个优先权队列来完成,所有请求会被加⼊队列,然后根据优先权来排序。
5. Android Q 数据相关变化
Android Q 上对 data 和 wifi 做了区分,data 统⼀为WWAN , ⽽wifi 则被划为 WLAN,由不同的Man
ager管理。另外为适应 5G 的不同实现(NSA 和 SA),在NSA(⾮独⽴组⽹)时数据类型仍然是 4G(LTE),但是可以通过频段参数来确定其是否为5G,进⽽完成数据图标等UI和相关设置的显⽰。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。