日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android RIL使用詳解

瀏覽:24日期:2022-09-23 11:06:23

前言

Android作為一個(gè)通用的移動(dòng)平臺(tái),其首要的功能就是通話、短信以及上網(wǎng)等通信功能。那么,從系統(tǒng)的角度來(lái)看,Android究竟是怎么實(shí)現(xiàn)與網(wǎng)絡(luò)的交互的了? 這篇文章里,就來(lái)看一看Android中負(fù)責(zé)通信功能的Telephony中間層,通常也被稱之為RIL(Radio Interface Layer)的具體實(shí)現(xiàn)原理與架構(gòu)。

Android手機(jī)要實(shí)現(xiàn)與網(wǎng)絡(luò)端的通信,需要跨越兩個(gè)層:

RIL Java(RILJ):負(fù)責(zé)將上層APP的通信請(qǐng)求發(fā)送給HAL層;RIL C++(RILD): 系統(tǒng)守護(hù)進(jìn)程,負(fù)責(zé)將RILJ的請(qǐng)求命令發(fā)送給CP(Communication Processor)

什么是RIL

簡(jiǎn)單的說(shuō),RIL(Radio Interface Layer),就是將應(yīng)用程序的通信請(qǐng)求發(fā)送給CP的中間層,其包括兩個(gè)部分,一個(gè)是Java層RILJ,一個(gè)是C++層(不妨看作是CP對(duì)應(yīng)的HAL層)RILD。

RILJ屬于系統(tǒng)Phone進(jìn)程的一部分,隨Phone進(jìn)程啟動(dòng)而加載;而RILD守護(hù)進(jìn)程是通過(guò)Android的Init進(jìn)程進(jìn)行加載的。

RIL結(jié)構(gòu)

下圖是一個(gè)Android RIL的一個(gè)結(jié)構(gòu)圖。整個(gè)通信過(guò)程有四個(gè)層:

最上層的是應(yīng)用程序,如通話,短信以及SIM卡管理,它們主要負(fù)責(zé)將用戶的指令發(fā)送到RIL Framework(以后統(tǒng)稱RILJ); RILJ為上層提供了通用的API,如TelephonyManager(包括通話,網(wǎng)絡(luò)狀態(tài); SubscriptionManager(卡狀態(tài))以及SmsManager等,同時(shí)RILJ還負(fù)責(zé)維持與RILD的通信,并將上層的請(qǐng)求發(fā)送給RILD; RILD是系統(tǒng)的守護(hù)進(jìn)程,對(duì)于支持通話功能的移動(dòng)平臺(tái)是必不可少的。RILD的功能主要功能是將RILJ發(fā)送過(guò)來(lái)的請(qǐng)求繼續(xù)傳遞給CP,同時(shí)會(huì)及時(shí)將CP的狀態(tài)變化發(fā)送給RILJ; Linux驅(qū)動(dòng)層:kernel驅(qū)動(dòng)層接受到數(shù)據(jù)后,將指令傳給CP,最后由CP發(fā)送給網(wǎng)絡(luò)端,等網(wǎng)絡(luò)返回結(jié)果后,CP將傳回給RILD;

Android RIL使用詳解

RILJ與RILD(RILD與CP的通信)都是通過(guò)一個(gè)個(gè)消息進(jìn)行數(shù)據(jù)傳遞。消息主要分兩種:一種是RILJ主動(dòng)發(fā)送的請(qǐng)求(solicited),常見(jiàn)的有RIL_REQUEST_GET_SIM_STATUS(獲取SIM卡狀態(tài)),RIL_REQUEST_DIAL(撥打電話),RIL_REQUEST_SEND_SMS(發(fā)送短信),RIL_REQUEST_GET_CURRENT_CALLS(獲取當(dāng)前通話狀態(tài)),RIL_REQUEST_VOICE_REGISTRATION_STATE(獲取網(wǎng)絡(luò)狀態(tài)); 另一種則是從CP主動(dòng)上報(bào)給RIL的消息(unsolicited),如網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí),CP會(huì)上報(bào)RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED,有新短信時(shí),會(huì)上報(bào)RIL_UNSOL_RESPONSE_NEW_SMS,有來(lái)電時(shí)會(huì)上報(bào)RIL_UNSOL_CALL_RING。

RIL相關(guān)的請(qǐng)求命令與數(shù)據(jù)結(jié)構(gòu)都定義在/android/hardware/ril/include/telephony/ril.h

在整個(gè)過(guò)程中,有幾個(gè)關(guān)鍵問(wèn)題:

上層是如何得知RILJ狀態(tài)變化的; RILJ與RILD是怎么進(jìn)行通信的? RILJD與CP又是如何進(jìn)行通信的?

圍繞這三個(gè)問(wèn)題點(diǎn),我們來(lái)看一下具體的細(xì)節(jié)。

上層如何得知RILJ狀態(tài)變化

為方便上層實(shí)時(shí)監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)、通話狀態(tài)以及CP的狀態(tài)變化,RIL提供了一個(gè)專門的監(jiān)聽(tīng)接口IPhoneStateListener.aidl,上層需要監(jiān)聽(tīng)上述狀態(tài)變化時(shí),只需要實(shí)現(xiàn)上述接口,并在Android系統(tǒng)服務(wù)TelephonyRegistry中對(duì)上述接口實(shí)現(xiàn)進(jìn)行注冊(cè):

public void listen(String pkgForDebug, IPhoneStateListener callback, int events, boolean notifyNow);

另外,也可以在TelephonyManager中對(duì)RIL狀態(tài)進(jìn)行監(jiān)聽(tīng):

public void listen(PhoneStateListener listener, int events)

源代碼:/android/frameworks/base/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl

oneway interface IPhoneStateListener { void onServiceStateChanged(in ServiceState serviceState); void onSignalStrengthChanged(int asu); void onMessageWaitingIndicatorChanged(boolean mwi); void onCallForwardingIndicatorChanged(boolean cfi); // we use bundle here instead of CellLocation so it can get the right subclass void onCellLocationChanged(in Bundle location); void onCallStateChanged(int state, String incomingNumber); void onDataConnectionStateChanged(int state, int networkType); void onDataActivity(int direction); void onSignalStrengthsChanged(in SignalStrength signalStrength); void onOtaspChanged(in int otaspMode); void onCellInfoChanged(in List<CellInfo> cellInfo); void onPreciseCallStateChanged(in PreciseCallState callState); void onPreciseDataConnectionStateChanged(in PreciseDataConnectionState dataConnectionState); void onDataConnectionRealTimeInfoChanged(in DataConnectionRealTimeInfo dcRtInfo); void onVoLteServiceStateChanged(in VoLteServiceState lteState); void onOemHookRawEvent(in byte[] rawData); void onCarrierNetworkChange(in boolean active); void onFdnUpdated(); void onVoiceRadioBearerHoStateChanged(int state); }

RILJ與RILD如何通信

RILJ在創(chuàng)建過(guò)程中,會(huì)啟動(dòng)兩個(gè)線程:RILSender和RILReceiver,RILSender負(fù)責(zé)將指令發(fā)送給RILD,而RILReceiver則負(fù)責(zé)從讀取從RILD發(fā)送過(guò)來(lái)的數(shù)據(jù)。RILJ與RILD的通信通道就是在RILReceiver中建立起來(lái)的。

我們來(lái)看一看RILReciver的代碼:

class RILReceiver implements Runnable { byte[] buffer; RILReceiver() { ... @Override public void run() { int retryCount = 0; String rilSocket = 'rild'; // 嘗試與RILD建立連接 try {for (;;) { LocalSocket s = null; LocalSocketAddress l; if (mInstanceId == null || mInstanceId == 0 ) { rilSocket = SOCKET_NAME_RIL[0]; } else { rilSocket = SOCKET_NAME_RIL[mInstanceId]; } try { s = new LocalSocket(); l = new LocalSocketAddress(rilSocket, LocalSocketAddress.Namespace.RESERVED); s.connect(l); } catch (IOException ex){ ... // don’t print an error message after the the first time // or after the 8th time if (retryCount == 8) { Rlog.e (RILJ_LOG_TAG, 'Couldn’t find ’' + rilSocket + '’ socket after ' + retryCount + ' times, continuing to retry silently'); } else if (retryCount >= 0 && retryCount < 8) { Rlog.i (RILJ_LOG_TAG, 'Couldn’t find ’' + rilSocket + '’ socket; retrying after timeout'); } ... retryCount++; continue; } retryCount = 0; mSocket = s; // 從socket讀取數(shù)據(jù) int length = 0; try { InputStream is = mSocket.getInputStream(); for (;;) { Parcel p; length = readRilMessage(is, buffer); if (length < 0) { // End-of-stream reached break; } p = Parcel.obtain(); p.unmarshall(buffer, 0, length); p.setDataPosition(0); processResponse(p); p.recycle(); } } catch (java.io.IOException ex) { Rlog.i(RILJ_LOG_TAG, '’' + rilSocket + '’ socket closed', ex); } catch (Throwable tr) { Rlog.e(RILJ_LOG_TAG, 'Uncaught exception read length=' + length + 'Exception:' + tr.toString()); } //無(wú)法讀取數(shù)據(jù),將CP狀態(tài)設(shè)置為不可用 setRadioState (RadioState.RADIO_UNAVAILABLE); ... mSocket = null; RILRequest.resetSerial(); // Clear request list on close clearRequestList(RADIO_NOT_AVAILABLE, false); }} catch (Throwable tr) { Rlog.e(RILJ_LOG_TAG,'Uncaught exception', tr); } } }

RILReceiver啟動(dòng)時(shí),會(huì)建立一個(gè)UNIX Domain socket(LocalSocket,kernel層對(duì)應(yīng)/dev/socket/rild),與RILD進(jìn)行通信,然后一直從socket中讀取數(shù)據(jù),并將數(shù)據(jù)傳給上層。連接成功后,RILD會(huì)發(fā)送一個(gè)消息給RILJ,表示連接成功了,這樣RILJ就可以將請(qǐng)求數(shù)據(jù)發(fā)送給RILD,進(jìn)行通信了。

RILD與CP如何進(jìn)行通信

RILD與CP(可以看做是兩個(gè)運(yùn)行在不同CPU上的進(jìn)程通信)交換數(shù)據(jù)方式一般有兩種情況。如果AP與CP集中在一個(gè)芯片上,如高通的平臺(tái)就是將AP與CP集中在一塊芯片上,這時(shí)通常采用共享內(nèi)存的方式實(shí)現(xiàn)跨進(jìn)程通信;而如果不是在同一塊芯片,而是AP與CP分別采用不同廠商的平臺(tái),則一般采用字符設(shè)備(character devices) 進(jìn)行通信。總的說(shuō)來(lái),共享內(nèi)存的方式在速度上要優(yōu)于字符設(shè)備。

接下來(lái),主要介紹下RILJ部分的代碼結(jié)構(gòu)。

RILJ代碼結(jié)構(gòu)

RIL Framework (RILJ)的代碼按照功能來(lái)劃分的話,主要有以下幾個(gè)組成部分:

管理網(wǎng)絡(luò)狀態(tài)(信號(hào)強(qiáng)度,網(wǎng)絡(luò)注冊(cè)狀態(tài)等):ServiceStateTracker等; 通話管理(撥號(hào),接聽(tīng),呼叫等待等):CallManager,GsmCallTracker等 SMS短信接收發(fā)送:InboundSMSHandler,SmsDispater等 SIM卡管理:UiccController,SubscriptionsController等 數(shù)據(jù)鏈接管理:DcTracker,DctController等 Telephony 大管家:PhoneBase,GsmPhone,PhoneProxy等

Android RIL使用詳解

以上代碼主要位于兩個(gè)目錄:

/android/frameworks/opt/telephony/(負(fù)責(zé)與RILD交互) /android/frameworks/base/telephony/(對(duì)上層提供接口)

下面,以撥打電話的流程作為示例看一看RIL是如何發(fā)揮作用的。

示例:CALL流程

下圖是一個(gè)MO(Mobile Originated) 通話流程簡(jiǎn)圖:

Android RIL使用詳解

APP向TelecomManager發(fā)送撥號(hào)請(qǐng)求(關(guān)于TelecomManager可以參考另一篇文章Android Telecom系統(tǒng)服務(wù)); TelecomManager將通話請(qǐng)求發(fā)送給GsmPhone; GsmPhone繼續(xù)將指令傳遞給GsmCallTracker; GsmCallTracker調(diào)用RILJ,RILJ將通話請(qǐng)求發(fā)送給RILD; RILD接收到通話指令時(shí),發(fā)送給CP; CP發(fā)送給網(wǎng)絡(luò),MT(Mobile Terminal)收到通話后,告知網(wǎng)絡(luò),由網(wǎng)絡(luò)將該信息傳遞給MO已將通話信息發(fā)送給MT了(就是手機(jī)發(fā)出嘟嘟聲音的時(shí)候):通話狀態(tài)由DIALING ?> ALERTING; RILD收到通話狀態(tài)變化的消息后,發(fā)送一個(gè)UNSOL_RESPONSE_CALL_STATE_CHANGED的消息給RILJ; RILJ通知GsmCallTracker通話狀態(tài)變化了; GsmCallTracker主動(dòng)查詢CALL狀態(tài):pollCallWhenSafe(),確保得到的信息是對(duì)的,沒(méi)有發(fā)生變化; RILJ給RILD發(fā)送getCurrentCalls()的請(qǐng)求; RILD獲取到CALL狀態(tài)后,上報(bào)給RILJ,再由RILJ返回結(jié)果給GsmCallTracker GsmCallTracker得到確定的CALL狀態(tài)后,通知GsmPhone:notifyPreciseCallStateChanged(); GsmPhone將CALL狀態(tài)變化的消息告知Telecom系統(tǒng)服務(wù); 最后,Telecom系統(tǒng)服務(wù)發(fā)送CALL狀態(tài)變化的廣播給上層APP

到這一步后,通話并沒(méi)有開(kāi)始,如果MT接聽(tīng)了電話,則MO會(huì)收到CALL狀態(tài)變化的信息,然后,才真正開(kāi)始建立通話鏈接。

到此這篇關(guān)于Android RIL使用詳解的文章就介紹到這了,更多相關(guān)Android RIL內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
高清一区二区| re久久精品视频| 国产精品原创| 丝袜脚交一区二区| 日本在线视频一区二区| 欧美日韩亚洲一区三区| 91精品婷婷色在线观看| 国产美女亚洲精品7777| 日本一二区不卡| 午夜国产一区二区| 国产盗摄——sm在线视频| 日韩精品五月天| 欧美成人基地| 国产日韩高清一区二区三区在线| 中文字幕系列一区| 欧美激情三区| 日本欧洲一区二区| 福利精品在线| 香蕉久久一区| 美女久久一区| 欧美91视频| 久久久亚洲一区| 国产综合色区在线观看| 国产欧美一区二区三区精品观看| 亚洲日韩中文字幕一区| 亚洲成人av观看| 久久婷婷亚洲| 亚洲日本网址| 国产夫妻在线| 国产欧美激情| 91精品麻豆| 国产色噜噜噜91在线精品| 另类国产ts人妖高潮视频| 中文在线不卡| 天使萌一区二区三区免费观看| 免费久久精品视频| 精品免费在线| 在线看片不卡| 国产日韩欧美一区二区三区 | 亚洲一区国产一区| 亚洲制服欧美另类| 久久不射网站| 麻豆久久精品| 精品一区二区三区亚洲| 在线精品亚洲| 欧美日韩国产综合网| 亚洲精品123区| 五月国产精品| 99在线|亚洲一区二区| 欧美va天堂| 91tv亚洲精品香蕉国产一区| 国产欧美69| 国产农村妇女精品一区二区| 九九九精品视频| 欧美亚洲网站| 日韩av资源网| 久久一区欧美| 日本高清久久| 一区二区亚洲视频| 欧美一区二区三区激情视频| 国产精品日韩精品在线播放| 精品久久99| 九九综合在线| 日韩在线精品| 国产精品久久久久久久久久10秀| 国产精品1区| 麻豆视频观看网址久久| 日本视频一区二区| 国产精品一线| 国产精品yjizz视频网| 视频一区视频二区中文字幕| 精品一区二区三区中文字幕| 奇米亚洲欧美| 日本精品国产| 亚洲1区在线观看| 性色一区二区| 欧美一区二区三区高清视频| 欧美激情国产在线| 国产一区二区三区精品在线观看| 欧美日韩一区二区三区不卡视频| 午夜久久影院| 99久久精品费精品国产| 精品日产乱码久久久久久仙踪林| 国产精品久久久久久av公交车| 蜜臀a∨国产成人精品| 在线亚洲观看| 最新国产精品久久久| 免费在线欧美视频| 欧美色综合网| 亚洲精品极品| 国产精品超碰| 精品精品99| 精品资源在线| 精品一区二区三区在线观看视频| 激情综合五月| 欧美女激情福利| 婷婷精品在线| 国产精品久久久久久久免费软件 | 欧美色图国产精品| 国产精品免费看| 综合激情在线| 色婷婷亚洲mv天堂mv在影片| 丝袜av一区| 综合激情视频| 精品亚洲二区| 日韩中文字幕亚洲一区二区va在线 | 99在线|亚洲一区二区| 亚洲视频国产| 色欧美自拍视频| 免费在线看一区| 欧美极品中文字幕| 视频小说一区二区| 日本视频在线一区| 久久精选视频| 免费观看在线色综合| 国产精品白丝久久av网站| 免费成人网www| 精品国产黄a∨片高清在线| 国产一区91| 91精品精品| 精品一区二区三区中文字幕 | 亚洲男人在线| 欧美+亚洲+精品+三区| 激情久久99| 亚洲人成高清| 免费精品国产的网站免费观看| 欧美国产三级| 人人精品久久| 老鸭窝毛片一区二区三区| 蜜臀久久精品| 精品久久久亚洲| 国产在线一区不卡| 国产精品nxnn| 国产亚洲观看| 色8久久久久| 欧美日韩午夜电影网| 亚洲2区在线| 亚欧成人精品| 日韩av字幕| 婷婷久久免费视频| 免费不卡在线视频| 黄色亚洲在线| 久久国产精品久久w女人spa| 麻豆成人在线| 亚洲人成高清| 欧美精品中文| av资源中文在线| 人人草在线视频| 日韩在线不卡| 亚洲二区三区不卡| 欧美资源在线| 日本欧美韩国一区三区| 精品国产中文字幕第一页| 成人三级高清视频在线看| 日韩电影免费在线观看| 国精品一区二区三区| 日韩制服丝袜先锋影音| 日本视频一区二区| 国内自拍视频一区二区三区| 日韩亚洲一区在线| 蜜桃视频在线观看一区| 欧美专区一区| 黄色aa久久| 在线观看亚洲精品福利片| 精品资源在线| 日av在线不卡| 麻豆理论在线观看| 日韩有吗在线观看| 97人人精品| 亚洲免费婷婷| 国产精品对白| 亚洲欧美不卡| 国产在视频一区二区三区吞精| 亚州av乱码久久精品蜜桃| 日韩精品高清不卡| 亚洲精品888| 国产精品yjizz视频网| 日本午夜精品视频在线观看| 久久三级福利| 国产精品久一| 蜜桃视频在线观看一区二区| 日韩久久精品网| 国产精品1区在线| 欧美亚洲二区| 亚洲综合精品四区| 欧美综合另类| 国产h片在线观看| 国产精品二区不卡| 国产精品久久久久久久久久齐齐| 亚洲欧美一级| 亚洲ww精品| 日韩精品一级| 伊人久久一区| 亚洲一区二区三区无吗| 亚洲精品电影| 成人av动漫在线观看| 婷婷成人在线| 美女亚洲一区| 91久久黄色| 亚洲一区成人|