1 LocationManagerService启动及初始化过程
(1) 在SystemServer.java的startOtherServices中添加LocationManagerService的代码如下:
try {
location = new LocationManagerService(context);
ServiceManager.addService(Context.LOCATION_SERVICE, location);
} catch (Throwable e) {
reportWtf("starting Location Manager", e);
}
(2) 在systemReady中调用systemRunning, 启动LocationManagerService的代码如下:
try {
if (locationF != null) locationF.systemRunning();
} catch (Throwable e) {
reportWtf("Notifying Location Service running", e);
}
(3) 准备GnssLocationProvider,LocationManagerService的systemRunning函数中会调用 loadProvidersLocked, 其代码如下:
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();
......
}
......
}
(4) GnssLocationProvider的class_init_native方法。
该方法是一个静态方法,会在isSupported方法之前被调用。最终会调用到native函数中:android_location_GnssLocationProvider_class_init_native。
在这个函数中实现对gps.default.so的加载。
static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env, jclass clazz) {
i