欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Android RIL架構分析——(1)本地庫實現[c/cpp

系統 3230 0

田海立

2012-03-24

本文介紹了AndroidRIL的總體架構,具體分析了本地庫的實現[c/cpp部分]


一、總體架構

Android RIL (Radio Interface Layer)提供了Telephony服務和Radio硬件之間的抽象層。RIL負責數據的可靠傳輸、AT命令的發送以及response的解析。一般的,應用處理器(AP)通過AT命令集與無線通訊模塊(基帶/BP)通信。把標準的GSM27.007中常用的如Dial這些主動請求的操作稱之為 request ;另一類GSM主動上報的例如信號強度、基站信息、來短信等,稱之為 unsolicited response

Ril Architecture


二、實現文件分布

SMS/MMS, call, …

Telephony的應用層實現在具體的apps中。Call在packages/apps/Phone中;SMS/MMS在packages/apps/Mms中;網絡選擇等在packages/apps/Settings中。

android.telephony.*

Telephony的JavaFramework代碼,供上層使用

com.android.internal.telephony.*

Telephony的JavaFramework代碼的內部實現,該包是隱藏的,外面無法訪問。

hardware/ril/include/telephony/ril.h

本地代碼的頭文件

hardware/ril/libril

ril本地庫的實現源代碼,生成libril.so

hardware/ril/rild

ril守護進程rild的實現源代碼,生成可執行文件rild

hardware/ril/reference-ril

ril實現庫的參考實現源代碼,生成libreference-ril.so

針對不同的硬件平臺可以仿照這個來實現具體的功能庫。


三、ril初始化

1.Rild解析ril的實現庫<rillibPath>——可以通過命令行或property來指定。

Rild在init.rc中可以通過命令行參數 -l <rillibPath> 指定ril的具體實現庫;

如果命令行中未指定實現庫,通過property_get(“ rild.libpath ”, …)獲取實現庫。

而,在模擬環境下的話,就用/system/lib/libreference-ril.so,這也是上節所提到的libreference-ril.so最終被放的路徑。

2.通過dlopen(<rillibPath>, )加載ril實現庫;

3.調用libril中的RIL_startEventLoop()開啟并確保 eventLoop線程 已經啟動;

4.通過dlsym()獲取<rillibPath>中定義的RIL_Init()函數。

5.獲取RIL_Init()所需的參數——可以通過命令行或property來指定。

Rild在init.rc中可以通過命令行參數 -- 指定RIL_Init的參數;

如果命令行中未指定實現庫,通過property_get(“ rild.libargs ”, …)獲取參數。

6.由4&5獲取的函數以及參數,執行 RIL_Init ()開始 mainLoop線程 ,并獲取RIL_RadioFunctions;

7.以6獲取的RIL_RadioFunctions為參數,執行libril中的 RIL_Register ()保留這些callback函數到s_callbacks,開啟命名Socket“rild”,接受上層的Socket指令。

時序圖如下圖所示:

RIL Init

注意:圖中的序號跟上面描述的步驟并不是一一對應的。

在上面的時序中,有幾個重要的數據: s_rilEnv : RIL_Env定義在rild中,但函數的具體實現是在標準庫libril.so中,注冊給實現庫,供RIL實現庫調用; s_callbacks : RIL_RadioFunctions定義在reference-ril中,實現Request等操作。

RIL initData


四、Request過程

初始化過程步驟3啟動的eventLoop會調用ril_event_loop()處理Request請求。

通過select()多路選擇Socket,偵聽是否有Java層到來的Socket請求。執行:

ril_event_loop() ->

-> processTimeouts()

-> processReadReadies()把ril_event從watch_table[]移到pendling_list

-> firePending() -> ev->func() [listenCallback()[ril.cpp]]

-> record_stream_new()新創建一個RecordStream

-> 收到完整的Request后,執行processCommandsCallback()

-> processCommandBuffer () [ril.cpp]

具體的執行都在processCommandBuffer()

Ril.cpp中定義了s_comamnds:CommandInfo[]

processCommandBuffer()中,通過request的索引,找到s_commands中的CommandInfo,然后通過CommandInfo的dispatchFunction,具體執行dispatch操作。

可以打開ril_commands.h中看具體某個Request的dispatch函數。

dispatchXYZ()是一系列對特定參數的Reqeust的封裝,看dispatchString(Parcel&p, RequestInfo *pRI)的實現:

解析出參數,通過s_callbacks.onRequest()調用reference-ril具體實現庫中的onRequest的實現。[s_callbacks是在第三節中初始化時注冊保留的]

Reference-ril中的onRequest()有一個很大的switch… case語句來處理各種request。

requestSendSMS()中調用at_send_command_sms()用“+CMGS”發送短信,并獲取返回值。

requestSendSMS()中調用 RIL_onRequestComplete (t,e: RIL_Errno)完成Request。

五、Response過程

Response有Solicited Response也就是上節講的Request的響應,另外還有一種就是主動上報的unsolicitedresponse,比如來電話,來短信等信息。

5.1 solicited response

對于Solicited response,上節中最后調用的是RIL_onRequestComplete(),reference-ril中該函數調用s_rilenv->OnRequestComplete()。從第三節的初始化知道,具體的實現是在ril.cpp中RIL_onRequestComplete()里。

在RIL_onRequestComplete()中,

如果“ril_commsnds.h”中定義的該CommandInfo中有response函數,完成對responseFunction()的調用;

轉換ril定義的響應信息結構,調用sendResponse(),將響應結果通過Socket反饋到上層。

5.2 unsolicited response

第三節步驟六開始的mainLoop中會通過at_open()把onUnsolicited()傳遞給AtChannel。AtChannel的at_open()中開啟readerLoop線程。

readerLoop()中:

readLine() -> processLine()對Unsolicited message調用handleUnsolicited()作出處理;而handleUnsolicited()中回調reference-ril中注冊的onUnsolicited()函數。

reference-ril的onUnsolicited()中對各種特殊指令作出處理之后,調用初始化時[第三節]注冊的RIL_Env中的RIL_onUnsolicitedResponse(),最終實現是在ril.cpp的RIL_onUnsolicitedResponse()。

同Request一樣,Ril.cpp中定義了s_comamnds:CommandInfo[]

RIL_onUnsolicitedResponse中,通過unsolResponseIndex,找到s_unsolResponses中的UnsolResponseInfo,然后通過UnsolResponseInfo的WakeType決定喚醒手機的WakeLock,再通過responseFunction,具體執行response操作。

可以打開ril_unsol_commands.h中看具體某個Unsolicitedresponse的定義。

最后,unsolicited response與solicited response一樣,也是通過調用sendResponse(),通過Socket反饋到Java上層。


Android RIL架構分析——(1)本地庫實現[c/cpp部分]


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久草热久草视频 | 91se在线看片国产免费观看 | 日韩不卡高清 | 天天精品视频免费观看 | 日日夜夜婷婷 | www色网站 | 超碰97人 | 精品一区二区三区视频 | 国产传媒网址 | a在线免费观看 | 成人一级大片 | 亚洲精品久中文字幕 | 夜夜爽天天狠狠九月婷婷 | 精品久久久久久久中文字幕 | 久久久久久久国产 | 午夜精品久久久久久久星辰影院 | 很黄很暴力深夜爽爽无遮挡 | 九九视屏 | 久久久久久全国免费观看 | 成人日韩在线观看 | 婷婷色婷婷 | 中文字幕在线免费观看 | 欧美国产中文字幕 | 中日欧洲精品视频在线 | 舒淇三级浴室洗澡在线观看 | 高清免费国产在线观看 | 国产精品美女视频 | 亚欧精品一区二区三区四区 | 精品成人免费一区二区在线播放 | 欧美精品国产综合久久 | 熟女毛片 | xxxx日本在线 | 激情五月综合 | 亚洲aⅴ | 91高清国产视频 | 免费免费视频片在线观看 | 成人性视频免费网站 | 色综合天天综合网看在线影院 | 欧美精品99久久久久久人 | 7777精品伊人久久久大香线蕉 | 亚洲免费视频在线观看 |