zoukankan      html  css  js  c++  java
  • 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就已运行  
  • 相关阅读:
    Daily Scrumming 2015.10.20(Day 1)
    Buaaclubs项目介绍
    [转载] Linux创建用户后,切换用户报This account is currently not available
    NetFPGA-1G-CML从零开始环境配置
    Digilent Xilinx USB Jtag cable
    OVS流表table之间的跳转
    Linux换源
    Scapy安装以及简单使用
    Do in SDN
    KMP算法
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/6757231.html
Copyright © 2011-2022 走看看