Android GPS learning (2): GPS service startup and initialization process

Scan code to follow, learn together
Insert picture description here

1. Start GPS service

The code to add the LocationManagerService method to the startOtherServices method of SystemServer.java is as follows,

frameworks/base/services/java/com/android/server/SystemServer.java

traceBeginAndSlog("StartLocationManagerService");
try {
    
    
    location = new LocationManagerService(context);
    ServiceManager.addService(Context.LOCATION_SERVICE, location);

After adding the gps service to the system, in the startOtherServices method of SystemServer.java

final LocationManagerService locationF = location;

try {
    
    
    if (locationF != null) locationF.systemRunning();

Call the systemRunning method of LocationManagerService to complete the initialization of LocationManagerService.

2. Function call

frameworks/base/services/core/java/com/android/server/LocationManagerService.java

The loadProvidersLocked method will be called in the systemRunning method,

public void systemRunning() {
    
    
    synchronized (mLock) {
    
    
        // prepare providers
        loadProvidersLocked();
        updateProvidersLocked();
    }

The loadProvidersLocked method is mainly to add GPS positioning providers supported on the device,

private void loadProvidersLocked() {
    
    
    // create a passive location provider, which is always enabled
    PassiveProvider passiveProvider = new PassiveProvider(this);
    addProviderLocked(passiveProvider);
    mEnabledProviders.add(passiveProvider.getName());
    mPassiveProvider = passiveProvider;

    if (GnssLocationProvider.isSupported()) {
    
    
        // Create a gps location provider
        GnssLocationProvider gnssProvider = new GnssLocationProvider(mContext, this,
                mLocationHandler.getLooper());
        mGnssSystemInfoProvider = gnssProvider.getGnssSystemInfoProvider();
        mGnssBatchingProvider = gnssProvider.getGnssBatchingProvider();
        mGnssMetricsProvider = gnssProvider.getGnssMetricsProvider();
        mGnssStatusProvider = gnssProvider.getGnssStatusProvider();
        mNetInitiatedListener = gnssProvider.getNetInitiatedListener();
        addProviderLocked(gnssProvider);
        mRealProviders.put(LocationManager.GPS_PROVIDER, gnssProvider);
        mGnssMeasurementsProvider = gnssProvider.getGnssMeasurementsProvider();
        mGnssNavigationMessageProvider = gnssProvider.getGnssNavigationMessageProvider();
        mGpsGeofenceProxy = gnssProvider.getGpsGeofenceProxy();
    }

2.1, Framework calls the JNI layer method

GnssLocationProvider.java -> com_android_server_location_GnssLocationProvider.cpp

2.2, JNI layer calls Framework method

com_android_server_location_GnssLocationProvider.cpp -> GnssLocationProvider.java

Guess you like

Origin blog.csdn.net/qq_43804080/article/details/106186533