Android GPS架构分析-摘自Daniel Wood的博客

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

以下摘自DanielWood的博客:架构分析(gps启动过程图)Gps启动过程图(基于GoogleAndroid2.2代码)下面再贴一张从GoogleI/O大会文档里面截来的图AndroidGPS架构分析-previewAndroidGPS架构分析DanielWood20101222转载时请注明出处和作者文章出处:作者:DanielWood----------------------------------------------------------看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.cppJNI层只有一个文件,起到承上启下的作用。上层承接Framework,下层调用HAL层具体硬件抽象实现。HAL:HardwareAbstractLayer硬件抽象层hardware\libhardware_legacy\gpshardware\libhardware_legacy\include\hardware_legacy\gps.hHAL层相当于一个linux应用程序接口,通过open,close等操作,操作硬件设备。Android的源代码只实现了模拟器的gps接口,具体在文件gps_qemu.c中。在2.2版本中提供了对QCOM公司的gps的实现,在以下目录:\hardware\qcom下面介绍几个重要的数据结构:1.GpsInterface接口是gps模块中最重要的数据结构,它是底层驱动实现的接口,如果要porting到自己的板子上,就需要实现这些接口。该接口的定义在gps.h中,模拟器实现在gps_qemu.c中。/**RepresentsthestandardGPSinterface.*/typedefstruct{/***Openstheinterfaceandprovidesthecallbackroutines*totheimplemenationofthisinterface.*/int(*init)(GpsCallbacks*callbacks);/**Startsnavigating.*/int(*start)(void);/**Stopsnavigating.*/int(*stop)(void);/**Closestheinterface.*/void(*cleanup)(void);/**Injectsthecurrenttime.*/int(*inject_time)(GpsUtcTimetime,int64_ttimeReference,intuncertainty);/**Injectscurrentlocationfromanotherlocationprovider*(typicallycellID).*latitudeandlongitudearemeasuredindegrees*expectedaccuracyismeasuredinmeters*/int(*inject_location)(doublelatitude,doublelongitude,floataccuracy);/***Specifiesthatthenextcalltostartwillnotusethe*informationdefinedintheflags.GPS_DELETE_ALLispassedfor*acoldstart.*/void(*delete_aiding_data)(GpsAidingDataflags);/***fix_frequencyrepresentsthetimebetweenfixesinseconds.*Setfix_frequencytozeroforasingle-shotfix.*/int(*set_position_mode)(GpsPositionModemode,intfix_frequency);/**Getapointertoextensioninformation.*/constvoid*(*get_extension)(constchar*name);}GpsInterface;2.GpsCallbacks回调函数这个是回调函数结构体,定义也在gps.h中。它们的实现是在android_location_GpsLocationProvider.cpp中,google已经实现了,我们不需要做任何动作。/**GPScallbackstructure.*/typedefstruct{gps_location_callbacklocation_cb;gps_status_callbackstatus_cb;gps_sv_status_callbacksv_status_cb;gps_nmea_callbacknmea_cb;}GpsCallbacks;/**Callbackwithlocationinformation.*/typedefvoid(*gps_location_callback)(GpsLocation*location);/**Callbackwithstatusinformation.*/typedefvoid(*gps_status_callback)(GpsStatus*status);/**CallbackwithSVstatusinformation.*/typedefvoid(*gps_sv_status_callback)(GpsSvStatus*sv_info);/**CallbackforreportingNMEAsentences.*/typedefvoid(*gps_nmea_callback)(GpsUtcTimetimestamp,constchar*nmea,intlength);3.GpsLocation表示Locatin数据信息,底层驱动获得Location的raw信息,通常是nmea码,然后通过解析就得到了location信息。/**Representsalocation.*/typedefstruct{/**ContainsGpsLocationFlagsbits.*/uint16_tflags;/**Representslatitudeindegrees.*/doublelatitude;/**Representslongitudeindegrees.*/doublelongitude;/**RepresentsaltitudeinmetersabovetheWGS84reference*ellipsoid.*/doublealtitude;/**Representsspeedinmeterspersecond.*/floatspeed;/**Representsheadingindegrees.*/floatbearing;/**Representsexpectedaccuracyinmeters.*/floataccuracy;/**Timestampforthelocationfix.*/GpsUtcTimetimestamp;}GpsLocation;AndroidGPS架构分析(一)AndroidGPS架构分析DanielWood20101222转载时请注明出处和作者文章出处:作者:DanielWood--------------------------------------------------------------------介绍完了主体代码结构以及重要的数据结构后,下面来看看gps的定位服务(LocationManager)的启动过程。我总是喜欢追本溯源地从源头去认识事物。因为“人之初,性本善”,从事物的本性去认识事物。LocationManager这项服务是在SystemServer.java中启动的,也就是系统启动之后,这个服务就已经启动了:systemServer.java[framework\base\services\java\com\android\server]在SystemServer.java的init2函数中启动了一个线程来注册Android的诸多服务,如:BluetoothService,NetworkManagementService,NotificationManager等,当然也包括LocationService。SystemServer.java[frameworks\base\services\java\com\android\server]publicstaticfinalvoidinit2(){Slog.i(TAG,EnteredtheAndroidsystemserver!);Threadthr=newServerThread();thr.setName(android.server.ServerThread);thr.start();}在ServerThread线程的run函数中LocationManager服务的代码段如下:2.1版本try{Log.i(TAG,LocationManager);ServiceManager.addService(Context.LOCATION_SERVICE,newLocationManagerService(context));}catch(Throwablee){Log.e(TAG,FailurestartingLocationManager,e);}2.2的代码中代码段如下形式:try{Slog.i(TAG,LocationManager);location=newLocationManagerService(context);ServiceManager.addService(Context.LOCATION_SERVICE,location);}catch(Throwablee){Slog.e(TAG,FailurestartingLocationManager在run函数的后半部分,是服务对系统的反馈,就是systemReady()函数。LocationManager服务的反馈函数如下:if(locationF!=null)locationF.systemReady();其中的locationF是LocationManagerService的final类型,就是一旦赋值,不能更改。finalLocationManagerServicelocationF=location;哇!locationManager这项服务的反馈机制只在2.2的代码里面才有啊。2.1中的反馈机制中并没有locationManager(当然有其他的服务反馈)。而在2.1版本中LocationManagerService的构造函数如下:LocationManagerService.java[frameworks\bas

1 / 38
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功