Android4.4 GPS框架分析【转】

本文转载自:http://blog.csdn.net/junzhang1122/article/details/46674569

  1 GPS HAL层代码在目录trunk/Android/hardware/xxx/gps/skytraqskytraq_gsp.c,向下与硬件驱动通讯,向上提供接口  
  2 GPS JNI层层代码在目录trunk/Android/frameworks/base/services/jni/com_android_server_location_GpsLocationProvider.cpp  C与java转换,给java层提供接口  
  3 GPS framework层代码目录Android/frameworks/base/services/java/com/android/server下,主要文件是location服务对内部的封装并提供provider服务  
  4 Android/frameworks/base/location/java/com/android/internal/location这个是framework对location服务内部的实现  
  5   
  6 启动GPS服务代码流程如下  
  7 public static void main(String[] args)  
  8     -->ServerThread thr = new ServerThread();  
  9         -->location = new LocationManagerService(context);   
 10         -->ServiceManager.addService(Context.LOCATION_SERVICE, location);  
 11         -->locationF.systemRunning()  
 12             -->systemRunning()  
 13                 -->loadProvidersLocked();  
 14                     -->GpsLocationProvider gpsProvider = new GpsLocationProvider(mContext, this, mLocationHandler.getLooper());  
 15                         -->class_init_native();  
 16                             -->android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz)   
 17                                 -->err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device);  
 18                                     -->pen_gps(const struct hw_module_t *module, char const *name, struct hw_device_t **device)  
 19                                 -->sGpsInterface = gps_device->get_gps_interface(gps_device);  
 20                                     -->const GpsInterface *gps__get_gps_interface(struct gps_device_t *dev)  
 21                                         -->return &skytraqGpsInterface;  
 22                     -->GpsLocationProvider.isSupported()  
 23                         -->native_is_supported()  
 24                             -->android_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz)  
 25                                 -->return (sGpsInterface != NULL);  
 26                 -->updateProvidersLocked  
 27                     -->  updateProviderListenersLocked  
 28                         -->  applyRequirementsLocked(provider);  
 29                                 --> p.setRequest(providerRequest, worksource);  
 30                                     -->  public void setRequest(ProviderRequest request, WorkSource source)   
 31                                     --> sendMessage(SET_REQUEST, 0, new GpsRequest(request, source));  
 32                                         -->public void handleMessage(Message msg)  
 33                                             -->handleSetRequest(gpsRequest.request, gpsRequest.source);  
 34                                                 -->startNavigating(singleShot);  
 35                                                     -->native_set_position_mode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC,interval, 0, 0)  
 36                                                     -->native_start()  
 37   
 38 Android系统运行的第一个进程就是init进程,在该进程中创建的第一个虚拟机就是zygote,zygote孵化的第一个虚拟机就是Dalvik,该进程就是SystemServer,  
 39 对于的SystemServer代码是frameworkbaseservicesjavacomandroidserverSystemServer.java  
 40 该SystemServer对于的第一个运行函数就是main  
 41   
 42 public static void main(String[] args) //SystemServer运行的第一个函数  
 43     ServerThread thr = new ServerThread(); //初始化一个server线程   
 44         class ServerThread   
 45         {  
 46              public void initAndLoop()   
 47              {  
 48                    if (!disableLocation) //开始的时候这里的 disableLocation = false  
 49                    {   
 50              try{  
 51                      Slog.i(TAG, "Location Manager");  
 52  <1>                 location = new LocationManagerService(context); //实例化一个LocationManagerService服务,该服务主要用来管理GPS地理位置的变化  
 53                      ServiceManager.addService(Context.LOCATION_SERVICE, location); //将这个service添加到SystemManager中  
 54              }   
 55              catch (Throwable e)   
 56              {  
 57                 reportWtf("starting Location Manager", e);  
 58              }  
 59   
 60              try {  
 61                     Slog.i(TAG, "Country Detector");  
 62                     countryDetector = new CountryDetectorService(context);//实例化一个CountryDetectorService服务,用来探测不同国家,也就是不同地区和时区   
 63                     ServiceManager.addService(Context.COUNTRY_DETECTOR, countryDetector);  
 64              } catch (Throwable e) {  
 65                     reportWtf("starting Country Detector", e);  
 66              }  
 67           }  
 68             
 69         ActivityManagerService.self().systemReady(new Runnable()   
 70         {  
 71             public void run()   
 72             {  
 73                 try   
 74                 {  
 75 <2>             if (locationF != null) locationF.systemRunning();//在<1>的位置已给locationF赋值,在这里调用LocationManagerService的systemRunning()函数  
 76             }   
 77             catch(Throwable e)   
 78             {  
 79                reportWtf("Notifying Location Service running", e);  
 80             }  
 81             }  
 82         }  
 83                
 84             }     
 85         }  
 86   
 87 接下来分析LocationManagerService(context)  
 88 /**frameworkaseservicesjavacomandroidserverLocationManagerService.java**/  
 89 public class LocationManagerService extends ILocationManager.Stub  
 90 {  
 91     public void systemRunning() //该函数有<2>处调用  
 92     {  
 93         synchronized (mLock)  
 94         {  
 95         /*GPS启动到运行及监听都在这两个函数里*/  
 96 <3>           loadProvidersLocked(); //在这里加载各种provider  
 97 <4>           updateProvidersLocked(); //加载后更新  
 98         }     
 99     }  
100 }  
101   
102 /**frameworkaseservicesjavacomandroidserverLocationManagerService.java**/  
103 private void loadProvidersLocked()  
104 {  
105  // create a passive location provider, which is always enabled  
106     PassiveProvider passiveProvider = new PassiveProvider(this);  
107     addProviderLocked(passiveProvider);  
108     mEnabledProviders.add(passiveProvider.getName());  
109     mPassiveProvider = passiveProvider;  
110     // Create a gps location provider  
111 <5> GpsLocationProvider gpsProvider = new GpsLocationProvider(mContext, this,  
112             mLocationHandler.getLooper());  
113   
114 <6> if (GpsLocationProvider.isSupported()) //这里调用JNI的函数接口   
115     {  
116         mGpsStatusProvider = gpsProvider.getGpsStatusProvider(); //获取gps状态provider  
117         mNetInitiatedListener = gpsProvider.getNetInitiatedListener(); //初始网络监听   
118         addProviderLocked(gpsProvider); //将gpsProvider添加到mProviders中  
119         mRealProviders.put(LocationManager.GPS_PROVIDER, gpsProvider);  
120     }     
121 }  
122   
123 /**分析  <5>  ***/  
124 public class GpsLocationProvider implements LocationProviderInterface   
125 {  
126     static { class_init_native(); } //在这里调用JNI的android_location_GpsLocationProvider_class_init_native函数  
127 }  
128   
129 static void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz)   
130 {  
131     err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device);//打开GPS设备文件,对应trunk/Android/hardware/xxx/gps/skytraq/skytraq_gps.c  
132                 -->static int open_gps(const struct hw_module_t *module, char const *name, struct hw_device_t **device)  
133                   
134     //获取gpsInterface接口,该函数接口在trunk/Android/hardware/xxx/gps/skytraq/skytraq_gps.c中,对应的函数是gps__get_gps_interface  
135     sGpsInterface = gps_device->get_gps_interface(gps_device);  
136 }  
137   
138 const GpsInterface *gps__get_gps_interface(struct gps_device_t *dev)  
139 {  
140     return &skytraqGpsInterface;  
141 }  
142   
143 /**分析 <6>  **/  
144 public static boolean GpsLocationProvider.isSupported()  
145 {  
146     return native_is_supported(); //该函数对应JNI的函数如下  
147 }  
148   
149 static jboolean android_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz)   
150 {  
151     return (sGpsInterface != NULL);  
152 }  
153 GpsLocationProvider.isSupported()返回true,所以会走if{}里面的。在网上查阅资料,都是基于2.3的系统,2.3的系统里是直接在isSupported()函数里来获取接口,没有在GpsLocationProvider类中实现调用class_init_native()来获取接口  
154   
155 /**分析 <4> **/  
156 /**frameworkaseservicesjavacomandroidserverLocationManagerService.java**/  
157 private void updateProvidersLocked()   
158 {  
159     for (int i = mProviders.size() - 1; i >= 0; i--)  
160     {  
161         boolean isEnabled = p.isEnabled(); //开始的时候返回false  
162         boolean shouldBeEnabled = isAllowedByCurrentUserSettingsLocked(name); //在loadProvidersLocked()函数就说了,一直是enabled  
163         所以会走else  
164         else if (!isEnabled && shouldBeEnabled)  
165          {  
166 <7>      updateProviderListenersLocked(name, true, mCurrentUserId);  
167          changesMade = true;  
168      }  
169     }  
170     /*发送广播,app和framework都可以接受该广播*/  
171     if (changesMade) {  
172             mContext.sendBroadcastAsUser(new Intent(LocationManager.PROVIDERS_CHANGED_ACTION),  
173                     UserHandle.ALL);  
174             mContext.sendBroadcastAsUser(new Intent(LocationManager.MODE_CHANGED_ACTION),  
175                     UserHandle.ALL);  
176   }  
177 }  
178   
179 /**分析 <7>   frameworkaseservicesjavacomandroidserverlocationManagerService.java **/  
180 private void updateProviderListenersLocked(String provider, boolean enabled, int userId)   
181 {  
182     if (records != null)  
183     {  
184         //这里主要是从UserHandle里解析UserId 是否等于 mCurrentUserId,如果是则发送notification给receiver    
185     }   
186     if (enabled) //这里的 enabled == true  
187     {  
188 <8>  p.enable();  
189      if (listeners > 0)   
190      {  
191 <9>       applyRequirementsLocked(provider);  
192      }  
193   }  
194      else   
195      {  
196      p.disable();  
197    }  
198      
199 }  
200   
201 /**分析 <8>   frameworkaseservicesjavacomandroidserverlocationgpsLocationProvider.java**/  
202 public void enable()   
203 {  
204     synchronized (mLock)   
205     {  
206     if (mEnabled) return;//开始的时候这里是false  
207     mEnabled = true;       
208     }  
209 <10>  sendMessage(ENABLE, 1, null);//发送消息  
210 }  
211 /**分析  <10>     baseservicesjavacomandroidserverlocationgpsLocationProvider.java**/  
212 private void sendMessage(int message, int arg, Object obj)   
213 {  
214         // hold a wake lock until this message is delivered  
215         // note that this assumes the message will not be removed from the queue before  
216         // it is handled (otherwise the wake lock would be leaked).  
217         mWakeLock.acquire();  
218 <11>    mHandler.obtainMessage(message, arg, 1, obj).sendToTarget(); //通过handler机制来发送消息  
219 }  
220   
221 /**分析  <11>     baseservicesjavacomandroidserverlocationgpsLocationProvider.java**/  
222 private final class ProviderHandler extends Handler   
223 {  
224     public void handleMessage(Message msg)   
225     {  
226         switch (message)   
227         {  
228         case ENABLE:  //有<10>可知,message == ENABLE , msg.arg1 == 1  
229         if (msg.arg1 == 1) {     
230 <12>        handleEnable(); //所以会调用这个函数  
231         } else {  
232             handleDisable();  
233         }  
234         break;  
235     .....  
236     }  
237     }  
238 }  
239   
240 /**分析  <12>     frameworkaseservicesjavacomandroidserverlocationgpsLocationProvider.java**/  
241 private void handleEnable()   
242 {  
243 <13>  boolean enabled = native_init(); //调用JNI中的 static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)  
244   if (enabled)   
245   {  
246       mSupportsXtra = native_supports_xtra(); //native_supports_xtra()直接返回true,在class_init_native()已经赋值  
247   
248       if (mSuplServerHost != null)   
249       {  
250         /*这里没做任何事,因为sAGpsInterface为空,代码流程如下*/  
251           native_set_agps_server(AGPS_TYPE_SUPL, mSuplServerHost, mSuplServerPort);  
252             -->static void android_location_GpsLocationProvider_set_agps_server(JNIEnv* env, jobject obj, jint type, jstring hostname, jint port)  
253                 -->if (!sAGpsInterface) return;  
254             -->sAGpsInterface = (const AGpsInterface*)sGpsInterface->get_extension(AGPS_INTERFACE);  
255                 -->static const void *skytraq_gps_get_extension(const char* name)  
256                                 {  
257                                 ALOGD("%s: called", __FUNCTION__);  
258                                 return NULL;  
259                                 }  
260                   
261       }  
262       if (mC2KServerHost != null) { //同理这里也直接返回了  
263           native_set_agps_server(AGPS_TYPE_C2K, mC2KServerHost, mC2KServerPort);  
264       }  
265   }else{  
266       synchronized (mLock) {  
267           mEnabled = false;  
268       }  
269       Log.w(TAG, "Failed to enable location provider");  
270   }  
271       
272 }  
273   
274 /**分析  <13>  frameworkaseservicesjnicom_android_server_location_GpsLocationProvider.cpp **/  
275 static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)  
276 {  
277 <14>  if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0)//sGpsInterface不为null,在一开始的就已赋值,所以会调用init函数  
278             return false;  
279             .....  
280 }  
281   
282 /**分析  <14>   hardwarexxxgpsskytraqSkytraq_gps.c **/  
283 static int skytraq_gps_init(GpsCallbacks* callbacks) //callbacks回调函数时有JNI传下来的,在JNI中实现的  
284 {  
285     GpsState*  s = &_gps_state; //该结构图数组初始化的时候都为0  
286     if (!s->init)  
287 <15>      gps_state_init(s, callbacks);  
288 }  
289   
290 /**分析  <15>   hardwarexxxgpsskytraqSkytraq_gps.c **/  
291 static void gps_state_init( GpsState*  state, GpsCallbacks* callbacks )  
292 {  
293     state->fd = gps_channel_open(GPS_CHANNEL_NAME);  
294             --> fd = open("/dev/skytraq_gps_ipc", O_RDWR |  O_SYNC); //打开串口  
295     int ret = ioctl(state->fd, GPS_IPC_SET, &gps_connect_info); //调用驱动函数ioctl设置gps  
296     state->thread = callbacks->create_thread_cb( "gps_state_thread", gps_state_thread, state );//创建线程,用来监听发送的命令和监听数据上报,  
297 }  
298   
299   
300 /**分析<9> frwmeworkaseservicesjavacomandroidserverLocationManagerService.java 
301 private void applyRequirementsLocked(String provider) 
302 { 
303     //设置worksource和providerRequest 
304     ..... 
305 <16>  p.setRequest(providerRequest, worksource); //location provider 发送请求 
306 } 
307   
308  
309 /**分析<16> frwmeworkaseservicesjavacomandroidserverlocationGpsLocationProvider.java**/  
310 public void setRequest(ProviderRequest request, WorkSource source)   
311 {  
312 <17>   sendMessage(SET_REQUEST, 0, new GpsRequest(request, source)); //发送消息,SET_REQUEST == 3  
313 }  
314   
315 /**分析<17> frwmeworkaseservicesjavacomandroidserverlocationGpsLocationProvider.java**/  
316 public void handleMessage(Message msg)  
317 {  
318     ...  
319     case SET_REQUEST:  
320        GpsRequest gpsRequest = (GpsRequest) msg.obj;  
321 <18>   handleSetRequest(gpsRequest.request, gpsRequest.source);  
322        break;  
323 }  
324   
325 /**分析<18> frwmeworkaseservicesjavacomandroidserverlocationGpsLocationProvider.java**/  
326 private void handleSetRequest(ProviderRequest request, WorkSource source)   
327 {  
328     ...  
329 <19>  startNavigating(singleShot);//开始导航  
330 }  
331   
332 /**分析<19> frwmeworkaseservicesjavacomandroidserverlocationGpsLocationProvider.java**/  
333 private void startNavigating(boolean singleShot)  
334 {  
335 <20>  native_set_position_mode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC, interval, 0, 0)//该函数在HAL层直接返回了,没做任何事  
336 <21>  native_start()  
337 }   
338   
339 /**分析<20> frameworkaseservicesjnicom_android_server_location_GpsLocationProvider.cpp**/  
340 static jboolean android_location_GpsLocationProvider_set_position_mode(JNIEnv* env, jobject obj,  
341         jint mode, jint recurrence, jint min_interval, jint preferred_accuracy, jint preferred_time)  
342 {  
343     if (sGpsInterface)  
344 <22>        return (sGpsInterface->set_position_mode(mode, recurrence, min_interval, preferred_accuracy,   
345                 preferred_time) == 0); //调用HAL层接口  
346 }  
347   
348 /**分析<22> xxxgpsskytraqskytraq.gps.c**/  
349 static int skytraq_gps_set_position_mode(GpsPositionMode mode,  
350                                       GpsPositionRecurrence recurrence,  
351                                       uint32_t min_interval,  
352                                       uint32_t preferred_accuracy,  
353                                       uint32_t preferred_time)  
354 {  
355     ALOGD("%s: called", __FUNCTION__);  
356     return 0;  
357 }  
358 /**分析<21> frameworkaseservicesjnicom_android_server_location_GpsLocationProvider.cpp**/  
359 static jboolean android_location_GpsLocationProvider_start(JNIEnv* env, jobject obj)  
360 {  
361     if (sGpsInterface)  
362 <23>      return (sGpsInterface->start() == 0); //调用HAL 层的static int skytraq_gps_start()  
363 }  
364   
365 /**分析<23> xxxgpsskytraqskytraq.gps.c**/  
366 static int skytraq_gps_start()  
367 {  
368     gps_state_start(s);  
369         -->s->status = CMD_START;   
370   /*在<15>线程函数gps_state_thread()中while(1)中等该命令,进入获取数据*/  
371 }  
372 此时GPS就已运行  
  1. GPS HAL层代码在目录trunk/Android/hardware/xxx/gps/skytraqskytraq_gsp.c,向下与硬件驱动通讯,向上提供接口  
  2. GPS JNI层层代码在目录trunk/Android/frameworks/base/services/jni/com_android_server_location_GpsLocationProvider.cpp  C与java转换,给java层提供接口  
  3. GPS framework层代码目录Android/frameworks/base/services/java/com/android/server下,主要文件是location服务对内部的封装并提供provider服务  
  4. Android/frameworks/base/location/java/com/android/internal/location这个是framework对location服务内部的实现  
  5.   
  6. 启动GPS服务代码流程如下  
  7. public static void main(String[] args)  
  8.     -->ServerThread thr = new ServerThread();  
  9.         -->location = new LocationManagerService(context);   
  10.         -->ServiceManager.addService(Context.LOCATION_SERVICE, location);  
  11.         -->locationF.systemRunning()  
  12.             -->systemRunning()  
  13.                 -->loadProvidersLocked();  
  14.                     -->GpsLocationProvider gpsProvider = new GpsLocationProvider(mContext, this, mLocationHandler.getLooper());  
  15.                         -->class_init_native();  
  16.                             -->android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz)   
  17.                                 -->err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device);  
  18.                                     -->pen_gps(const struct hw_module_t *module, char const *name, struct hw_device_t **device)  
  19.                                 -->sGpsInterface = gps_device->get_gps_interface(gps_device);  
  20.                                     -->const GpsInterface *gps__get_gps_interface(struct gps_device_t *dev)  
  21.                                         -->return &skytraqGpsInterface;  
  22.                     -->GpsLocationProvider.isSupported()  
  23.                         -->native_is_supported()  
  24.                             -->android_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz)  
  25.                                 -->return (sGpsInterface != NULL);  
  26.                 -->updateProvidersLocked  
  27.                     -->  updateProviderListenersLocked  
  28.                         -->  applyRequirementsLocked(provider);  
  29.                                 --> p.setRequest(providerRequest, worksource);  
  30.                                     -->  public void setRequest(ProviderRequest request, WorkSource source)   
  31.                                     --> sendMessage(SET_REQUEST, 0, new GpsRequest(request, source));  
  32.                                         -->public void handleMessage(Message msg)  
  33.                                             -->handleSetRequest(gpsRequest.request, gpsRequest.source);  
  34.                                                 -->startNavigating(singleShot);  
  35.                                                     -->native_set_position_mode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC,interval, 0, 0)  
  36.                                                     -->native_start()  
  37.   
  38. Android系统运行的第一个进程就是init进程,在该进程中创建的第一个虚拟机就是zygote,zygote孵化的第一个虚拟机就是Dalvik,该进程就是SystemServer,  
  39. 对于的SystemServer代码是frameworkaseservicesjavacomandroidserverSystemServer.java  
  40. 该SystemServer对于的第一个运行函数就是main  
  41.   
  42. public static void main(String[] args) //SystemServer运行的第一个函数  
  43.     ServerThread thr = new ServerThread(); //初始化一个server线程   
  44.         class ServerThread   
  45.         {  
  46.              public void initAndLoop()   
  47.              {  
  48.                    if (!disableLocation) //开始的时候这里的 disableLocation = false  
  49.                    {   
  50.              try{  
  51.                      Slog.i(TAG, "Location Manager");  
  52.  <1>                 location = new LocationManagerService(context); //实例化一个LocationManagerService服务,该服务主要用来管理GPS地理位置的变化  
  53.                      ServiceManager.addService(Context.LOCATION_SERVICE, location); //将这个service添加到SystemManager中  
  54.              }   
  55.              catch (Throwable e)   
  56.              {  
  57.                 reportWtf("starting Location Manager", e);  
  58.              }  
  59.   
  60.              try {  
  61.                     Slog.i(TAG, "Country Detector");  
  62.                     countryDetector = new CountryDetectorService(context);//实例化一个CountryDetectorService服务,用来探测不同国家,也就是不同地区和时区   
  63.                     ServiceManager.addService(Context.COUNTRY_DETECTOR, countryDetector);  
  64.              } catch (Throwable e) {  
  65.                     reportWtf("starting Country Detector", e);  
  66.              }  
  67.           }  
  68.             
  69.         ActivityManagerService.self().systemReady(new Runnable()   
  70.         {  
  71.             public void run()   
  72.             {  
  73.                 try   
  74.                 {  
  75. <2>             if (locationF != null) locationF.systemRunning();//在<1>的位置已给locationF赋值,在这里调用LocationManagerService的systemRunning()函数  
  76.             }   
  77.             catch(Throwable e)   
  78.             {  
  79.                reportWtf("Notifying Location Service running", e);  
  80.             }  
  81.             }  
  82.         }  
  83.                
  84.             }     
  85.         }  
  86.   
  87. 接下来分析LocationManagerService(context)  
  88. /**frameworkaseservicesjavacomandroidserverLocationManagerService.java**/  
  89. public class LocationManagerService extends ILocationManager.Stub  
  90. {  
  91.     public void systemRunning() //该函数有<2>处调用  
  92.     {  
  93.         synchronized (mLock)  
  94.         {  
  95.         /*GPS启动到运行及监听都在这两个函数里*/  
  96. <3>           loadProvidersLocked(); //在这里加载各种provider  
  97. <4>           updateProvidersLocked(); //加载后更新  
  98.         }     
  99.     }  
  100. }  
  101.   
  102. /**frameworkaseservicesjavacomandroidserverLocationManagerService.java**/  
  103. private void loadProvidersLocked()  
  104. {  
  105.  // create a passive location provider, which is always enabled  
  106.     PassiveProvider passiveProvider = new PassiveProvider(this);  
  107.     addProviderLocked(passiveProvider);  
  108.     mEnabledProviders.add(passiveProvider.getName());  
  109.     mPassiveProvider = passiveProvider;  
  110.     // Create a gps location provider  
  111. <5> GpsLocationProvider gpsProvider = new GpsLocationProvider(mContext, this,  
  112.             mLocationHandler.getLooper());  
  113.   
  114. <6> if (GpsLocationProvider.isSupported()) //这里调用JNI的函数接口   
  115.     {  
  116.         mGpsStatusProvider = gpsProvider.getGpsStatusProvider(); //获取gps状态provider  
  117.         mNetInitiatedListener = gpsProvider.getNetInitiatedListener(); //初始网络监听   
  118.         addProviderLocked(gpsProvider); //将gpsProvider添加到mProviders中  
  119.         mRealProviders.put(LocationManager.GPS_PROVIDER, gpsProvider);  
  120.     }     
  121. }  
  122.   
  123. /**分析  <5>  ***/  
  124. public class GpsLocationProvider implements LocationProviderInterface   
  125. {  
  126.     static { class_init_native(); } //在这里调用JNI的android_location_GpsLocationProvider_class_init_native函数  
  127. }  
  128.   
  129. static void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz)   
  130. {  
  131.     err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device);//打开GPS设备文件,对应trunk/Android/hardware/xxx/gps/skytraq/skytraq_gps.c  
  132.                 -->static int open_gps(const struct hw_module_t *module, char const *name, struct hw_device_t **device)  
  133.                   
  134.     //获取gpsInterface接口,该函数接口在trunk/Android/hardware/xxx/gps/skytraq/skytraq_gps.c中,对应的函数是gps__get_gps_interface  
  135.     sGpsInterface = gps_device->get_gps_interface(gps_device);  
  136. }  
  137.   
  138. const GpsInterface *gps__get_gps_interface(struct gps_device_t *dev)  
  139. {  
  140.     return &skytraqGpsInterface;  
  141. }  
  142.   
  143. /**分析 <6>  **/  
  144. public static boolean GpsLocationProvider.isSupported()  
  145. {  
  146.     return native_is_supported(); //该函数对应JNI的函数如下  
  147. }  
  148.   
  149. static jboolean android_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz)   
  150. {  
  151.     return (sGpsInterface != NULL);  
  152. }  
  153. GpsLocationProvider.isSupported()返回true,所以会走if{}里面的。在网上查阅资料,都是基于2.3的系统,2.3的系统里是直接在isSupported()函数里来获取接口,没有在GpsLocationProvider类中实现调用class_init_native()来获取接口  
  154.   
  155. /**分析 <4> **/  
  156. /**frameworkaseservicesjavacomandroidserverLocationManagerService.java**/  
  157. private void updateProvidersLocked()   
  158. {  
  159.     for (int i = mProviders.size() - 1; i >= 0; i--)  
  160.     {  
  161.         boolean isEnabled = p.isEnabled(); //开始的时候返回false  
  162.         boolean shouldBeEnabled = isAllowedByCurrentUserSettingsLocked(name); //在loadProvidersLocked()函数就说了,一直是enabled  
  163.         所以会走else  
  164.         else if (!isEnabled && shouldBeEnabled)  
  165.          {  
  166. <7>      updateProviderListenersLocked(name, true, mCurrentUserId);  
  167.          changesMade = true;  
  168.      }  
  169.     }  
  170.     /*发送广播,app和framework都可以接受该广播*/  
  171.     if (changesMade) {  
  172.             mContext.sendBroadcastAsUser(new Intent(LocationManager.PROVIDERS_CHANGED_ACTION),  
  173.                     UserHandle.ALL);  
  174.             mContext.sendBroadcastAsUser(new Intent(LocationManager.MODE_CHANGED_ACTION),  
  175.                     UserHandle.ALL);  
  176.   }  
  177. }  
  178.   
  179. /**分析 <7>   frameworkaseservicesjavacomandroidserverlocationManagerService.java **/  
  180. private void updateProviderListenersLocked(String provider, boolean enabled, int userId)   
  181. {  
  182.     if (records != null)  
  183.     {  
  184.         //这里主要是从UserHandle里解析UserId 是否等于 mCurrentUserId,如果是则发送notification给receiver    
  185.     }   
  186.     if (enabled) //这里的 enabled == true  
  187.     {  
  188. <8>  p.enable();  
  189.      if (listeners > 0)   
  190.      {  
  191. <9>       applyRequirementsLocked(provider);  
  192.      }  
  193.   }  
  194.      else   
  195.      {  
  196.      p.disable();  
  197.    }  
  198.      
  199. }  
  200.   
  201. /**分析 <8>   frameworkaseservicesjavacomandroidserverlocationgpsLocationProvider.java**/  
  202. public void enable()   
  203. {  
  204.     synchronized (mLock)   
  205.     {  
  206.     if (mEnabled) return;//开始的时候这里是false  
  207.     mEnabled = true;       
  208.     }  
  209. <10>  sendMessage(ENABLE, 1, null);//发送消息  
  210. }  
  211. /**分析  <10>     baseservicesjavacomandroidserverlocationgpsLocationProvider.java**/  
  212. private void sendMessage(int message, int arg, Object obj)   
  213. {  
  214.         // hold a wake lock until this message is delivered  
  215.         // note that this assumes the message will not be removed from the queue before  
  216.         // it is handled (otherwise the wake lock would be leaked).  
  217.         mWakeLock.acquire();  
  218. <11>    mHandler.obtainMessage(message, arg, 1, obj).sendToTarget(); //通过handler机制来发送消息  
  219. }  
  220.   
  221. /**分析  <11>     baseservicesjavacomandroidserverlocationgpsLocationProvider.java**/  
  222. private final class ProviderHandler extends Handler   
  223. {  
  224.     public void handleMessage(Message msg)   
  225.     {  
  226.         switch (message)   
  227.         {  
  228.         case ENABLE:  //有<10>可知,message == ENABLE , msg.arg1 == 1  
  229.         if (msg.arg1 == 1) {     
  230. <12>        handleEnable(); //所以会调用这个函数  
  231.         } else {  
  232.             handleDisable();  
  233.         }  
  234.         break;  
  235.     .....  
  236.     }  
  237.     }  
  238. }  
  239.   
  240. /**分析  <12>     frameworkaseservicesjavacomandroidserverlocationgpsLocationProvider.java**/  
  241. private void handleEnable()   
  242. {  
  243. <13>  boolean enabled = native_init(); //调用JNI中的 static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)  
  244.   if (enabled)   
  245.   {  
  246.       mSupportsXtra = native_supports_xtra(); //native_supports_xtra()直接返回true,在class_init_native()已经赋值  
  247.   
  248.       if (mSuplServerHost != null)   
  249.       {  
  250.         /*这里没做任何事,因为sAGpsInterface为空,代码流程如下*/  
  251.           native_set_agps_server(AGPS_TYPE_SUPL, mSuplServerHost, mSuplServerPort);  
  252.             -->static void android_location_GpsLocationProvider_set_agps_server(JNIEnv* env, jobject obj, jint type, jstring hostname, jint port)  
  253.                 -->if (!sAGpsInterface) return;  
  254.             -->sAGpsInterface = (const AGpsInterface*)sGpsInterface->get_extension(AGPS_INTERFACE);  
  255.                 -->static const void *skytraq_gps_get_extension(const char* name)  
  256.                                 {  
  257.                                 ALOGD("%s: called", __FUNCTION__);  
  258.                                 return NULL;  
  259.                                 }  
  260.                   
  261.       }  
  262.       if (mC2KServerHost != null) { //同理这里也直接返回了  
  263.           native_set_agps_server(AGPS_TYPE_C2K, mC2KServerHost, mC2KServerPort);  
  264.       }  
  265.   }else{  
  266.       synchronized (mLock) {  
  267.           mEnabled = false;  
  268.       }  
  269.       Log.w(TAG, "Failed to enable location provider");  
  270.   }  
  271.       
  272. }  
  273.   
  274. /**分析  <13>  frameworkaseservicesjnicom_android_server_location_GpsLocationProvider.cpp **/  
  275. static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)  
  276. {  
  277. <14>  if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0)//sGpsInterface不为null,在一开始的就已赋值,所以会调用init函数  
  278.             return false;  
  279.             .....  
  280. }  
  281.   
  282. /**分析  <14>   hardwarexxxgpsskytraqSkytraq_gps.c **/  
  283. static int skytraq_gps_init(GpsCallbacks* callbacks) //callbacks回调函数时有JNI传下来的,在JNI中实现的  
  284. {  
  285.     GpsState*  s = &_gps_state; //该结构图数组初始化的时候都为0  
  286.     if (!s->init)  
  287. <15>      gps_state_init(s, callbacks);  
  288. }  
  289.   
  290. /**分析  <15>   hardwarexxxgpsskytraqSkytraq_gps.c **/  
  291. static void gps_state_init( GpsState*  state, GpsCallbacks* callbacks )  
  292. {  
  293.     state->fd = gps_channel_open(GPS_CHANNEL_NAME);  
  294.             --> fd = open("/dev/skytraq_gps_ipc", O_RDWR |  O_SYNC); //打开串口  
  295.     int ret = ioctl(state->fd, GPS_IPC_SET, &gps_connect_info); //调用驱动函数ioctl设置gps  
  296.     state->thread = callbacks->create_thread_cb( "gps_state_thread", gps_state_thread, state );//创建线程,用来监听发送的命令和监听数据上报,  
  297. }  
  298.   
  299.   
  300. /**分析<9> frwmeworkaseservicesjavacomandroidserverLocationManagerService.java 
  301. private void applyRequirementsLocked(String provider) 
  302. { 
  303.     //设置worksource和providerRequest 
  304.     ..... 
  305. <16>  p.setRequest(providerRequest, worksource); //location provider 发送请求 
  306. } 
  307.   
  308.  
  309. /**分析<16> frwmeworkaseservicesjavacomandroidserverlocationGpsLocationProvider.java**/  
  310. public void setRequest(ProviderRequest request, WorkSource source)   
  311. {  
  312. <17>   sendMessage(SET_REQUEST, 0, new GpsRequest(request, source)); //发送消息,SET_REQUEST == 3  
  313. }  
  314.   
  315. /**分析<17> frwmeworkaseservicesjavacomandroidserverlocationGpsLocationProvider.java**/  
  316. public void handleMessage(Message msg)  
  317. {  
  318.     ...  
  319.     case SET_REQUEST:  
  320.        GpsRequest gpsRequest = (GpsRequest) msg.obj;  
  321. <18>   handleSetRequest(gpsRequest.request, gpsRequest.source);  
  322.        break;  
  323. }  
  324.   
  325. /**分析<18> frwmeworkaseservicesjavacomandroidserverlocationGpsLocationProvider.java**/  
  326. private void handleSetRequest(ProviderRequest request, WorkSource source)   
  327. {  
  328.     ...  
  329. <19>  startNavigating(singleShot);//开始导航  
  330. }  
  331.   
  332. /**分析<19> frwmeworkaseservicesjavacomandroidserverlocationGpsLocationProvider.java**/  
  333. private void startNavigating(boolean singleShot)  
  334. {  
  335. <20>  native_set_position_mode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC, interval, 0, 0)//该函数在HAL层直接返回了,没做任何事  
  336. <21>  native_start()  
  337. }   
  338.   
  339. /**分析<20> frameworkaseservicesjnicom_android_server_location_GpsLocationProvider.cpp**/  
  340. static jboolean android_location_GpsLocationProvider_set_position_mode(JNIEnv* env, jobject obj,  
  341.         jint mode, jint recurrence, jint min_interval, jint preferred_accuracy, jint preferred_time)  
  342. {  
  343.     if (sGpsInterface)  
  344. <22>        return (sGpsInterface->set_position_mode(mode, recurrence, min_interval, preferred_accuracy,   
  345.                 preferred_time) == 0); //调用HAL层接口  
  346. }  
  347.   
  348. /**分析<22> xxxgpsskytraqskytraq.gps.c**/  
  349. static int skytraq_gps_set_position_mode(GpsPositionMode mode,  
  350.                                       GpsPositionRecurrence recurrence,  
  351.                                       uint32_t min_interval,  
  352.                                       uint32_t preferred_accuracy,  
  353.                                       uint32_t preferred_time)  
  354. {  
  355.     ALOGD("%s: called", __FUNCTION__);  
  356.     return 0;  
  357. }  
  358. /**分析<21> frameworkaseservicesjnicom_android_server_location_GpsLocationProvider.cpp**/  
  359. static jboolean android_location_GpsLocationProvider_start(JNIEnv* env, jobject obj)  
  360. {  
  361.     if (sGpsInterface)  
  362. <23>      return (sGpsInterface->start() == 0); //调用HAL 层的static int skytraq_gps_start()  
  363. }  
  364.   
  365. /**分析<23> xxxgpsskytraqskytraq.gps.c**/  
  366. static int skytraq_gps_start()  
  367. {  
  368.     gps_state_start(s);  
  369.         -->s->status = CMD_START;   
  370.   /*在<15>线程函数gps_state_thread()中while(1)中等该命令,进入获取数据*/  
  371. }  
  372. 此时GPS就已运行  
原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/6757231.html