成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Openharmony撥打電話全流程介紹

系統 OpenHarmony
今天從上到下分析下代碼調用流程,以撥打電話為例介紹鴻蒙電話子系統的各個部分。電話服務子系統的在/base/telephony目錄下,大概有700多個文件,11萬多行代碼。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

1、背景介紹

3.1版本標準系統增加了通話相關的聯系人應用,來電應用等,在系統服務層面電話相關功能也比較完善,相關modem模塊目前從代碼中看到有美格智能的slm790和紫光展銳的模塊,之前介紹過??鴻蒙電話服務子系統功能劃分介紹??,只是對官方文檔的介紹,可以通過這個文檔先去了解一下各個功能模塊。今天從上到下分析下代碼調用流程,以撥打電話為例介紹鴻蒙電話子系統的各個部分。電話服務子系統的在/base/telephony目錄下,大概有700多個文件,11萬多行代碼。

2、應用層js代碼介紹

應用層撥打電話的應用是聯系人,聯系人應用的通話記錄,聯系人查看,撥號盤和收藏都有對撥電話的調用。

最終調用的是app.js中的call函數,此函數調用的是@ohos.telephony.call中的dial方法。

應用層只是調用電話框架層的api,這個api就是@ohos.telephony.call提供的。

3、撥打電話NAPI實現介紹

應用層調用的是js函數,而電話服務層是c語言實現的,二者之間的橋梁就是通過NAPI實現的,有關NAPI介紹請參照這幾篇文章源碼解析之JavaScript API框架(NAPI)。簡單來說js的函數在c層都有對應的實現,它們之間是一一對應的關系,比如js的dial對應的是c++的DialCall,相關代碼如下,這部分代碼在通話管理模塊。

NapiCallManager::DialCall函數中調用的函數是。

HandleAsyncWork(env, asyncContext, “DialCall”, NativeDialCall, NativeDialCallBack)。

之后跳轉到了CallManagerClient中的DialCall,然后是CallManagerProxy::DialCall,如下:

4、如何從CallManagerServiceProxy到CallManagerServiceStub

到CallManagerProxy::DialCall中后代碼突然不清晰了,callManagerServicePtr_是什么,它的DialCall在哪里,順藤摸瓜,它的位置如下:

SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager()和managerPtr->GetSystemAbility(systemAbilityId_)是理解下一步調用位置的關鍵。

這里涉及到了另外一個知識點,就是進程通信,這里使用了ipc機制,可以查看官方文檔的介紹。

在目錄foundation/comminucotion下的ipc下有readme文檔,貼一張原圖:

大體意思是proxy通過samgr也就是SystemAbilityManager,去調用跨進程的Stub中的函數,代碼層面可以通過systemAbilityId_和接口類去定位函數調用的對應關系,這里的abilityid是TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID,接口類是ICallManagerService,通過查找定位到了CallManagerServiceProxy和CallManagerServiceStub。

函數調用就是從CallManagerServiceProxy::DialCall過渡到了CallManagerServiceStub::OnDialCall。

5、從CallControlManager::DialCall到 蜂窩通話(cellular_call)模塊

CallManagerServiceStub::OnDialCall中調用到了CallControlManager::DialCall,然后又走到了。

CallRequestHandlerService::DialCall(),這里調用了一個發送事件函數,這是一種線程異步處理機智可以看這篇文章,只要有發就有收,我們找到收事件的地方。

對應關系在如下位置,由此找到了函數CallRequestHandler::DialCallEvent。

CallRequestHandler::DialCallEvent中有針對類型的判斷:

我們走CallRequestProcess::DialRequest分支,然后走到了CellularCallIpcInterfaceProxy::Dial。

在這里我們又遇到了ipc,同樣的方法此時id是TELEPHONY_CELLULAR_CALL_SYS_ABILITY_ID。

找到stub函數位置是CellularCallStub::Dial,此時已經到了蜂窩通話模塊目錄。

6、從蜂窩通話(cellular_call)到 核心服務(core_service)

CellularCallStub::Dial直接調用的是CSControl::Dial。

在這里又出現了類型判斷,判斷手機網絡制式是gsm還是cdma,了解通信行業的都知道gsm和cdma是2G時代的兩種制式標準,一個是歐洲主導的,一個是高通主導的,扯得有點遠,繼續看代碼。

二者最終調用的是CSControl::EncapsulateDialCommon,然后CellularCallConnectionCS::DialRequest。

然后進入到了核心服務模塊。

然后是TelRilManager::Dial和TelRilCall::Dial。

7、從核心服務(core_service)到 RIL適配層(RIL Adapter)

TelRilCall::Dial中調用了TelRilBase基類的SendBufferEvent(HREQ_CALL_DIAL, wData)函數代碼如下:

cellularRadio_這個成員的初始化實在TelRilManager中。

這又涉及到了另外一個知識點驅動相關看這篇OpenHarmony HDF HDI基礎能力分析與使用,對modem的操作在RIL適配層被當做了驅動服務來使用的,SendRequest就是對驅動的異步調用,在驅動中的函數RilAdapterDispatch負責對SendRequest的接收處理。

而這個處理函數是驅動加載時運行起來的。

RilAdapterDispatch中的函數DispatchRequest位于HRilManager中,然后調用DispatchModule。

繼續調用HRilManager::Dispatch,進入HRilCall中的ProcessCallRequest,然后根據HREQ_CALL_DIAL在函數指針數組reqMemberFuncMap_找到了處理函數HRilCall::Dial,然后處理邏輯變到了callFuncs_->Dial中。

8、RIL適配層(RIL Adapter)中的處理流程

要知道callFuncs_->Dial的最終位置,就要查找callFuncs_的賦值流程, HRilCall::RegisterCallFuncs上層調用是

HRilManager::RegisterCallFuncs再上層是HRilRegOps。

HRilRegOps在LoadVendor中調用,這又涉及到了modem的加載機制,具體廠商modem處理的部分是通過so加載的方式引入的。

通過打開so文件并建立函數的對應關系,最終調用的at命令的具體實現部分。

so的代碼目錄在vendor目錄下,通過成員為函數指針的結構體建立關聯性。

也就是callFuncs_->Dial在so中的處理函數是ReqDial,在這里邊組裝了具體的at命令 ,撥打電話的命令是ATD,GenerateCommand(cmd, MAX_CMD_LENGTH, “ATD%s%s;”, pDial->address, clir)。

最終通過WriteATCommand函數寫入到了at命令的通道,通道就是具體的modem模塊與主處理器的硬件連接了。

也就是當前代碼中的usb通道。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??。

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2014-08-27 15:58:40

iPhone安全漏洞iPhone安全

2023-04-26 15:29:35

NAPI模塊鴻蒙

2022-02-21 14:49:26

OpenHarmon操作系統鴻蒙

2014-07-10 15:51:53

2022-04-15 14:03:09

5G語音通話通信

2021-12-14 10:38:51

谷歌Pilex手機Reddit

2014-11-14 09:50:39

微信電話本VoLTE

2019-12-17 12:01:00

戴爾

2014-06-03 10:39:14

WWDC2014iOS 8Mac

2015-03-24 21:08:01

2021-12-26 00:20:13

網協議語音VoIP

2010-01-28 15:26:33

Android調用平臺

2020-09-24 14:16:39

密碼

2010-01-27 09:43:32

Chrome瀏覽器

2023-09-06 15:31:19

GPIO鴻蒙

2023-09-19 15:14:59

鴻蒙Watchdog

2023-09-06 15:27:22

ADC鴻蒙

2023-09-19 15:21:33

RTC鴻蒙

2013-09-22 11:22:09

2009-03-24 08:33:14

AndroidGoogle移動os
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产一区在线 | 国外成人在线视频 | 国产一区二| 亚洲女人天堂成人av在线 | 国产亚洲精品精品国产亚洲综合 | 你懂的av| 国产成人精品网站 | 久久亚洲欧美日韩精品专区 | 国产成人精品一区二区三区网站观看 | 国产黄色在线观看 | 欧美一区二区三区在线 | 国产精品一区在线 | 日韩欧美国产精品 | 中国免费黄色片 | 日韩欧美一二三区 | 久久狠狠 | 成人精品视频在线观看 | 成人午夜| 亚洲一本 | gogo肉体亚洲高清在线视 | 中文字幕高清免费日韩视频在线 | 欧美日韩一区在线 | 午夜国产一区 | 国产一区二区三区在线 | 亚洲免费网址 | 欧美一区二区三区在线 | 久久在线视频 | 免费成人av网站 | 欧美a级成人淫片免费看 | 国产欧美一区二区三区免费 | 99热热99 | 一区二区三区中文字幕 | 在线观看免费国产 | 国产乱码精品1区2区3区 | 岛国av在线免费观看 | 欧美在线播放一区 | 精品久久久久久久 | www.男人天堂.com | 亚洲色图在线观看 | 不卡的av在线 | 久久蜜桃精品 |