- 学车2个下午,14:00 - 18:00
- 周六上午到公司加班
- 周六晚上,听写、检查作业;
- 周三上午,桂溪公园,看芙蓉花;
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,进行通信了。