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
-
初始化GnssLocationProvider
private void initializeProvidersLocked() {//初始化provider...LocationProvider gnssProviderManager = new LocationProvider(GPS_PROVIDER, true);//监听GNSS状态及数据,更新Service内的信息,如mLastLocationGnssLocationProvider gnssProvider = new GnssLocationProvider(mContext,gnssProviderManager,mHandler.getLooper());mGnssStatusProvider = gnssProvider.getGnssStatusProvider();...}
-
Nmea注册回调
//注册回调,在GnssStatusListenerHelper中管理客户端(Stub)相关接口 public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName) {return addGnssDataListener(listener, packageName, "GnssStatusListener",mGnssStatusProvider, mGnssStatusListeners,this::unregisterGnssStatusCallback); }
-
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
-
HAL层
接口:hardware\interfaces\gnss\2.0
服务:hardware\qcom\gps