如果想对Android的整个框架有一个更深层次的感性认识,我们还需要抓住一个点去研究一下。Android按照模块分成很多个系统,比如Audio,Video Out,Camera,Phone,WIFI,Blue Tooth,Light,Battery,Input,Codec,3D accelerator,Vibrator,Sensor,Alarm,Gps。
分析了一下这些模块,发现GPS模块是相对简单的一个模块,比较适合拿来做初学的分析,这一期我们就来分析一下Android中GPS的工作原理,然后我们做几个和GPS相关的实验。
GPS(Global Positioning System), 即全球定位系统,它是一个由覆盖全球的24颗卫星组成的卫星系统。其目的是在全球范围内对地面和空中目标进行准确定位和监测。随着全球性空间定位信息应用的日益广泛,GPS提供的全时域、全天候、高精度定位服务将给空间技术、地球物理、大地测绘、遥感技术、交通调度、军事作战以及人们的日常生活带来巨大的变化和深远的影响。
我们手机中内置的是一个GPS信号接收机,通过接收卫星产生的测距信号确定三维位置。从设备驱动的角度来看GPS接收机,就相当于一个定时输出的UART,所以从驱动的角度来讲想对简单,可以看做一个只有输出没有输出的驱动就好了。它的输出格式为NMEA 0183。
NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association )为海用电子设备制定的标准格式。目前业已成了GPS导航设备统一的RTCM(Radio Technical Commission for Maritime services)标准协议。
NMEA-0183数据实例1如下:
$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,M,,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,19,13,28,070,17,26,23,252,,04,14,186,14*79
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092750.000,A,5321.6802,N,00630.3372,W,0.02,31.66,280511,,,A*43
$GPGGA,092751.000,5321.6802,N,00630.3371,W,1,8,1.03,61.7,M,55.3,M,,*75
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,16,13,28,070,17,26,23,252,,04,14,186,15*77
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45
驱动程序通过解析NMEA数据可以分析出当前的坐标信息,移动信息和卫星信息,然后通过Android的结构框架逐层上报,最后我们的APP就能获得当前的位置信息。
下面这张图列出了在Android系统中GPS系统是怎么实现的:
整个定位服务的架构结构共分为四层:
最上面是应用层,即 android.location 包中包含的内容,是以 Java 语言提供的 API。
第二层是框架层,这一层包含了系统服务的实现,主要由 Java 语言来实现。
第三层是共享库层,本层由 C 以及 C++ 语言实现 , 框架层与共享库层使用 JNI 进行衔接。
最下面一层是 Linux 内核层 , 整个 Android 系统都是以 Linux 内核为基础的。
从上至下它们是逐层依赖的关系,每层依赖下面一层完成其所需提供的服务。
下面就要每个层次的开始分析,这里推荐几篇大神写的文章,讲得非常详细:
和菜鸟一起学android4.0.3源码之硬件gps简单移植
http://www.cnblogs.com/LiaoHao/p/3298511.html
Android 系统中 Location Service 的实现与架构
http://www.ibm.com/developerworks/cn/opensource/os-cn-android-location/
看完上面的两篇文章后我们来总结一下,当硬件接受到位置更新之后,为了通知这个信息,整个调用关系是如何的 ( 为了描述方便,下文将 com_android_server_location_GpsLocationProvider.cpp 简称为 GpsLocationProvider.cpp)。
当硬件检测到有位置更新之后,最初调用的是 GpsLocationProvider.cpp 中的 location_callback 函数。
location_callback 函数中对应的是调用 GpsLocationProvider.java 中的 reportLocation 方法。
GpsLocationProvider.java 中的 reportLocation 方法会调用 ILocationManager 的 reportLocation 方法,然后是调用 LocationManagerService 的 reportLocation 方法。
LocationManagerService 的 reportLocation 方法中会对 LocationWorkerHandler 发送消息 MESSAGE_LOCATION_CHANGED。该消息在 LocationWorkerHandler 的 handleMessage 方法中被处理。处理方法中会调用 LocationProviderInterface 的 updateLocation 方法和 LocationManagerService 的 handleLocationChangedLocked 的方法。前者对于 Gps 模块来说就是调用 GpsLocationProvider 的 updateLocation 方法。
GpsLocationProvider 的 updateLocation 方法会对 ProviderHandler 发送消息 UPDATE_LOCATION,该消息在 ProviderHandler 的 handler 方法中被处理,处理的方法是调用 handleUpdateLocation 方法,该方法中会调用 native_inject_location 方法以注入。
而 LocationManagerService 的 handleLocationChangedLocked 的方法会将最新的位置存放到 mLastKnownLocation 中。至此,便可以通过 LocationManagerService 的 getLastKnownLocation 方法获取到最新更新的位置信息了。
定位服务实现中牵涉到的文件一览
路径 说明
frameworks/base/location/java/android 包含提供给应用开发的 API
frameworks/base/services/java/com/android/server 包含 LocationManagerService.java
frameworks/base/core/java/android/os 包含 ServiceManager.java
frameworks/base/core/java/android/app 包含 ContextImpl.java
system/core/rootdir 包含 init.rc
frameworks/base/services/java/com/android/server/location 包含 LocationManagerService.java
frameworks/base/services/jni 包含 com_android_server_location_GpsLocationProvider.cpp
hardware/libhardware/include/hardware 包含了 HAL 层的接口
hardware/qcom/gps 包含了对于高通公司的 Gps 模块的实现

第十八期 Android GPS原理分析《手机就是开发板》相关推荐

  1. ZYNQ7000学习(十八)多路 PWM 原理分析以及实现试验

    多路 PWM 原理分析以及实现试验 基本原理(参考 http͗//www͘fpga4fun͘com/PWM_D_C͘html) PWM_(Pulse_Width_Modulation) A PWM t ...

  2. CSDN 编程竞赛十八期题解

    竞赛总览 CSDN 编程竞赛十八期:比赛详情 (csdn.net) 感觉这次竞赛的题目有点偏数学了,尤其是第三道题,输入+输出就完事了,答案是一个数学公式. 竞赛题解 题目1.单链表排序 单链表的节点 ...

  3. FME模板兴趣班第十八期(面遮挡处理) 任务小结

    班长欣欣 一.题目说明 对面进行遮挡处理,处理要求如下: 多个面之间存在压盖,要求压盖区域用Level高的遮挡Level低的,并将压盖区域从Level低的面中擦除.如下图所示: 面1.面2.面3 的L ...

  4. Android LayoutInflater原理分析,带你一步步深入了解View

    Android视图绘制流程完全解析,带你一步步深入了解View(一) 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12921889 ...

  5. 发布 项目_第十八期科创基金项目发布会圆满结束

    第十八期科创基金项目发布会圆满结束 贺电!贺电! 电子信息工程学院发来贺电:第十八届科创基金项目发布会圆满结束啦!感谢导师们的支持.现场同学的热情参与和科协朋友后勤服务! NUAA 即使是寒冷的冬天也 ...

  6. android 实例源码解释,Android Handler 原理分析及实例代码

    Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler的原理 Handler使 ...

  7. 鲁大师电动车智能化测评报告第十八期:加量降价,九号完成产品破圈?

    鲁大师第十八期智能化电动车测评排行榜数据来源于鲁大师智慧实验室,测评的车型均为市面上主流品牌的主流车型.截止目前,鲁大师智能化电动车测评的车型高达90余种,且还在不断增加和丰富中. 1. 测评依据 鲁 ...

  8. CSDN 编程竞赛二十八期题解

    竞赛总览 CSDN 编程竞赛二十八期:比赛详情 (csdn.net) 本期竞赛的题目都很简单,但是非常考验读题和编码速度.这一次没有遇到bug,竞赛体验较好. 竞赛题解 题目1.小Q的鲜榨柠檬汁 团建 ...

  9. COS访谈第十八期:陈天奇

    COS访谈第十八期:陈天奇 [COS编辑部按] 受访者:陈天奇      采访者:何通   编辑:王小宁 简介:陈天奇,华盛顿大学计算机系博士生,研究方向为大规模机器学习.他曾获得KDD CUP 20 ...

最新文章

  1. 【全网之最】全网最简洁判断JavaScript中字符串是否以某一个特定字符串结尾的方法,多用于判断文件名的后缀(格式)
  2. ThreadLocal使用
  3. 运维常说的 5个9、4个9、3个9 的可靠性,到底是什么???
  4. Android中Http网络请求库框架Volley和Asnyc-http的使用---第三方库学习笔记(一)
  5. linux进程间的通信(C): 共享内存
  6. TCP/IP是如何实现可靠传输的
  7. 放弃用你的InnerHTML来输出HTML吧,jQuery Tmpl不详细讲解
  8. 【技巧】LeetCode 86. Partition List
  9. excel两列数据对比找不同_莫斯科地标百年前后对比图,快来“找不同”
  10. 微信公众号开发,移动端开发遇到的问题及其他技巧
  11. 小度计算机笔记,“一场无速记发布会”,小度真无线智能耳机革新语音笔记功能...
  12. sql存储过程完全教程
  13. arduino运行max6675 K型热电偶模块
  14. SAP Tax Service可以取代TAXBRA / RVABRA吗?(翻译) 跨国贸易云税务解决方案
  15. 【蓝桥杯——单片机学习笔记】五.数码管显示(STC15F2K60S2)
  16. 2020美容师(初级)考试及美容师(初级)证考试
  17. 虚幻竞技场中的控制台命令
  18. 从简单数字 看 联想收购IBM PC事业部
  19. 使用pinyin4j解决中文转换为拼音的问题
  20. python:实现巴特沃斯过滤器算法(附完整源码)

热门文章

  1. fwr171改无线服务器,迅捷(Fast)FWR171无线路由模式设置
  2. android ios 音频寻,多媒体-iOS与Android的音频文件互通
  3. 国际标准智商测试题 (转载)
  4. 景驰无人驾驶 1024 编程邀请赛 A. 热爱工作的蒜蒜(类似DP的最短路)
  5. JavaScript addEventListener()事件监听方法
  6. vue中写video中的视频播放按钮没有反映
  7. 在Abp 使用 阿里云的oss
  8. RA-CNN细粒度分类网络
  9. vb2008 获取u盘id_爱思助手+U盘,实现越狱
  10. 谷歌浏览器查看HTTP请求头与响应头