Scan code to follow, learn together
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