[LBS]LocationManagerService的启动

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;

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值