RadioIndication 的历史 - HIDL 时代就已存在

3 阅读3分钟

一、时间线

1. HIDL 时代(2016年起)

RadioIndication 在 HIDL 时代就已存在,作为 IRadioIndication 接口的实现:

package android.hardware.radio@1.0;

interface IRadioIndication {
    oneway radioStateChanged(RadioIndicationType type, RadioState radioState);
    oneway callStateChanged(RadioIndicationType type);
    oneway networkStateChanged(RadioIndicationType type);
    // ... 更多回调方法
}

HIDL 版本的 RadioIndication 实现(用于测试):

class RadioIndication : public IRadioIndication {
   protected:
    RadioHidlTest& parent;

   public:
    RadioIndication(RadioHidlTest& parent);
    virtual ~RadioIndication() = default;

    Return<void> radioStateChanged(RadioIndicationType type, RadioState radioState);
    Return<void> callStateChanged(RadioIndicationType type);
    Return<void> networkStateChanged(RadioIndicationType type);
    Return<void> newSms(RadioIndicationType type, const hidl_vec<uint8_t>& pdu);
    // ...
}

2. HIDL 版本演进

从 Android 7.0 到 12,HIDL 持续演进:

IRadioIndication@1.0  (2016, Android 7.0)
IRadioIndication@1.1  (2017, Android 8.0)
IRadioIndication@1.2  (2018, Android 9.0)
IRadioIndication@1.3  (2019, Android 10)
IRadioIndication@1.4  (2019, Android 10)
IRadioIndication@1.5  (2020, Android 11)
IRadioIndication@1.6  (2020, Android 12)

3. AIDL 时代(从 Android 13 开始)

Android 13 开始迁移到 AIDL,但为了兼容,系统提供了兼容层

class RadioIndication : public V1_6::IRadioIndication {
    std::shared_ptr<DriverContext> mContext;

    // AIDL 回调接口
    GuaranteedCallback<
        ::aidl::android::hardware::radio::data::IRadioDataIndication,
        ::aidl::android::hardware::radio::data::IRadioDataIndicationDefault, true>
        mDataCb;
    GuaranteedCallback<
        ::aidl::android::hardware::radio::messaging::IRadioMessagingIndication,
        ::aidl::android::hardware::radio::messaging::IRadioMessagingIndicationDefault, true>
        mMessagingCb;
    // ... 更多 AIDL 回调接口
        
    // 继承自 HIDL V1.6 的方法实现
    Return<void> radioStateChanged(V1_0::RadioIndicationType type,
                                   V1_0::RadioState radioState) override;
    Return<void> callStateChanged(V1_0::RadioIndicationType type) override;
    // ...
}

二、HIDL vs AIDL 的核心区别

特性HIDLAIDL
定义语言HAL (Hardware Abstraction Language) - .hal文件Android Interface Definition Language - .aidl文件
版本管理内置版本控制 (@1.0, @1.1, ...)接口版本字符串
模块分裂单一 IRadioIndication 接口包含所有回调拆分为多个独立接口:
- IRadioDataIndication
- IRadioMessagingIndication
- IRadioModemIndication
- IRadioNetworkIndication
- IRadioSimIndication
- IRadioVoiceIndication
- IRadioImsIndication
类型系统C++ 为主,类型映射复杂Java 为主,更清晰的类型定义
性能二进制协议基于 Binder

三、Java 层的 RadioIndication

在 Java 层,只有 一个 RadioIndication 实现(无论 HIDL 还是 AIDL):

public class RadioIndication extends IRadioIndication.Stub {
    RIL mRil;

    RadioIndication(RIL ril) {
        mRil = ril;
    }

    public void radioStateChanged(int indicationType, int radioState) {
        mRil.processIndication(HAL_SERVICE_RADIO, indicationType);
        int state = RILUtils.convertHalRadioState(radioState);
        mRil.setRadioState(state, false);
    }

    public void callStateChanged(int indicationType) {
        // ...
    }
    // ... 所有其他回调方法
}

这个 Java RadioIndication 既兼容 HIDL 版本,也兼容 AIDL 版本。

四、AIDL 兼容层的作用

在 AIDL 时代,C++ 兼容层将 HIDL 接口适配到 AIDL:

Return<void> RadioIndication::radioStateChanged(V1_0::RadioIndicationType t, 
                                                 V1_0::RadioState st) {
    LOG_CALL << t;
    // 将 HIDL 的回调转发到 AIDL 的 mModemCb
    modemCb()->radioStateChanged(toAidl(t), aidl::RadioState(st));
    return {};
}

Return<void> RadioIndication::modemReset(V1_0::RadioIndicationType type, 
                                          const hidl_string& reasn) {
    LOG_CALL << type;
    modemCb()->modemReset(toAidl(type), reasn);
    return {};
}

五、RIL 指示的架构演变

【HIDL 时代】                    【AIDL 时代】
IRadioIndication@1.6      →      RadioIndication (兼容层)
├─ IRadioIndication                  ├─ IRadioDataIndication
├─ IRadioResponse                    ├─ IRadioMessagingIndication
└─ IRadio                            ├─ IRadioModemIndication
                                     ├─ IRadioNetworkIndication
                                     ├─ IRadioSimIndication
                                     ├─ IRadioVoiceIndication
                                     └─ IRadioImsIndication

总结

  • RadioIndication 是 HIDL 时代的产物,从 Android 7.0 就开始使用
  • AIDL 时代没有"新增"RadioIndication,而是通过兼容层继续使用
  • AIDL 改变的是内部实现和模块分割,但对外部接口(Java RIL)的影响最小
  • Java 层的 RadioIndication 保持不变,既支持 HIDL 也支持 AIDL

这是 Android HAL 从 HIDL 迁移到 AIDL 的典型演变方式——通过兼容层保证向后兼容,同时新系统采用更现代的 AIDL 接口。