背景:
官方:https://source.android.com/devices/architecture/aidl/aidl-hals.
Google 在Android 11引入了AIDL for HALs
,旨在代替HIDL原先的作用。在之后的Android版本推荐使用AIDL 实现Hal层的访问。
这样做的原因,应该有以下几点:
- AIDL比HIDL存在的时间更长(仅从Android 8到Android 10),并在许多其他地方使用,如Android框架组件之间或应用程序中。既然AIDL具有稳定性支持,就可以用单一的IPC方式从HAL到框架进程或者应用进程。
- AIDL还有一个比HIDL更好的版本控制系统。
再详细的展开说就是:
- AIDL 更成熟,使用更广泛,如果HAL层也使用了AIDL的方式,那么就可以直接从应用进程调用到HAL 进程,以前使用HIDL的时候实现应用进程访问HAL的服务,需要在system server进程的中介。来个图:
- 以前使用HIDL的方式,如果后续vendor HAL version需要迭代升级,那么就需要再创建一个子目录,过程中实际上做很多的重复工作,冗余而效率不高。
值得注意的是:在HAL 层使用AIDL必须使用Stable AIDL
, 和我们在应用层或者框架层稍微不同,因为和vendor的接口设计要兼顾稳定性,system和vendor的更新速率不一样。
HALs using AIDL to communicate between framework components must use Stable AIDL.
AIDL for HALs实战
https://blog.csdn.net/qq_40731414/article/details/126823262
适用于 HAL 的 AIDL
Android 11 中引入了在 Android 中使用 AIDL 实现 HAL 的功能。这样就能在不使用 HIDL 的情况下实现 Android 的部分代码。在可能的情况下,应将 HAL 转换为仅使用 AIDL(当上行 HAL 使用 HIDL 时,必须使用 HIDL)。
如果 HAL 使用 AIDL 在框架组件(例如 system.img
中的组件)和硬件组件(例如 vendor.img
中的组件)之间进行通信,必须使用稳定的 AIDL。不过,如需在分区内进行通信(例如从一个 HAL 到另一个 HAL),则对需要使用的 IPC 机制没有任何限制。
设计初衷
AIDL 出现在 HIDL 之前,而且在 Android 框架组件之间或应用内等其他很多地方都有使用。现在,由于 AIDL 具备了稳定性支持,所以能够仅使用一个 IPC 运行时环境来实现整个堆栈。此外,AIDL 的版本控制系统也优于 HIDL。
- 因为仅使用一种 IPC 语言,所以意味着只需了解、调试、优化和保护一个运行时环境。
- AIDL 可为接口所有者提供内建的版本控制机制。
- 所有者可以将方法添加到 Parcelable 的接口或字段的末尾。这意味着可以在持续多年的开发过程中简化对代码的版本控制,并逐年降低产生的开销(可以就地修改类型,而且更新接口版本不需要新增额外的库)。
- 扩展接口可以在运行时附加,而不是在类型系统中附加,因此无需将下游扩展 rebase 到新版接口上。
- 如果现有 AIDL 接口的所有者选择使其稳定化,此类接口可以直接沿用。而在以前,这种情况下必须用 HIDL 创建接口的完整副本。
AIDL 与 HIDL 之间的主要差异
使用 AIDL HAL 或使用 AIDL HAL 接口时,请注意与编写 HIDL HAL 的差异。
- AIDL 语言的语法更接近 Java。HIDL 语言的语法类似于 C++。
- 所有 AIDL 接口都具有内置的错误状态。请勿创建自定义状态类型,而应在接口文件中创建常量状态 int,并在 CPP/NDK 后端使用
EX_SERVICE_SPECIFIC
,在 Java 后端使用ServiceSpecificException
。详见错误处理。 - 发送 binder 对象时,AIDL 不会自动启动线程池。您需要手动启动线程池(详见线程管理)。
- 未经检查的传输错误不会导致 AIDL 终止运行(但是未经检查的错误会导致 HIDL
Return
终止运行)。 - AIDL 只能为每个文件声明一种类型。
- AIDL 参数除了可以被指定为 output 参数,还可以被指定为 in/out/inout 参数(没有“同步回调”)。
- AIDL 将 fd 用作基元类型,而不是句柄。
- HIDL 对不兼容的更改使用主要版本,对兼容的更改使用次要版本。而在 AIDL 中,更改实现了向后兼容。AIDL 没有明确的主要版本概念,而是将版本更改体现在软件包名称中。例如,AIDL 可能会使用软件包名称
bluetooth2
。 - 默认情况下,AIDL 不会继承实时优先级。必须根据 binder 使用
setInheritRt
函数才能启用实时优先级继承。
refs:
https://blog.csdn.net/qq_40731414/article/details/126823262
https://source.android.com/docs/core/architecture/aidl/aidl-hals?hl=zh-cn
https://source.android.com/docs/core/architecture/hidl?hl=zh-cn
https://source.android.com/docs/core/architecture/aidl/stable-aidl?hl=zh-cn
https://source.android.com/docs/core/architecture/aidl/aidl-backends?hl=zh-cn
标签:HAL,AIDL,HIDL,接口,使用,Android From: https://www.cnblogs.com/bluestorm/p/18316225