3 守护进程
ril与上层的RILJ沟通方式是通过Socket传输数据与命令,而reference-ril与底层Modem的信号传输是通过串口用AT命令来实现。
RILC是一个守护进程,由init进程启动,init.rc文件配置如下,
service ril-daemon /system/bin/rild
class main
socket rild stream 660 root radio
socket rild-debug stream 660 radio system
user root
group radio cache inet misc audio log qcom_diag
由配置文件可知,
1,如果该守护进程异常退出,android系统会进行重新加载。
2,会建立2个socket,端口号为rild负责和RILJ进行通信。
该守护进程的入口为rild.c的main方法,main方法比较长,主要逻辑如下,
1、开启EventLoop循环,完成RILC与RILJ层数据交互(通过Socket)
2、打开动态库reference并构建ReaderLoop循环,完成RIL与Modem层数据交互(通过AT)
3、注册reference的回调函数。
根据通信方法,将该守护进程分为2部分:
1,Event:利用socket完成RILC与RILJ层数据交互。
2, reference-ril:利用AT指令完成RILC与Modem层数据交互。
3.1,EventLoop
ril.cpp的RIL_startEventLoop方法如下,
extern "C" void RIL_startEventLoop(void) {
/* spin up eventLoop thread and wait for it to get started */
s_started = 0;
pthread_mutex_lock(&s_startupMutex);
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
//打开Event线程,并调用eventLoop进入循环
int result = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
if (result != 0) {
RLOGE("Failed to create dispatch thread: %s", strerror(result));
goto done;
}
while (s_started == 0) {
pthread_cond_wait(&s_startupCond, &s_startupMutex);
}
done:
pthread_mutex_unlo