RIL(Radio Interface Layer)和HIDL的介绍

事先提示,这篇文章是以AOSP为基础,基本是以RILJ的角度来看的。本人也是初学者,如果有说的不对的地方,还请指教

1、概念

  • 跟底层modem交互需要RIL,RIL分成两个部分:RILJ和RILC
  • RILJ负责跟上层(java)交互,他跟phone在同一进程。比如会将上层的请求通过RILJ发送给RILC,这个过程是socket通信。
  • RILC在rild进程中,向上负责跟RILJ进行对接(C++),向下对接modem。
  • HIDL则是RILJ和RILC之间的通信接口

为了比较好的理解HIDL这个东西,举个例子。比如PC你觉得打游戏不给力了,可能是CPU或是GPU有了瓶颈,这个时候你就换对应的模块就行了。这是因为PC都是有通用的接口,如果哪块你不满意,你单独换其中一块就行,没有必要整个都换。但是手机就不行了,打游戏不给力,不管是CPU不行了还是GPU不行了,你都要换整机,因为没有通用的接口。

 

2、交互

交互分为两种,一种是上层的主动查询,一种是底层的主动上报。

主动查询分为查询(request)modem的回应(solicited response)

  • 执行查询操作的代码大部分都在RIL.java里面
  • 收到sol response的代码都在RadioResponse.java中

底层主动上报(unsolicited msg)

  • 对应的代码都在RadioIndication.java中

HIDL:

  • 代码在hardware/interfaces/radio下,区分不同版本,每个版本下都有IRadio.hal、IRadioIndication.hal、IRadioResponse.hal、types.hal这几个文件,基本上跟上面也是对应的
  • RILC对应的代码可能是在hardware/ril/libril/下,他们的代码都是C++

 

3、举例

  • 主动查询:
private void handleRadioAvailable() {
    mCi.getBasebandVersion(obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE));

    mCi.getDeviceIdentity(obtainMessage(EVENT_GET_DEVICE_IDENTITY_DONE));
    mCi.getRadioCapability(obtainMessage(EVENT_GET_RADIO_CAPABILITY));
    mCi.areUiccApplicationsEnabled(obtainMessage(EVENT_GET_UICC_APPS_ENABLEMENT_DONE));

    startLceAfterRadioIsAvailable();
}

1、在GsmCdmaPhone.handleRadioAvailable中,第2行,首先会调用obtainMessage创建一个Message对象。在这个地方有两个重点:

  • obtainMessage是一个handler的方法,即GsmCdmaPhone就是一个handler,那也会有对应的handleMessage重写,和对应event的处理
  • event就是EVENT_GET_BASEBAND_VERSION_DONE
@Override
public void getBasebandVersion(Message result) {
    IRadio radioProxy = getRadioProxy(result);
    if (radioProxy != null) {
        RILRequest rr = obtainRequest(RIL_REQUEST_BASEBAND_VERSION, result,
                mRILDefaultWorkSource);

        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));

        try {
            radioProxy.getBasebandVersion(rr.mSerial);
        } catch (RemoteException | RuntimeException e) {
            handleRadioProxyExceptionForRR(rr, "getBasebandVersion", e);
        }
    }
}

2、调用getBasebandVersion处理生成的Message

  • 在第5行使用obtainRequest将入参传入的Message生成一个RILRequest,且放入一个list中,他在list中的位置就是mSerial
  • 这个RILRequest的编号就是RIL_REQUEST_BASEBAND_VERSION
  • 在第11行使用HIDL接口通知RILC查询BASEBAND_VERSION,并将之前得到的mSerial传给RILC
public void getBasebandVersionResponse(RadioResponseInfo responseInfo, String version) {
    responseString(responseInfo, version);
}

private void responseString(RadioResponseInfo responseInfo, String str) {
    RILRequest rr = mRil.processResponse(responseInfo);

    if (rr != null) {
        if (responseInfo.error == RadioError.NONE) {
            sendMessageResponse(rr.mResult, str);
        }
        mRil.processResponseDone(rr, responseInfo, str);
    }
}

3、当modem查到结果后并通过RILC将结果返回给RILJ的时候,调用HIDL接口getBasebandVersionResponse通知

  • 在第2行,收到的信息直接都传给了responseString进行处理
  • 在第6行,通过之前传递给RILC的mSerial,取出之前创建的RILRequest
  • 在第9行,rr.mResult就是最开始创建的那个Message,通过Message找到当初的Handler(GsmCdmaPhone),将消息和得到的response(String),以AsyncResult的形式返回给handler
  • handler在收到消息后,使用handleMessage函数进行处理,对应的msg.what就是之前创建Message时候的EVENT_GET_BASEBAND_VERSION_DONE

 

  • modem主动上报:
private void responseDataCallListChanged(int indicationType, List<?> dcList) {
    mRil.processIndication(indicationType);

    if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_DATA_CALL_LIST_CHANGED, dcList);

    ArrayList<DataCallResponse> response = RIL.convertDataCallResultList(dcList);
    mRil.mDataCallListChangedRegistrants.notifyRegistrants(
            new AsyncResult(null, response, null));
}

1、unsol消息就能更单纯点,即不需要上层触发request,底层直接就调用HIDL接口上报

2、第6行解析出数据response之后,在第7行通过notifyRegistrants通知所有订阅者

3、具体有哪些订阅者,可以看往mDataCallListChangedRegistrants中add成员的地方,即调用registerForDataCallListChanged的地方

4、通知订阅者的方法,是遍历list,取出每个Registrant,这个数据结构也有点类似Message,它在创建的时候就保存了对应的Handler等信息,通过handler把对应的event还有modem返回回来的result发送给handler进行处理 ,就比如这个handler将要处理的事件就是EVENT_RECEIVE_NETWORK_SCAN_RESULT

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android RIL(无线射频接口层)模块是运行在Android手机系统上的一层软件模块,它作为通信协议栈和硬件之间的桥梁,提供了与移动通信网络的通信功能。RIL模块主要负责处理与手机基带芯片的通信,管理移动网络连接以及处理移动通信相关功能。 RIL模块的主要职责包括: 1. 处理与基带芯片的通信:RIL模块通过与基带芯片之间的通信接口,实现对基带芯片的控制和管理,包括进行移动网络的注册、鉴权和密钥协商等。 2. 管理移动网络连接:RIL模块负责与移动网络建立通信连接,包括拨号、发送和接收数据等相关操作。它能够实现与移动网络的通信功能,如发送和接收短信、接听和拨打电话以及访问互联网等。 3. 实现SIM卡管理:RIL模块管理与SIM卡之间的通信,包括识别和读取SIM卡中的相关信息,如号码、短信、联系人等。它能够处理与SIM卡相关的操作,如读取SIM卡中的联系人、发送和接收短信等。 4. 处理通话和短信功能:RIL模块能够实现电话的呼叫功能,包括呼出、接听、挂断等。同时,它还能够处理短信的发送和接收,包括编码和解码等操作。 总之,Android RIL模块是Android系统中的一个重要软件模块,它为手机提供了与移动通信网络的连接和通信功能。通过与基带芯片的交互,RIL模块能够实现与移动网络的通信、管理移动网络连接、处理SIM卡相关操作以及实现电话和短信功能等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值