最近在搞Android上的GPS的东西, 老是上下不通,没有数据,调试中.因此仔细的分析了 从上到下的代码.灵魂函数是
requestLocationUpdates函数,主要是用来启动一个监视器,去监听位置变化信息
废话不多说开始分析
1. 首先找到requestLocationUpdates函数的位置
/Android_work_path/frameworks/base/location/java/android/location/LocationManager.java
这个函数就是判断一下参数provider是否为空,不为空就去call 那个核心函数,很简单没难度
继续在该函数中查找
这个时候的代码 会分开 一部分触发listener 还有一部分会去做Provider的动作(GPSLocation)
先讲GPS_PROVIDER动作
主要函数在/location/java/com/android/internal/location/GpsLocationProvider.java
启动一个线程序
新建一个ProviderHandle的东西
如果你是第一次启动初始化就是ENABLE
如果启动设备进行数据探测什么的就是ENABLE_TRACKING
下面根据ENABLE_TRACKING为例:
会去执行handleEnableLocationTracking函数
StarNavigating()函数是重点,再继续跟踪
native_start是在JNI层的.cpp文件实现的 我们现在去查看这个CPP文件
frameworks/base/core/jni/android_location_GpsLocationProivider.cpp
这里做了两个动作:1个是set_position_mode 2是start
sGpsInterface这个结构体原型是GpsInterface这个结构体来自
/android_work/hardware/libhardware_legacy/gps/XXX_gps.c中 具体定义了些操作,这层也就是我们通长所说的硬件抽象层HAL
可以看到gps_set_position_mode和gps_start这几个函数
而在这几个函数 中 会去调用芯片产商写的驱动的.so的函数
具体的比如 某产商叫做YYY那么他就可以在XXX_gps.c文件中先导入.so,然后使用自己的函数去操作硬件
PS:妈的 现在.so只公开部分源码, .a文件不公开 我草他吗的煞笔厂商 偏偏调到它那就出错,LSM(location session manager)挂掉了,还不给代码,让我搞毛啊.wating for ...