九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 5373|回复: 1
打印 上一主题 下一主题

android的GPS HAL架构

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-28 11:38:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

最近一直在研究GPS的HAL,细节之处还不是很熟悉,但是看了两周的代码,有了自己的一些浅薄之见。

先来看看整体的架构。

  1. LocationManager         ---       AP
  2. LocationManagerService   ---  Framework
  3. GpsLocationProvider    ---    Framework
  4. Com_android_server_location_GpsLocationProvider       ---     JNI
  5. GPS  HAL   ---      HAL
  6. GPS   driver   ---    driver
  7. GPS  devices  ---    hardware  devices
复制代码

以上是从上至下的整体架构(人懒,没画图)。整个的调用流程就是这样的。从AP到JNI的调用流程在此不再赘述。我们看下JNI到driver的调用流程。重点看下HAL的架构。


HAL的演进

HAL以前是以module来被调用的。所谓modlue,就是将c文件编译成so文件,然后在jni中加载调用。此种方式现在在源码的libhardware_legacy文件夹下。后来hal的架构改变,变成了以stub的形式来被上层调用。这样就有种面向对象的思想了。虽然也是编译成so文件然后加载,但是JNI是直接调用c对象。这种层次更清晰,而且更易于维护和扩展。


GPS HAL的详细架构




以上,我们可以看到,gps_module_t继承hw_device_t。而hw_device_t的结构如右图。

可能我们看到这副架构图还是有点不能理解,那么下面我们看代码,来了解下。

首先,从JNI调用开始。

代码路径:framework/base/services/jni/Com_android_server_location_GpsLocationProvider.cpp

由于此文件中的函数android_location_provider_class_init_native()在java的static块中运行,所以此函数最先被调用。

在此函数中,主要做了一下几件事情。

JNI层传入module ID,hw_get_module传入ID得到hw_module_t。


这一步主要实现是在hardward.c中

代码路径:libhardware/hardware.c

  1. int hw_get_module(const char *id,const struct hw_module_t **module)
  2. {
  3.     return hw_get_module_by_class(id, NULL, module);
  4. }
复制代码
继续追踪hw_get_module_by_class(id, NULL, module),代码仍然在hardware.c中
  1. int hw_get_module_by_class(const char *class_id, const char *inst,const struct hw_module_t **module){
  2.     if (i < HAL_VARIANT_KEYS_COUNT+1) {
  3.         /* load the module, if this fails, we're doomed,and we should not try
  4.         * to load a different variant. */
  5.         status = load(class_id, path, module);
  6.         }
复制代码
load函数真正加载id得到hw_module_t。
紧接着在JNI中gps_module_t向上转型成为hw_device_t
然后利用hw_module_t调用open。
调用了open之后,就会走到厂商自定义的接口里了,对gps_module_t进行赋值并向下转型。那么我们就拿到了最终要调用的对象gps_module_t了
利用gps_module_t,我们可以访问HAL里的函数,就达到了JNI调用HAL的目的了。
回复

使用道具 举报

沙发
发表于 2014-12-11 10:28:21 | 只看该作者
版本主果然厉害
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-5-18 22:22 , Processed in 0.022210 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表