四时宝库

程序员的知识宝库

周末安排 2021.11.6 - 11.7 Android RIL学习

  1. 学车2个下午,14:00 - 18:00
  2. 周六上午到公司加班
  3. 周六晚上,听写、检查作业;
  4. 周三上午,桂溪公园,看芙蓉花;


Android RIL学习

  • RIL概念

RIL(Radio Interface Layer),负责将应用程序的通信请求发送给CP的中间层,其包括两个部分,一个是Java层RILJ,一个是C++层RILD。

RIL Java(RILJ):负责将上层APP的通信请求发送给HAL层;RILJ属于系统Phone进程的一部分,随Phone进程启动而加载;

RIL C++(RILD): 系统守护进程,负责将RILJ的请求命令发送给CP(Communication Processor);RILD守护进程是通过Android的Init进程进行加载的。


  • RIL结构



如图,整个通信过程有四层:

1. 应用框架层:如通话,短信以及SIM卡管理,它们主要负责将用户的指令发送到RIL Framework;


2. RILJ为上层提供了通用的API,如TelephonyManager(包括通话,网络状态; SubscriptionManager(卡状态)以及SmsManager等),同时RILJ还负责维持与RILD的通信,并将上层的请求发送给RILD;

3. RILD将RILJ发送过来的请求继续传递给CP,同时会及时将CP的状态变化发送给RILJ;

4. Linux驱动层:kernel驱动层接受到数据后,将指令传给CP,最后由CP发送给网络端,等网络返回结果后,CP将传回给RILD;


RILJ和上层通信:

为方便上层实时监听网络状态、通话状态以及CP的状态变化,RIL提供了一个专门的监听接口IPhoneStateListener.aidl,上层需要监听上述状态变化时,只需要实现上述接口,并在Android系统服务TelephonyRegistry中对上述接口实现进行注册:

public void listen(String pkgForDebug, IPhoneStateListener callback, int events, boolean notifyNow);

另外,也可以在TelephonyManager中对RIL状态进行监听:

public void listen(PhoneStateListener listener, int events)


RILJ和RILD通信:

RILJ在创建过程中,会启动两个线程:RILSender和RILRceiver,RILSender负责将指令发送给RILD,而RILReceiver则负责从读取从RILD发送过来的数据。RILJ与RILD的通信通道就是在RILReceiver中建立起来的。

RILReceiver启动时,会建立一个UNIX Domain socket(LocalSocket,kernel层对应/dev/socket/rild),与RILD进行通信,然后一直从socket中读取数据,并将数据传给上层。连接成功后,RILD会发送一个消息给RILJ,表示连接成功了,这样RILJ就可以将请求数据发送给RILD,进行通信了。


RILD与CP通信:RILD与CP(可以看做是两个运行在不同CPU上的进程通信)交换数据方式一般有两种情况。如果AP与CP集中在一个芯片上,如高通的平台就是将AP与CP集中在一块芯片上,这时通常采用共享内存的方式实现跨进程通信;而如果不是在同一块芯片,而是AP与CP分别采用不同厂商的平台,则一般采用字符设备(character devices) 进行通信。总的说来,共享内存的方式在速度上要优于字符设备。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接