`
George_ghc
  • 浏览: 93827 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实现Android系统的HAL(硬件适配层)

 
阅读更多
Android系统作为一个开放的平台,为了适配千变万化的硬件平台,定义了一个硬件适配层(HAL)框架。如果你实现自己硬件平台的硬件适配层,那么Android系统将会调用你的硬件适配层来为系统加速。如果你未定义自己平台硬件适配层(HAL),那么Android系统将调用软实现,这样的话不会发挥出你的硬件平台的最大效能。本文简略介绍一下Android系统的HAL层,进而介绍怎样实现HAL层,以起到抛砖引玉的作用。


     Android系统HAL层位于hardware目录下面。HAL层是以桩的形式实现的,请看如下取自hardware/hardware.c的代码:

int hw_get_module(const char *id, const struct hw_module_t **module) {
     int status;
     int i;
     const struct hw_module_t *hmi = NULL;
     char prop[PATH_MAX];
     char path[PATH_MAX];
      /*
      * Here we rely on the fact that calling dlopen multiple times on
      * the same .so will simply increment a refcount (and not load
      * a new copy of the library).
      * We also assume that dlopen() is thread-safe.
      */
      /* Loop through the configuration variants looking for a module */
     for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
         if (i < HAL_VARIANT_KEYS_COUNT) {
             if (property_get(variant_keys[i], prop, NULL) == 0) {
                 continue;
             }
             snprintf(path, sizeof(path), "%s/%s.%s.so",
                     HAL_LIBRARY_PATH, id, prop);
         } else {
             snprintf(path, sizeof(path), "%s/%s.default.so",
                     HAL_LIBRARY_PATH, id);
         }
         if (access(path, R_OK)) {
             continue;
         }
         /* we found a library matching this id/variant */
         break;
     }
      status = -ENOENT;
     if (i < HAL_VARIANT_KEYS_COUNT+1) {
         /* load the module, if this fails, we're doomed, and we should not try
          * to load a different variant. */
         status = load(id, path, module);
     }
      return status;
 }


从代码中我们可以看出Android系统首先去系统属性查找硬件定义,然后再去加载相应硬件HAL层的特定模块(模块名字在函数参数id传入)so库文件,如果系统属性中未定义硬件属性则价值默认硬件HAL层对应模块的so库文件进行硬件加速。

     你可能会问Android加载了HAL层的so库文件,那么他怎么知道调用哪个函数呢?其实所有的硬件模块需要实现的接口Android系统都已经定义好了,位于hardware/libhardware/include/hardware下面,你打开会发现下面有很多Android定义好的HAL层模块,比如gralloc,copybit等等。自定义的HAL层的任何模块都必须按上述目录中定义好的接口来实现,否则就会HAL层出错(后果很严重)。这样Android系统正确的加载了HAL层特定模块的so库文件之后,它就知道这个模块的so库中包含哪些函数,需要的时候直接调用就可以了。

     Android系统其实是HAL层框架,大家实现HAL层必须要按照预先定义好的接口来实现。这样做的优势是扩展非常方便,当你有一个新的硬件平台需要跑Android,你只需要在hardware目录下面实现一个自己的HAL层就可以了,不需要修改Android框架的代码。因为现实世界中的平台千变万化,Simon也不可能对他们全部了解,所以这里就不具体介绍怎样实现具体的HAL层了,可供参考的实例很多,拿来模仿一下即可。

     为了让系统正确加载你的代码,你需要在系统属性中定义好你的硬件属性,这样Android系统才会正确的加载你的HAL层so库文件。那么需要定义那些系统属性呢?我们继续看hardware/hardware.c文件,发现如下定义:
static const char *variant_keys[] = {
     "ro.hardware",
  /* This goes first so that it can pick up a different
                        file on the emulator. */
     "ro.product.board",
     "ro.board.platform",
     "ro.arch" };

如果你仔细研究了上面hw_get_module函数的代码,会发现只要定义了上述系统属性中的一个就可以了。定义上述属性的方法有很多。我这里推荐一种方法就是在系统启动的时候,init进程会读取/proc/cpuinfo文件中的数据得到硬件信息,并且设置ro.hardware属性(具体请查看system/core/init/init.c文件),所以在kernal中定义好硬件信息是个很不错的想法。这样Android移植到一个新的硬件平台只需要移植Kernal(这步肯定是少不了的),另外定义好相应平台的HAL层就可以了,Android框架不需要做任何修改即可。
分享到:
评论

相关推荐

    android HAL层的实现

    在Android系统架构中,硬件抽象层(Hardware Abstraction Layer,简称HAL)是连接操作系统核心与硬件设备的关键组件。它提供了一种标准化的方式,使得上层的Android系统服务和应用程序能够与不同厂商、不同类型的...

    android_audio_HAL.rar_android_android audio_android audio HAL_an

    在Android系统中,Audio HAL(Hardware Abstraction Layer)是操作系统与硬件之间的重要接口,它负责处理音频输入和输出的低级操作。这篇关于"android_audio_HAL"的详细文档,主要涵盖了Android音频HAL的移植和Audio...

    Android 深度搜索 HAL与驱动开发 源代码

    通过学习和实践这份“Android深度搜索HAL与驱动开发源代码”,你将能深入了解Android系统的底层工作原理,提升系统优化和定制能力,对于从事Android系统开发、ROM定制或者硬件适配等工作大有裨益。记得在学习过程中...

    gps_Android8.0 HAL层协议

    在Android系统中,HAL(Hardware Abstraction Layer,硬件抽象层)是操作系统与硬件之间的一个关键接口,它使得操作系统可以独立于具体的硬件实现进行开发,同时允许硬件供应商为不同的硬件平台提供定制化的驱动程序...

    android7 gps hal

    综上所述,"android7 gps hal"涉及的是Android 7.0中GPS模块的硬件抽象层实现,包括使用C语言进行串口通信的配置、HAL的结构与功能设计、以及如何与上层Location服务进行交互等多个关键知识点。理解这些内容对于开发...

    Android5.1 Gps Hal

    GPS HAL是Android系统架构中的一个重要组成部分,它位于硬件层和上层应用框架之间,起到了桥梁的作用。HAL的主要任务是为上层应用提供统一的接口,隐藏底层硬件的具体实现细节,使得应用程序能够便捷地访问和控制GPS...

    Linux摄像头驱动的设计优化及其对应的Android下HAL封装设计方法探究.pdf

    - 接着,根据Android的HAL接口规范,编写相应的适配层代码,使得Linux驱动可以通过HAL与Android系统进行通信。这包括创建设备节点、注册设备、初始化和释放资源等关键步骤。 - 最后,通过测试验证HAL封装的正确性...

    Android系统开发led灯hal程序

    HAL层位于Android系统的用户空间与内核空间之间,它封装了底层硬件的具体实现,为上层组件如系统服务、库和应用程序提供了一个抽象的硬件接口。这样,即使硬件平台更换,只要HAL层适配正确,上层代码几乎无需修改...

    s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(三 APP应用)源码

    在Android系统中,开发流程涉及四个主要层次:驱动层、HAL层(硬件抽象层)、服务层和应用层。本文将重点解析s5p4418芯片在Android 4.4.2版本上的应用程序开发,特别是针对APP应用的源码分析。 首先,驱动层是...

    《Android深度探索(卷1) HAL与驱动开发》.(李宁).[PDF]@ckook.pdf.zip

    1. **硬件抽象层(HAL)**:HAL是Android系统架构的关键组成部分,它提供了一个标准化的接口,使得上层应用程序框架可以不关心具体的硬件实现,而直接通过HAL调用硬件功能。HAL层在系统中起到了桥梁的作用,连接了硬件...

    android sensor hal

    在Android系统中,Sensor HAL(Hardware Abstraction Layer)是硬件接口层,它的主要职责是将传感器硬件的功能抽象出来,提供给上层应用和系统服务统一的接口。在基于Freescale BSP(Board Support Package)的...

    android_leds_hal

    `android_leds_hal`是Android系统中LED硬件抽象层(Hardware Abstraction Layer)的具体实现,它使得Android系统能与特定硬件平台的LED控制器进行通信。在这个项目中,我们关注的是基于开发板Tiny210,搭载Linux内核...

    安卓对讲机录音机相关-androidFM收音机驱动hal层应用层代码以及框架层.rar

    在安卓系统中,对讲机录音机功能的实现涉及到多个层次的软件开发,包括硬件抽象层(HAL)、应用层和框架层。这个压缩包“安卓对讲机录音机相关-androidFM收音机驱动hal层应用层代码以及框架层.rar”包含的资料可能...

    Jollen Mokoid Android HAL层示例

    在Android系统中,硬件抽象层(Hardware Abstraction Layer,简称HAL)是连接操作系统核心与硬件设备的重要桥梁。它为上层的Android框架层提供了一个标准化的接口,使得各种不同硬件厂商的设备可以以统一的方式进行...

    Ubuntu中为Android简单介绍硬件抽象层(HAL)

    总结来说,Android硬件抽象层是实现系统硬件兼容性和保密性的关键,它的设计和实现涉及到操作系统、驱动编程、接口设计等多个领域,是Android开发者不可或缺的知识点。理解并熟练掌握HAL,将有助于开发者更好地驾驭...

    i.MX6+Android+HAL实战共51页.pdf.z

    【标题】"i.MX6+Android+HAL实战共51页.pdf.z" 提供的是一份关于在i.MX6处理器上实现Android系统及硬件抽象层(HAL)的实战教程,总计51页,可能涵盖了从理论到实践的详细步骤。 【描述】"i.MX6+Android+HAL实战共51...

    android-framework-hal(免积分下载)

    2. **HAL(Hardware Abstraction Layer)**:硬件抽象层是Android系统架构中的关键部分,它隐藏了硬件设备的具体实现细节,为上层的Android系统服务提供了一致的接口。HAL通常由一组C/C++编写的动态链接库组成,这些...

    Android Ublox GPS 驱动

    Android的GPS系统基于HAL(硬件抽象层)设计,它位于操作系统核心与硬件之间,提供了标准化接口供上层应用程序调用。在Android中,GPS HAL负责与硬件交互,获取GPS数据,并将其转化为上层应用可以理解和使用的格式。...

    Android11.0系统中适配EC20模块4G及GPS功能

    HAL是Android系统框架层与硬件驱动程序之间的接口,它封装了硬件的具体实现,使得上层应用和服务能够以统一的方式来访问硬件资源。在适配EC20模块的过程中,我们需要编写特定的HAL组件,以使系统能够识别并控制EC20...

Global site tag (gtag.js) - Google Analytics