RILC系統結構及LibRIL運行機制

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消息的交互流程和處理機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章