Android 10 Gnss数据流程

Android 10 Gnss数据流程

一、LocationManager 数据成员:

GnssMeasurementCallbackTransport:高精度定位数据回调对象的封装,回调对象为GnssMeasurementsEvent.Callback,传递的对象为是GnssMeasurement,包含单颗 GNSS 卫星的原始观测值(如伪距、载波相位、多普勒频移)及计算参数(卫星 ID、信号强度、时间戳等),为 RTK/PPK 等高精度算法提供基础数据。

frameworks/base/location/java/android/location/GnssMeasurementCallbackTransport.java
frameworks/base/location/java/android/location/GnssMeasurement.java
//通过addGnssMeasurementsListener注册到LocationManagerService中

GnssNavigationMessageCallbackTransport:GnssNavigationMessage.Callback对象的封装,GNSS 框架中用于传递卫星导航原始数据(如星历、历书等)

//base/location/java/android/location/GnssNavigationMessageCallbackTransport.java
//base/location/java/android/location/GnssNavigationMessage.java
//通过addGnssNavigationMessageListener注册到LocationManagerService中

BatchedLocationCallbackTransport:将连续的单点位置更新聚合为批次数据(List),通过单次回调传递,减少跨进程通信开销,根据应用需求(如运动状态、精度要求)自动调整批次大小和上报频率

//base/location/java/android/location/BatchedLocationCallbackTransport.java
//通过addGnssBatchingCallback注册到LocationManagerService中

GnssStatusListenerTransport:LocationManagerService 回调接口,接收GNSS状态(onGnssStarted、onGnssStopped、onFirstFix、onSvStatusChanged)及Nmea数据

//base/location/java/android/location/IGnssStatusListener.aidl

mGnssStatusListeners:Gnss状态回调,代码如下

//base/location/java/android/location/LocationManager.java
public boolean registerGnssStatusCallback(@NonNull GnssStatus.Callback callback, @Nullable Handler handler){
    boolean result;
    synchronized (mGnssStatusListeners) {
        if (mGnssStatusListeners.get(callback) != null) {
            return true;
        }
        //为什么这么设计?每注册一次回调都创建一个GnssStatusListenerTransport(IGnssStatusListener.Stub)并注册到LocationManagerService中,如果一个Manager注册多个回调会导致与Service建立多个Binder通讯通道,如果回调数据量比较大或者通讯比较频繁的话这样设计非常占用binder资源
        try {
            GnssStatusListenerTransport transport = new GnssStatusListenerTransport(callback, handler);
            result = mService.registerGnssStatusCallback(transport, mContext.getPackageName());
            if (result) {
				mGnssStatusListeners.put(callback, transport);
            }
        }catch (RemoteException e) {
        	throw e.rethrowFromSystemServer();
        }
    }
    return result;
}

mGnssNmeaListeners:Nmea数据回调`

//base/location/java/android/location/OnNmeaMessageListener.java

mGpsStatusListeners:GPS状态回调,与Gnss状态回调类似少一个 onSatelliteStatusChanged(GnssStatus status) 接口

二、服务端LocationManagerService(以Nmea数据为例)

源码路径:base/services/core/java/com/android/server/LocationManagerService.java

  1. 初始化GnssLocationProvider
     private void initializeProvidersLocked() {//初始化provider
        ...
    	LocationProvider gnssProviderManager = new LocationProvider(GPS_PROVIDER, true);//监听GNSS状态及数据,更新Service内的信息,如mLastLocation
    	GnssLocationProvider gnssProvider = new GnssLocationProvider(mContext,
                        gnssProviderManager,
                        mHandler.getLooper());
     	mGnssStatusProvider = gnssProvider.getGnssStatusProvider();
        ...
     }
    
  2. Nmea注册回调

    //注册回调,在GnssStatusListenerHelper中管理客户端(Stub)相关接口
    public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName) {
        return addGnssDataListener(listener, packageName, "GnssStatusListener",
                    mGnssStatusProvider, mGnssStatusListeners,
                    this::unregisterGnssStatusCallback);
    }
    
  3. GnssLocationProvider

    GnssLocationProvider主要通过JNI处理与HAL层交互逻辑。GnssLocationProvider通过class_init_native()初始化jni,jni 通过android_location_GnssLocationProvider_set_gps_service_handle方法判断当前HAL层使用那个版本,从2.0获取Service,如果获取不到认为不支持2.0,继续试获取1.1的服务,如果获取不到默认使用1.0服务。

    查看当前系统运行的是那个服务如下:

    msm8953_64:/ # ps -A| grep gnss
    gps            558     1  285176   4516 binder_ioctl        0 S android.hardware.gnss@2.0-service-qti
    msm8953_64:/ #
    
    //base/services/core/java/com/android/server/location/GnssLocationProvider.java
    //base/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
    
    
    
  4. HAL层

    接口:hardware\interfaces\gnss\2.0
    服务:hardware\qcom\gps

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值