Android Framework LocationManagerService源码调用分析

1,067 阅读1分钟

Android Gps模块总结

App层如何使用定位


public void startLocation(Context mContext) {
    locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
    //发起定位
    locationManager.requestLocationUpdates("gps", 1000, 0, MyLocationListener);
}

源码时序图

android Gps模块源码分析.png

总结一下: locationManager.requestLocationUpdates -------------》GnssLocationProvider.native_start()

当我们调用requestLocationUpdates的时候 其实最终是调到了GnssLocationProvider.native_start()中的jni方法,所以我们要关注GnssLocationProvider是什么时候创建的

1. Android什么时候建立启动LocationManagerService模块

Android系统启动的时候
SystemServer.java

private void startOtherServices() {

            。。。。省略代码
            
            traceBeginAndSlog("StartLocationManagerService");
            try {
            //创建LMS服务
                location = new LocationManagerService(context);
                ServiceManager.addService(Context.LOCATION_SERVICE, location);
            } catch (Throwable e) {
                reportWtf("starting Location Manager", e);
            }
            traceEnd();
            
             。。。。省略代码
             
             final LocationManagerService locationF = location;
             
             。。。。省略代码
            
            try {
                if (locationF != null) locationF.systemRunning();
            } catch (Throwable e) {
                reportWtf("Notifying Location Service running", e);
            }
}
LocationManagerService.java
public void systemRunning() {
       。。。。省略代码
       
      // prepare providers
      loadProvidersLocked();
}


 private void loadProvidersLocked() {
      。。。。省略代码
      
if (GnssLocationProvider.isSupported()) {
    // Create a gps location provider
    LocationProvider gnssProviderManager = new LocationProvider(GPS_PROVIDER, true);
    mRealProviders.add(gnssProviderManager);
    addProviderLocked(gnssProviderManager);
    
    //这里可以看到GnssLocationProvider建立了
    GnssLocationProvider gnssProvider = new GnssLocationProvider(mContext,
            gnssProviderManager,
            mHandler.getLooper());
    gnssProviderManager.attachLocked(gnssProvider);
 
 }

C++代码待分析