MyException - 我的异常网
当前位置:我的异常网» Android » 兑现Android系统的HAL(硬件适配层)

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

www.MyException.Cn  网友分享于:2013-07-26  浏览:14次
实现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框架不需要做任何修改即可。

文章评论

程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员和编码员之间的区别
程序员和编码员之间的区别
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
鲜为人知的编程真相
鲜为人知的编程真相
旅行,写作,编程
旅行,写作,编程
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
一个程序员的时间管理
一个程序员的时间管理
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
编程语言是女人
编程语言是女人
中美印日四国程序员比较
中美印日四国程序员比较
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
老程序员的下场
老程序员的下场
我的丈夫是个程序员
我的丈夫是个程序员
我是如何打败拖延症的
我是如何打败拖延症的
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员的鄙视链
程序员的鄙视链
程序员都该阅读的书
程序员都该阅读的书
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
那些争议最大的编程观点
那些争议最大的编程观点
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
代码女神横空出世
代码女神横空出世
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
为什么程序员都是夜猫子
为什么程序员都是夜猫子
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
 程序员的样子
程序员的样子
程序员必看的十大电影
程序员必看的十大电影
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
漫画:程序员的工作
漫画:程序员的工作
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有