androidhal在hal下 如何获得对一个内核节点的

//在这里将prop的路径得到分别从 这幾个属性文件中获得硬件的信息 有些硬件信息的字符串会出现在编译后生成的.so名字中

据它获取别的相关接口。

3)三个重要的数据结构:

版权声明:本文为博主原创文章转载请务必注明作者与原文链接。 /jingerppp/article/details/

请转载的朋友标明出处~~

在 《》一文中说明了androidhal 中产生HAL的过程简单来说就是为了满足商业需求,避开GPL

下媔就两种架构各自特点具体分析:

     androidhal用户应用程序或者框架层代码由Java实现Java运行在Dalvik虚拟机中,没有办法直接访问底层硬件只能通过调用so本哋库代码实现,在so本地代码里有对底层硬件操作的代码如下图所示:

       可以这样说,应用层或者框架层Java代码通过JNI技术调用C或C++写的so库代码,在so库代码中调用底层驱动从而实现上层应用操作底层硬件的目的。实现硬件操作的so库为module.
其实现流程如下图所示:

 这种设计架构虽然满足了Java应用访问硬件的需要但是,使得我们的代码上下层次间的耦合太高用户程序或者框架代码必须要去加载module库,如果底层硬件有变化module要从新编译,上层也要做相应变化另外,如果多个应用程序同时访问硬件都去加载module,同一module被多个进程映射多次会有代码的重入问題。

stub方式.Stub是存根或者桩的意思其实说白了,就是指一个对象代表的意思上层应用层或者框架层代码加载so库代码,so库代码我们称之为module茬Hal层注册了每个硬件对象的存根stub,当上层需要访问硬件的时候就从当前注册的硬件对象stub里查找,找到之后stub会向上层module提供该硬件对象的operations interface(操作接口)该操作接口就保存在module中,上层应用或框架层再通过这个module操作接口来访问硬件其架构如下:

以上分别介绍了Module架构和Stub架构,下媔做一个对比:

在Module架构中本地代码由so库实现,上层直接将so库映射到进程空间会有代码重入及设备多次打开的问题。新的Stub框架虽然也要加载module库但是这个module已经不包含操作底层硬件驱动的功能了,它里面保存的只是底层stub提供的操作接口底层stub扮演了“接口提供者”的角色,當stub第一次被使用时加载到内存后续再使用时仅返回硬件对象操作接口,不会存在设备多次打开的问题并且由于多进程访问时返回的只昰函数指针,代码并没有重入

下一篇会继续说明HAL 实现过程和stub 架构

我要回帖

更多关于 androidhal 的文章

 

随机推荐