android的GPS HAL架构

本文详细探讨了GPS HAL的整体架构及其调用流程,包括从Android平台到硬件设备的各层组件及交互过程。重点介绍了HAL的演进过程,从模块调用到使用面向对象的stub形式,使得调用层次更加清晰且易于维护和扩展。同时,通过代码路径分析,解释了JNI层如何与HAL交互,以及如何获取并操作GPS硬件设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

先来看看整体的架构。


LocationManager         ---       AP

LocationManagerService   ---  Framework

GpsLocationProvider    ---    Framework

Com_android_server_location_GpsLocationProvider       ---     JNI

GPS  HAL   ---      HAL

GPS   driver   ---    driver

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

int hw_get_module(const char *id,const struct hw_module_t **module)
{
    return hw_get_module_by_class(id, NULL, module);
}


继续追踪hw_get_module_by_class(id, NULL, module),代码仍然在hardware.c中

int hw_get_module_by_class(const char *class_id, const char *inst,const struct hw_module_t **module){
    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(class_id, path, module);
	}


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的目的了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lindir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值