1、RILC主要代碼目錄結構
Android 4.0.3 源碼中,RILC目錄結構如下:
按模塊分別編譯libril、reference-ril和rild這3個目錄,可得到libril.so、libreference-ril.so和rild文件
2、解析RILC運行機制
RILC運行在User Libraries系統運行庫層中的HAL子層,使用HAL Stub的運行結構:
Runtime對外提供Proxy代理接口;
Stub向Runtime提供Operations操作函數;
Runtime向Stub提供Callback函數;
a、LibRIL與Reference-RIL基於Stub運行機制,LibRIL爲Runtime運行環境,而Reference-RIL實現了RIL請求轉換成AT命令;
b、LibRIL提供Reference-RIL的Proxy代理接口,因此LibRIL與RILJ基於Socket的交互,最終交給Reference-RIL進行處理;
c、 Reference-RIL與Modem之間通過串口進行通信;
2.1、RILC啓動過程
加載入口;
加載方法;
2.1.1、尋找RILC的加載入口
開機過程中,kernel運行rild可執行文件加載和啓動LibRIL;在$workdir/system/core/rootdir/init.rc配置文件中進行說明:
Android啓動會同時啓動rild的後臺服務ril-daemon,如果異常退出,會重新加載;
建立兩個Socket連接,端口號分別是:rild 和 rild-debug;
啓動ril-daemon系統Service服務的用戶爲radio;
2.1.2、解析RILC的加載方法
$workdir/hardware/ril/rild/rild.c程序文件的main函數:
調用RIL_startEventLoop函數,LibRIL開啓循環監聽Socket連接,即可開始接收RILJ發起的Socket連接請求和RIL Solicited消息請求;
調用RIL_Init函數,首先通過dlsym獲取指向reference-ril.so動態鏈接庫中RIL_Init函數的指針;其次調用reference-ril.so中RIL_Init函數,完成RIL_Stub初始化,即reference-ril.so動態連接庫;
調用RIL_register,提供其Function給LibRIL調用;
2.2、RILC運行過程
RILC啓動完成後,LibRIL具有Reference-RIL返回的指向RIL_RadioFunctions類型的funcs結構體指針,而Reference-RIL具有LibRIL的RIL_Env類型s_rilEnv結構體指針;
下行消息:
LibRIL接收到RILJ發起的Solicited消息,LibRIL使用funcs調用Reference-RIL的onRequest、onStateRequest等方法;
上行消息:
Modem相關通信狀態變化或者指向完Solicited請求消息後,Reference-RIL通過s_rilEnv結構體指針調用LibRIL的OnRequestComplete、OnUnsolicitedResponse等方法;
3、初識RILC中的運行環境LibRIL
3.1、LibRIL主要文件及作用
LibRIL代碼路徑$workdir/hardware/ril/libril;
ril.cpp:負責建立Runtime運行環境框架
ril_commands.h和 ril_unsol_commands.h:ril_commands.h定義LibRIL接收到RILJ發出的Solicited請求消息所對應的調用函數和返回調用函數;ril_unsol_commands.h定義UnSolicited消息返回調用的函數;
ril_event.h和ril_event.cpp:ril_event事件的結構定義以及基於ril_event雙向鏈表的操作函數;
LibRIL運行環境作用:
與RILJ基於Socket的交互;
與Reference-RIL基於函數調用的交互;
3.2、重點結構體說明
RIL_Env結構體
RIL_RadioFunctions結構體:
version 標誌Reference-RIL版本號;
LibRIL在接收到RILJ發起的Solicited請求消息後,其他5個指向函數的指針會調用Reference-RIL提供的funcs中對應請求函數;
4、LibRIL運行環境加載過程
4.1、開啓ril_event事件監聽入口RIL_startEventLoop
RIL_startEventLoop函數創建基於eventLoop函數調用的子線程;
eventLoop函數:
修改s_started啓動狀態;
創建並激活s_wakeupfd_event的事件處理
調用ril_event.cpp中ril_event_loop
4.1、RIL_register函數引入三方RIL_RadioFunctions
5、運行狀態中ril_event事件處理機制
5.1、認識ril_event結構體
5.2、RIL事件生命週期控制的處理函數
5.3、ril_event_loop處理機制
6、詳解LibRIL運行機制
6.1、RILJ與LibRIL建立Socket連接過程
6.2、Solicited消息的交互流程和處理機制