当前位置:   article > 正文

基于Android11的拨号流程分析

基于android11的拨号流程分析

目录

1、概述

2、流程图

3、类图

4、拨号流程分析

4.1 ServiceStateTracker分析

4.2 DcTracker分析

4.3 DataConnection分析

4.3.1 状态机机制

4.3.2 DataConnection状态树

4.3.3 bringUp流程分析

4.4 DataServiceManager分析

4.5 DataService分析

5、重点函数分析

5.1 pollStateDone调用分析

5.2 setupDataOnAllConnectableApns调用分析

6、总结


1、概述

拨号分析也就是数据业务如何建立起来,本文档用于分析及总结拨号的流程,用于后面快速定位RIL拨号这块出现的问题。

2、流程图

从流程图来看,调用很清楚,但重点在DataService里并没有去真正实现setupDataCall功能,而是通过其他provider类继承他实现setupDataCall功能。通过继承特性,我们可以看出,这个设计意思是后面计划有可能多个provider,但实际代码搜了下,目前只有CellularDataServiceProvider,可能框架先做好,后面想添加时,直接实现就行。从这里看出,大老设计的代码就是优秀,普通人不会想那么长远。这也体现了代码的艺术。

3、类图

从类图层次来看,拨号可分为4层,自上到下分别为Data应用、Data接口、Data服务、RILJ。

 

  • Data应用:内容主要是确认是否满足拨号及拨号过程处理;
  • Data接口:封闭Data服务,对外提供接口;
  • Data服务:提供拨号的接口;
  • RILJ:向RILD发起拨号。

Data应用:重点由DcTracker、ServiceStateTracker和DataConnecion 3个类组成。ServiceStateTracker用于处理当前的网络状态,如data voice 信号等。DcTracker用于拨号的逻辑处理流程,如是否打开数据业务,APN组装等。DataConnection是拨号的一个状态机。DataServiceManager用于提供DataService的接口。

Data接口:封装服务对外提供的接口,按设计模式的思路是外面不需要关心具体的接口如何实现,只管调用。

Data服务:此处可以再细分为提供者和服务。提供者由CellularDataServiceProvider和CellularDataService组成,从类图可以看出,都是继承了服务里的相关类;服务重点由DataService组成。DataService用于提供拨号的相关服务,DataServiceProvider和IDataServiceWrapper通过向DataServiceHandler发Message消息进行相关逻辑处理,IDataServiceWrapper是实现AIDL接口,也就是对外提供的服务接口。

RILJ用于向RILD处下RIL消息,本文档不重点介绍此处功能。

4、拨号流程分析

完整拨号的时序图如下。

 

4.1 ServiceStateTracker分析

在RILJ 的4个网络状态operator、voice、data、selection mode查询时,会触发对应的handle消息然后调用handlePollStateResult,见如下代码:

  1. case EVENT_POLL_STATE_CS_CELLULAR_REGISTRATION:
  2. case EVENT_POLL_STATE_PS_CELLULAR_REGISTRATION:
  3. case EVENT_POLL_STATE_PS_IWLAN_REGISTRATION:
  4. case EVENT_POLL_STATE_OPERATOR:
  5.     ar = (AsyncResult) msg.obj;
  6.     handlePollStateResult(msg.what, ar);
  7. break;
  8. case EVENT_POLL_STATE_NETWORK_SELECTION_MODE:
  9.     if (DBG) log("EVENT_POLL_STATE_NETWORK_SELECTION_MODE");
  10.     ar = (AsyncResult) msg.obj;
  11.     if (mPhone.isPhoneTypeGsm()) {
  12.         handlePollStateResult(msg.what, ar);
  13.     } else {
  14.         if (ar.exception == null && ar.result != null) {
  15.             ints = (int[])ar.result;
  16.         if (ints[0] ==
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/386580
推荐阅读
相关标签
  

闽ICP备14008679号