一、时间线
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 的核心区别
| 特性 | HIDL | AIDL |
|---|---|---|
| 定义语言 | 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 接口。