Android HAL学习
Android的HAL是为了一些保护硬件提供商的驱动程序的知识产权而提出的一个概念,就是为了避开linux kernel的GPL license的束缚。因为linux kerner的库是要遵循开放源码的,Android把控制硬件的动作都放到了android HAL中,而在Kernel driver里面只有最简单的读写寄存器的操作,这样在Kernel中就完全去掉了各种功能性的操作(比如控制逻辑等),这些能够体现硬件特性的操作都放到了Android的HAL层,而Android是基于Aparch的license,因此硬件厂商可以只提供二进制代码,这样就可以避免硬件厂商自己的核心技术开源,因为提供的二进制代码是没法抄袭山寨的,
硬件抽象层 (HAL)提供标准接口,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,例如相机或蓝牙模块。当框架 API 请求访问设备硬件时,Android系统将为该硬件加载相应的库模块。
此图出自android大佬老罗
在Android下访问HAL大致有以下两种方式:
(1)Android app可以直接通过service调用.so格式的jni
(2)经过serviceManager调用service
上面两种方法应该说是各有优缺点:
第一种方法简单高效,但不正规。
第二种方法实现起来比较复杂,但更符合目前的Android框架。
第二种方法中,LegManager(java)和LedService(java)在两个进程中,需要通过跨进程IPC通讯的方式来通讯。
在现在的android框架中,这两种方式都存在,比如对于lights,是直接透过LightsService调用JNI,而对于sensor,中间则是通过SensorsManager来调用JNI的。
转载声明: Android硬件抽象层(HAL)概要介绍和学习计划
评论