电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android RIL使用詳解

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

前言

Android作為一個通用的移動平臺,其首要的功能就是通話、短信以及上網等通信功能。那么,從系統的角度來看,Android究竟是怎么實現與網絡的交互的了? 這篇文章里,就來看一看Android中負責通信功能的Telephony中間層,通常也被稱之為RIL(Radio Interface Layer)的具體實現原理與架構。

Android手機要實現與網絡端的通信,需要跨越兩個層:

RIL Java(RILJ):負責將上層APP的通信請求發送給HAL層;RIL C++(RILD): 系統守護進程,負責將RILJ的請求命令發送給CP(Communication Processor)

什么是RIL

簡單的說,RIL(Radio Interface Layer),就是將應用程序的通信請求發送給CP的中間層,其包括兩個部分,一個是Java層RILJ,一個是C++層(不妨看作是CP對應的HAL層)RILD。

RILJ屬于系統Phone進程的一部分,隨Phone進程啟動而加載;而RILD守護進程是通過Android的Init進程進行加載的。

RIL結構

下圖是一個Android RIL的一個結構圖。整個通信過程有四個層:

最上層的是應用程序,如通話,短信以及SIM卡管理,它們主要負責將用戶的指令發送到RIL Framework(以后統稱RILJ); RILJ為上層提供了通用的API,如TelephonyManager(包括通話,網絡狀態; SubscriptionManager(卡狀態)以及SmsManager等,同時RILJ還負責維持與RILD的通信,并將上層的請求發送給RILD; RILD是系統的守護進程,對于支持通話功能的移動平臺是必不可少的。RILD的功能主要功能是將RILJ發送過來的請求繼續傳遞給CP,同時會及時將CP的狀態變化發送給RILJ; Linux驅動層:kernel驅動層接受到數據后,將指令傳給CP,最后由CP發送給網絡端,等網絡返回結果后,CP將傳回給RILD;

Android RIL使用詳解

RILJ與RILD(RILD與CP的通信)都是通過一個個消息進行數據傳遞。消息主要分兩種:一種是RILJ主動發送的請求(solicited),常見的有RIL_REQUEST_GET_SIM_STATUS(獲取SIM卡狀態),RIL_REQUEST_DIAL(撥打電話),RIL_REQUEST_SEND_SMS(發送短信),RIL_REQUEST_GET_CURRENT_CALLS(獲取當前通話狀態),RIL_REQUEST_VOICE_REGISTRATION_STATE(獲取網絡狀態); 另一種則是從CP主動上報給RIL的消息(unsolicited),如網絡狀態發生變化時,CP會上報RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED,有新短信時,會上報RIL_UNSOL_RESPONSE_NEW_SMS,有來電時會上報RIL_UNSOL_CALL_RING。

RIL相關的請求命令與數據結構都定義在/android/hardware/ril/include/telephony/ril.h

在整個過程中,有幾個關鍵問題:

上層是如何得知RILJ狀態變化的; RILJ與RILD是怎么進行通信的? RILJD與CP又是如何進行通信的?

圍繞這三個問題點,我們來看一下具體的細節。

上層如何得知RILJ狀態變化

為方便上層實時監聽網絡狀態、通話狀態以及CP的狀態變化,RIL提供了一個專門的監聽接口IPhoneStateListener.aidl,上層需要監聽上述狀態變化時,只需要實現上述接口,并在Android系統服務TelephonyRegistry中對上述接口實現進行注冊:

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

另外,也可以在TelephonyManager中對RIL狀態進行監聽:

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在創建過程中,會啟動兩個線程:RILSender和RILReceiver,RILSender負責將指令發送給RILD,而RILReceiver則負責從讀取從RILD發送過來的數據。RILJ與RILD的通信通道就是在RILReceiver中建立起來的。

我們來看一看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讀取數據 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()); } //無法讀取數據,將CP狀態設置為不可用 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啟動時,會建立一個UNIX Domain socket(LocalSocket,kernel層對應/dev/socket/rild),與RILD進行通信,然后一直從socket中讀取數據,并將數據傳給上層。連接成功后,RILD會發送一個消息給RILJ,表示連接成功了,這樣RILJ就可以將請求數據發送給RILD,進行通信了。

RILD與CP如何進行通信

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

接下來,主要介紹下RILJ部分的代碼結構。

RILJ代碼結構

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

管理網絡狀態(信號強度,網絡注冊狀態等):ServiceStateTracker等; 通話管理(撥號,接聽,呼叫等待等):CallManager,GsmCallTracker等 SMS短信接收發送:InboundSMSHandler,SmsDispater等 SIM卡管理:UiccController,SubscriptionsController等 數據鏈接管理:DcTracker,DctController等 Telephony 大管家:PhoneBase,GsmPhone,PhoneProxy等

Android RIL使用詳解

以上代碼主要位于兩個目錄:

/android/frameworks/opt/telephony/(負責與RILD交互) /android/frameworks/base/telephony/(對上層提供接口)

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

示例:CALL流程

下圖是一個MO(Mobile Originated) 通話流程簡圖:

Android RIL使用詳解

APP向TelecomManager發送撥號請求(關于TelecomManager可以參考另一篇文章Android Telecom系統服務); TelecomManager將通話請求發送給GsmPhone; GsmPhone繼續將指令傳遞給GsmCallTracker; GsmCallTracker調用RILJ,RILJ將通話請求發送給RILD; RILD接收到通話指令時,發送給CP; CP發送給網絡,MT(Mobile Terminal)收到通話后,告知網絡,由網絡將該信息傳遞給MO已將通話信息發送給MT了(就是手機發出嘟嘟聲音的時候):通話狀態由DIALING ?> ALERTING; RILD收到通話狀態變化的消息后,發送一個UNSOL_RESPONSE_CALL_STATE_CHANGED的消息給RILJ; RILJ通知GsmCallTracker通話狀態變化了; GsmCallTracker主動查詢CALL狀態:pollCallWhenSafe(),確保得到的信息是對的,沒有發生變化; RILJ給RILD發送getCurrentCalls()的請求; RILD獲取到CALL狀態后,上報給RILJ,再由RILJ返回結果給GsmCallTracker GsmCallTracker得到確定的CALL狀態后,通知GsmPhone:notifyPreciseCallStateChanged(); GsmPhone將CALL狀態變化的消息告知Telecom系統服務; 最后,Telecom系統服務發送CALL狀態變化的廣播給上層APP

到這一步后,通話并沒有開始,如果MT接聽了電話,則MO會收到CALL狀態變化的信息,然后,才真正開始建立通話鏈接。

到此這篇關于Android RIL使用詳解的文章就介紹到這了,更多相關Android RIL內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 布袋式除尘器|木工除尘器|螺旋输送机|斗式提升机|刮板输送机|除尘器配件-泊头市德佳环保设备 | 【法利莱住人集装箱厂家】—活动集装箱房,集装箱租赁_大品牌,更放心 | 吹田功率计-长创耐压测试仪-深圳市新朗普电子科技有限公司 | 沟盖板_复合沟盖板厂_电力盖板_树脂雨水篦子-淄博拜斯特 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | 光纤测温-荧光光纤测温系统-福州华光天锐光电科技有限公司 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 贝壳粉涂料-内墙腻子-外墙腻子-山东巨野七彩贝壳漆业中心 | 福建自考_福建自学考试网| 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 铜镍-康铜-锰铜-电阻合金-NC003 - 杭州兴宇合金有限公司 | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 压力变送器-上海武锐自动化设备有限公司| 即用型透析袋,透析袋夹子,药敏纸片,L型涂布棒-上海桥星贸易有限公司 | Duoguan 夺冠集团| 玄米影院| 粉末冶金注射成型厂家|MIM厂家|粉末冶金齿轮|MIM零件-深圳市新泰兴精密科技 | 球磨机,节能球磨机价格,水泥球磨机厂家,粉煤灰球磨机-吉宏机械制造有限公司 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 合肥地磅_合肥数控切割机_安徽地磅厂家_合肥世佳电工设备有限公司 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 北京公司注册_代理记账_代办商标注册工商执照-企力宝 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 洗石机-移动滚筒式,振动,螺旋,洗矿机-青州冠诚重工机械有限公司 | 撕碎机,撕破机,双轴破碎机-大件垃圾破碎机厂家 | 全自动固相萃取仪_高通量真空平行浓缩仪-勤业永为 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 复盛空压机配件-空气压缩机-复盛空压机(华北)总代理 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 威海防火彩钢板,威海岩棉复合板,威海彩钢瓦-文登区九龙岩棉复合板厂 | 杭州高温泵_热水泵_高温油泵|昆山奥兰克泵业制造有限公司 |