Android RIL 流程

文章目录

  • 1. RIL 建立事件循环与消息队列(基于 Android O 原生)
      • 1.1 主要流程
      • 1.2 需注意的细节
  • 2. RIL 建立数据连接
      • 2.1 主要流程
      • 2.2 需注意的点

1. RIL 建立事件循环与消息队列(基于 Android O 原生)

1.1 主要流程

主要流程可以归纳为以下:

  1. 开机时 rild 启动,调用 main 函数
  2. 在 main 函数中使用 dlopen 打开 so库(vendor实现库)
  3. 调用 RIL_startEventLoop 方法,创建消息循环处理线程,之后初始化 EVENT事件列表,通过 pipe(管道)绑定 EVENT 与管道读端,这样当有EVENT 请求来临则将其加入到内部处理队列,等待被处理
  4. rilInit 实际调用 RIL_Init() 函数,与 so库建立连接,返回vendor实现的库中函数的调用指针,并建立 mainLoop
  5. RIL_register()注册 上一步 函数指针作为回调函数,实现 RadioImpl作为 服务存在,从而为上层提供Radio 的代理对象,供上层进行方法调用

1.2 需注意的细节

  • dlopen 打开 的so库实际是指向 vendor 厂商自己实现的 RIL与 modem交互的业务逻辑库。因为各个平台厂商芯片的不同,受限于硬件设计等因素,相同业务的实现方式肯定也不一样,故需要厂商自己提供相关库。这部分通常是 闭源 的,不会对客户公开,如果要修改只能找芯片厂商提供定制后的so库
  • 需明确 mainLoop 旨在使 RIL 层持续运行,从而能够不断接收RILJ 发起的请求。eventLoop 是真正对EVENT进行处理的循环,在pending_list 中的 EVENT 都有对应的函数调用,调用其函数即开始了请求处理流程
    Android RIL 流程_第1张图片

2. RIL 建立数据连接

2.1 主要流程

  1. 上层通过RILJ 发起数据连接建立请求时,会将响应的RadioResponse 设置进去,最终会通过Radio的代理Proxy 调用到结构体 RadioImpl中的方法
  2. RadioImpl 调用方法其实是在 ril_service.cpp 中进行对应消息的分发,并将消息加入到消息队列中等待处理
  3. 处理数据连接建立的请求时通过 CALL_ONREQUEST() 宏定义 实际调用了 so 库(vendor实现)注册时返回的函数指针指向的方法,此处进入了vendor 的实现 (reference-ril)
  4. reference-ril 中实际完成请求的处理,也就是与modem交互,并得到modem 的响应 回调请求完成函数
  5. RIL_onRequestComplete() 为宏定义,实际调用了消息队列建立过程中初始化的 RIL_Env结构体中的对应函数,此处将消息返回到了公共实现中
  6. 之后根据数据连接建立请求加入队列时的设置,回调response 上层的方法,最终将回调到步骤 1 中设置的 RadioResponse 的对应方法,从而将响应返回到了 RILJ 中

2.2 需注意的点

  • Android O 开始 RIL 层采用 HIDL架构,在此之前采用 Socket 完成请求通信。HIDL类似于AIDL,属于进程间通信的一种形式,核心都是将服务的代理对象提供给调用方,供其直接调用完成功能。这种方式使得 调用关系更加清晰,模块间的划分更清楚,更有利于扩展与维护
  • RIL 层可分为 公共实现 和 vendor 实现两部分。公共实现负责事件处理队列的建立,也就是负责将RILJ的请求分发到vendor实现层,随后将vendor层的响应转发到RILJ;vendor 层实现真正与modem交互的业务逻辑,接受公共实现层分发的请求,处理完成后将响应返回到公共实现层。

Android RIL 流程_第2张图片

你可能感兴趣的:(Telephony,Android)