Telephony Framework(NW) 初始化

一 Telephony Framework初始化整体流程
Telephony Framework(NW) 初始化

如图,Telephony Framework初始化由PhoneApp开始。PhoneApp是一个系统应用,在AndroidManifest.xml中定义属性android:persistent=”true”,表明该应用在系统启动后启动,并且不会退出关闭,若因异常导致被关闭会重新启动。
二 RIL
RIL (Radio Interface Layer)
1 RIL架构

Telephony Framework(NW) 初始化

上图为RIL架构图,总体展示了一个RIL命令从RILJ到RILD再到Modem的过程以及RIL的构成结构。其中RILJ是指RIL结构中Java代码的部分,包括RIL.java、RadioResponse、RadioIndication等,RILC是指RIL结构中C/C++代码的部分,包括的文件有ril.c、rild.c、ril_service.c、reference-ril.c等。

RIL中有两种消息,Request消息和Unsolicited消息(Urc消息)。
Request消息是指RILJ主动发起的request请求,RILD根据该请求主动发送AT命令到Modem,Modem根据AT命令进行响应。
Unsolicited消息(Urc消息)是指Modem主动上报到RILD的数据,然后RILD传递到RILJ,对于RILJ来说它是被动接受的消息。

2 RILJ的初始化RILJ和RILD的连接
Telephony Framework(NW) 初始化

如图,RIL的构造函数中会实例化RadioResponse、RadioIndication、OemHookResponse、OemHookIndication四个对象。其中RadioResponse和OemHookResponse是Framework主动RIL Request请求对应的response,RadioIndication和OemHookIndication是Modem主动上报AT命令,Framework接收响应的response。

接着通过getRadioProxy HIDL从RILD层获取IRadio实例,获取成功,通过IRadio对象的setResponseFunction(RadioResponse,RadioIndication)方法,将RadioResponse和RadioIndication的实例传到RILD层,用于RILD发送完AT命令/Modem上报AT命令后,从RILD到RILJ的响应。

3 RILD的初始化
Telephony Framework(NW) 初始化

在/hardware/ril/rild/ rild.rc文件中定义了系统服务内容如下:
Telephony Framework(NW) 初始化

该服务随系统启动,启动后运行rild.c文件main函数。main函数中会按顺序调用RIL_startEventLoop、RIL_Init、RIL_register函数,初始化RILD。
如上图,在调用RIL_Init时传入&s_rilEnv参数,该参数包含了在ril.c文件中定义的一系列函数指针,包括RIL_onRequestComplete、RIL_onUnsolicitedResponse等。调用RIL_Init结束后返回s_callbacks,s_callbacks中包含了定义在reference-ril.c中的一系列函数指针,包括onRequest、currentState等,其中onRequest函数RILJ下发RIL命令到RILD的请求分发函数,如图所示,s_callbacks最终会传递到ril_service中保存起来。
RIL_Init函数中还会启动mainLoop线程,该线程会读取Modem响应的数据。

4 RIL请求流程
Telephony Framework(NW) 初始化

如图,以查询信号强度为例,当通过函数RIL.getSignalStrength查询信号强度时,RIL会通过mRadioProxy(在getRadioProxy中得到具体的实例对象)这个IRadio的代理对象去调用远端(RILD)的对应的函数。在RILD中RadioImpl继承了IRadio
Telephony Framework(NW) 初始化

并且RadioImpl中的方法在ril_service.cpp中实现,所以RIL.getSignalStrength实际上是掉的ril_service中对于的getSignalStrength方法。不管是getSignalStrength还是其他的RIL命令,在ril_service中对应方法的内容大致都是这样的:
· Telephony Framework(NW) 初始化

dispathVoid方法的内容大致是这样的:
Telephony Framework(NW) 初始化

其中addRequestToList会根据RIL. getSignalStrength下发的RequestID(getSignalStrength的是RIL_REQUEST_SIGNAL_STRENGTH)来在ril_commands.h文件中通过requestID来查找这个请求处理完成后的调向RILJ的响应函数,例子中是:
Telephony Framework(NW) 初始化

将得到的响应函数添加到参数中,然后调用CALL_ONREQUEST函数,这是一个宏定义,实际上调用的是reference-ril文件中的onRequest函数,在该函数中再通过request ID来分发请求到不同的处理函数中:
Telephony Framework(NW) 初始化

在处理函数中会下发AT命令以及调用RIL_onRequestComplete函数,RIL_onRequestComplete也是一个宏定义,具体逻辑在ril.cpp文件中实现,该函数会将之前保存的响应函数拿出来进行调用: Telephony Framework(NW) 初始化
Telephony Framework(NW) 初始化

这里的respnoseFunction其实就是指getSignalStrengthResponse(ril_commands.h文件中的)函数:
Telephony Framework(NW) 初始化

这里radio::getSignalStrengthResponse是在ril_service中实现的:
Telephony Framework(NW) 初始化

它的逻辑主要是通过mRadioResponse来调用到RadioResponse.java中的getSignalStrengthResponse函数的(mRadioResponse是new RIL时通过setResponseFunctions传到RILD的),从而实现数据从RILD传递到RILJ。

三 SIM Framework 初始化
1 SIM Framework 的类依赖关系

Telephony Framework(NW) 初始化

2 初始化流程

Telephony Framework(NW) 初始化

如图,从PhoneFactory实例化UiccController开始,在UiccController的构造函数中会注册EVENT_SLOT_STATUS_CHANGED事件,当modem检测到卡槽状态变化时会发送Urc消息,从而触发onGetIccCardStatusDone()函数去初始化UiccSlot;注册EVENT_ICC_STATUS_CHANGED事件,当modem检测到SIM卡状态变化时会发送Urc消息,从而触发onGetIccCardStatusDone()函数去初始化UiccCard及它后面的对象,从而触发从SIM卡中读取EF文件的流程,完成SIM Framework的初始化。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-09-26
  • 2021-09-21
  • 2021-04-11
  • 2022-12-23
  • 2021-12-04
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-07-08
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-31
  • 2021-09-22
相关资源
相似解决方案