SystemServer的startOtherServices()启动LocationManagerService,具体流程如下:
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
....
mSystemServiceManager.startService(LocationManagerService.Lifecycle.class);
....
}
进入SystemServiceManager的startService(Class<T> serviceClass)
public <T extends SystemService> T startService(Class<T> serviceClass) {
....
final T service;
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext); //调用 LocationManagerService.Lifecycle.class的构造方法,这里会创建LocationManagerService实例
startService(service);
return service;
....
}
LocationManagerService.Lifecycle.class 的构造方法
public Lifecycle(Context context) {
super(context);
mUserInfoHelper = new SystemUserInfoHelper(context);
mService = new LocationManagerService(context, mUserInfoHelper);//创建LocationManagerService实例
}
进入SystemServiceManager的startService(@NonNull final SystemService service)
public void startService(@NonNull final SystemService service) {
mServices.add(service); //向SystemServiceManager注册LocationManagerService
....
try {
service.onStart(); //调用LocationManagerService.Lifecycle.class的onStart()方法
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ ": onStart threw an exception", ex);
}
}
LocationManagerService.Lifecycle.class 的onStart()方法发布LocationManagerService服务,其他服务和应用程序可以访问LocationManagerService.
public void onStart() {
// enable client caches by doing the first invalidate
LocationManager.invalidateLocalLocationEnabledCaches();
publishBinderService(Context.LOCATION_SERVICE, mService); //发布LocationManagerService服务
....
}
再看看LocationManagerService的构造方法,这里面仅创建了PassiveProvider,主要是因为它因为它不依赖于系统尚未准备好的服务或外部代码。
private LocationManagerService(Context context, UserInfoHelper userInfoHelper) {
....
mPassiveManager = new PassiveLocationProviderManager();
mProviderManagers.add(mPassiveManager);
mPassiveManager.setRealProvider(new PassiveProvider(mContext));//注册PassiveProvider
....
}
LBS的其他provider在什么时候创建的呢?原来是启动阶段达到PHASE_THIRD_PARTY_APPS_CAN_START阶段创的。
LocationManagerService.Lifecycle的onBootPhase()方法:
public void onBootPhase(int phase) {
if (phase == PHASE_SYSTEM_SERVICES_READY) {
mService.onSystemReady();
} else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
mService.onSystemThirdPartyAppsCanStart();
}
}
private void onSystemThirdPartyAppsCanStart() {
synchronized (mLock) {
// prepare providers
initializeProvidersLocked();
}
// initialize gnss last because it has no awareness of boot phases and blindly assumes that
// all other location providers are loaded at initialization
initializeGnss();
}
然后在LocationManagerService中进行各种provider的创建
private void initializeProvidersLocked() {
LocationProviderProxy networkProvider = LocationProviderProxy.createAndRegister(
mContext,
NETWORK_LOCATION_SERVICE_ACTION,
com.android.internal.R.bool.config_enableNetworkLocationOverlay,
com.android.internal.R.string.config_networkLocationProviderPackageName);//创建和注册NetworkProvider
if (networkProvider != null) {
LocationProviderManager networkManager = new LocationProviderManager(NETWORK_PROVIDER);
mProviderManagers.add(networkManager);
networkManager.setRealProvider(networkProvider);//注册NETWORK_PROVIDER代理
}
......
LocationProviderProxy fusedProvider = LocationProviderProxy.createAndRegister(
mContext,
FUSED_LOCATION_SERVICE_ACTION,
com.android.internal.R.bool.config_enableFusedLocationOverlay,
com.android.internal.R.string.config_fusedLocationProviderPackageName);//创建和注册FusedProvider
if (fusedProvider != null) {
LocationProviderManager fusedManager = new LocationProviderManager(FUSED_PROVIDER);
mProviderManagers.add(fusedManager);
fusedManager.setRealProvider(fusedProvider);
}
......
}
private void initializeGnss() {
if (GnssManagerService.isGnssSupported()) {
//GnssManagerService 为LocationManagerService管理GNSS的provider和GNSS的相关功能
mGnssManagerService = new GnssManagerService(mContext, mAppOpsHelper, mSettingsHelper,
mAppForegroundHelper, mLocationUsageLogger);
mGnssManagerService.onSystemReady();
LocationProviderManager gnssManager = new LocationProviderManager(GPS_PROVIDER);//创建和注册GpsProvider
synchronized (mLock) {
mProviderManagers.add(gnssManager);
}
gnssManager.setRealProvider(mGnssManagerService.getGnssLocationProvider());
....
}
下面详细看一下GpsProvider的初始化。涉及JNI调用:
GnssManagerService. isGnssSupported()->GnssLocationProvider.isSupported()->GnssLocationProvider.native_is_supported()进入native. 从方法映射表可以看出,调用的是/frameworks/base/services/core/jni/com_android_server_location_GnssLocationProvider.cpp文件的android_location_GnssLocationProvider_is_supported()方法。
static const JNINativeMethod sMethods[] = {
....
{"native_is_supported", "()Z", reinterpret_cast<void *>(
android_location_GnssLocationProvider_is_supported)},
....
}
根据gnssHal指针的返回值判断是否支持GpsProvider,不为空则支持。
static jboolean android_location_GnssLocationProvider_is_supported(
JNIEnv* /* env */, jclass /* clazz */) {
return (gnssHal != nullptr) ? JNI_TRUE : JNI_FALSE;
}
gnssHal代表的是GNSS service服务句柄。从源码可以看出,GNSS service服务有很多种版本,优先选择最新的版本。
static void android_location_GnssLocationProvider_set_gps_service_handle() {
ALOGD("Trying IGnss_V2_1::getService()");
gnssHal_V2_1 = IGnss_V2_1::getService();
if (gnssHal_V2_1 != nullptr) {
gnssHal = gnssHal_V2_1;
gnssHal_V2_0 = gnssHal_V2_1;
gnssHal_V1_1 = gnssHal_V2_1;
gnssHal = gnssHal_V2_1;
return;
}
ALOGD("gnssHal 2.1 was null, trying 2.0");
gnssHal_V2_0 = IGnss_V2_0::getService();
if (gnssHal_V2_0 != nullptr) {
gnssHal = gnssHal_V2_0;
gnssHal_V1_1 = gnssHal_V2_0;
return;
}
ALOGD("gnssHal 2.0 was null, trying 1.1");
gnssHal_V1_1 = IGnss_V1_1::getService();
if (gnssHal_V1_1 != nullptr) {
gnssHal = gnssHal_V1_1;
return;
}
ALOGD("gnssHal 1.1 was null, trying 1.0");
gnssHal = IGnss_V1_0::getService();
}
总结一下:
1. LocationManagerService是在SystemServer的startOtherServices()创建的。
2. new LocationManagerService的时候,仅仅会创建和注册注册PassiveProvider,因为它因为它不依赖于系统尚未准备好的服务或外部代码。
3. NetworkProvider,FusedProvider和GpsProvider的创建和注册时机位于系统处于PHASE_THIRD_PARTY_APPS_CAN_START阶段。
简单解释一下,SystemService定义了以下几个启动阶段:
//最早的启动阶段,在SystemServer的startBootstrapServices()方法中,DisplayManagerService启动后发送此消息给SystemService
public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;
//在SystemServer的startOtherServices()方法中,在DevicePolicyManager初始化完成后发送此消息给SystemService,可以获取锁定设置数据
public static final int PHASE_LOCK_SETTINGS_READY = 480;
//在SystemServer的startOtherServices()方法中发送消息,这个阶段系统其他服务可以访问系统的核心服务,比如 PowerManager ,PackageManager
public static final int PHASE_SYSTEM_SERVICES_READY = 500;
//在SystemServer的startOtherServices()方法中发送消息,这个阶段系统其他服务可以访问系统指定的服务, 这些服务继承至SystemService,有一个数组保存这些服务,
//根据数组元素所在的先后顺序一次实例化。这个主要用于用户的自定义,从源码看这个数组默认是空的。
public static final int PHASE_DEVICE_SPECIFIC_SERVICES_READY = 520;
//在SystemServer的startOtherServices()方法调用AMS的systemReady()方法,在systemReady()回调中,发送此消息。
//这个阶段标志系统已经准备好,可以执行第三方的代码了。如监听native的crash,启动SystemUI等
public static final int PHASE_ACTIVITY_MANAGER_READY = 550;
//在SystemServer的startOtherServices()方法调用AMS的systemReady()方法,在systemReady()回调中,发送此消息。
//在这之前,所有的应用数据已经准备好,应用和其他app可以进行Binder通信了。应用数据准备逻辑在PackageManagerService的构造方法中,
//PackageManagerService向SystemServer初始化线程池提交了应用数据准备相关操作。
public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;
//在AMS的finishBooting()方法中,发送此消息。此阶段系统已经启动完成,Lanucher界面已经启动,允许用户与设备进行交互了。
//系统服务可以注册广播接收器,接收 android.content.Intent.ACTION_LOCKED_BOOT_COMPLETED广播,这种广播在非解锁状态下也能发送。
//而android.content.Intent.ACTION_BOOT_COMPLETED需要解锁设备后,系统才会发送。
public static final int PHASE_BOOT_COMPLETED = 1000;