Android GPS架构分析

Linux大全评论2.8K views阅读模式

看Android的GPS模块有两个月了吧,终于可以写点东西出来。首先来看看GPS模块的代码结构:
Framework:

1.frameworks/base/location/java/android/location
这里主要是用来被App调用的,API包是android.location。

2.frameworks/base/location/java/com/android/internal/location
这个目录是Framework对Location服务的内部实现。

3.framework\services\java\com\android\server
这个目录只有一个文件


|-- LocationManagerService.java
是Location服务对内部实现的一种封装。


JNI:
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp
JNI层只有一个文件,起到承上启下的作用。上层承接Framework,下层调用HAL层具体硬件抽象实现。
HAL:Hardware Abstract Layer 硬件抽象层
hardware\libhardware_legacy\gps
hardware\libhardware_legacy\include\hardware_legacy\gps.h
HAL层相当于一个linux应用程序接口,通过open,close等操作,操作硬件设备。Android的源代码只实现了模拟器的gps接口,具体在文件gps_qemu.c中。在2.2版本中提供了对QCOM公司的gps的实现,在以下目录:
\hardware\qcom
 

下面介绍几个重要的数据结构:

1. GpsInterface接口是gps模块中最重要的数据结构,它是底层驱动实现的接口,如果要porting到自己的板子上,就需要实现这些接口。该接口的定义在gps.h中,模拟器实现在gps_qemu.c中。

/** Represents the standard GPS interface. */
typedef struct {
    
/**
     * Opens the interface and provides the callback routines
     * to the implemenation of this interface.
     */
    int (*init)( GpsCallbacks* callbacks );
    /** Starts navigating. */
    int (*start)( void );
    /** Stops navigating. */
    int (*stop)( void );
    /** Closes the interface. */
    void (*cleanup)( void );
    /** Injects the current time. */
    int (*inject_time)(GpsUtcTime time, int64_t timeReference,
                         int uncertainty);
    
/** Injects current location from another location provider
     * (typically cell ID).
     * latitude and longitude are measured in degrees
     * expected accuracy is measured in meters
     */
    int (*inject_location)(double latitude, double longitude, float accuracy);
    
/**
     * Specifies that the next call to start will not use the
     * information defined in the flags. GPS_DELETE_ALL is passed for
     * a cold start.
     */
    void (*delete_aiding_data)(GpsAidingData flags);
    
/**
     * fix_frequency represents the time between fixes in seconds.
     * Set fix_frequency to zero for a single-shot fix.
     */
    int (*set_position_mode)(GpsPositionMode mode, int fix_frequency);
    /** Get a pointer to extension information. */
    const void* (*get_extension)(const char* name);
} GpsInterface;

2. GpsCallbacks回调函数

这个是回调函数结构体,定义也在gps.h中。 它们的实现是在android_location_GpsLocationProvider.cpp中,google已经实现了,我们不需要做任何动作。

3. GpsLocation

表示Locatin数据信息,底层驱动获得Location的raw信息,通常是nmea码,然后通过解析就得到了location信息。

企鹅博客
  • 本文由 发表于 2020年10月3日 19:17:13
  • 转载请务必保留本文链接:https://www.qieseo.com/170582.html

发表评论