1.概述

  sensorService的实现代码主要在native层,其是使用c++实现的。native sensorService 并没有作为独立的进程启动,而是由 java SensorService通过JNI代码拉起来的,而 java SensorService 则在 system_server 的虚拟机中运行。本章仅仅介绍 java SensorService的启动。

2.通过SystemServiceManager启动 SensorService

  下面是对应的实现代码

//frameworks/base/services/java/com/android/server/SystemServer.java
main
    new SystemServer().run()
        startBootstrapServices()
            mSystemServiceManager.startService(SensorService.class);

  mSystemServiceManager为类 SystemServiceManager 的实例,其类名和功能完全匹配,用于 com.android.server.SystemService 子类的创建、启动以及系统服务的生命周期事件的派发。这里的 startService 接口则用于 com.android.server.SystemService 子类的创建,其实现代码如下

//frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
mSystemServiceManager.startService(SensorService.class);
    //代码块1
    final String name = serviceClass.getName();
    Constructor<T> constructor = serviceClass.getConstructor(Context.class);
    service = constructor.newInstance(mContext);
    //代码块2
    startService(service)
    //代码块3
    return service;

2.1 代码块1详解

  对于1区的代码,其作用就是根据类,找到并实例化所给的类,并且构造的函数的参数为Context,所以这里对应 SensorService 类中只有参数Context的参数,对应代码如下

//frameworks/base/services/core/java/com/android/server/sensors/SensorService.java
public SensorService(Context ctx) {
        super(ctx);
        mSensorServiceStart = SystemServerInitThreadPool.submit(() -> {
            ...         
            long ptr = startSensorServiceNative(new ProximityListenerDelegate());
            mPtr = ptr;
            ...
        }, START_NATIVE_SENSOR_SERVICE);
}

  SensorService的类图如下
在这里插入图片描述

  后续可以通过SystemService的接口getContext来获取传入的Context

//platform/frameworks/base/services/core/java/com/android/server/sensors/SensorService.java
public SystemService(@NonNull Context context) {
    mContext = context;
}

SystemServerInitThreadPool.submit
  系统使用线程池中的线程来处理系统服务的初始化任务,其内部实现就是 ExecutorService的一系列东西。这里使用了接口 submit接口后,如果当前在跑的任务少于其内部的线程数,那么就直接运行该任务,即startSensorServiceNative(new ProximityListenerDelegate())了,这部分代码则为native 代码,位于jni文件中,返回一个c++层的指针方便后面java SensorService 调用 native SensorService的实现了。

//file:platform/frameworks/base/services/core/java/com/android/server/sensors/SensorService.java
private static native long startSensorServiceNative(ProximityActiveListener listener);

  所以代码块1中最终获得了 java SensorService的一个实例,并存于 service。

2.2 代码块2详解–startService

  其实现如下

//frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
public void startService(@NonNull final SystemService service) {
    mServiceClassnames.add(className);
    // Register it.
    mServices.add(service);
    // Start it.
    service.onStart();
}

  在staratService中代码非常的清晰,前两部用于存储被启动系统服务的名字,以及其对应的引用供后面使用。
  则会调用到 SensorService的onStart方法

//file:platform/frameworks/base/services/core/java/com/android/server/sensors/SensorService.java
@Override
public void onStart() {
    LocalServices.addService(SensorManagerInternal.class, new LocalService());
}

  这一步的addService并不支持跨进程调用,仅仅只是在system_server进程内部进行共享使用的。

private static final ArrayMap<Class<?>, Object> sLocalServiceObjects = new ArrayMap<Class<?>, Object>();
public static <T> void addService(Class<T> type, T service)
    sLocalServiceObjects.put(type, service);

  sLocalServiceObjects则是一个静态 ArrayMap。

2.3 代码块3详解

  这部分代码只返回 SensorService的引用,然而在SystemServer中并不记录它。

3. SensorService对PHASE_WAIT_FOR_SENSOR_SERVICE的处理

  Android系统的启动是依赖 SensorService的,例如在启动WMS之前,system_server中则会等待其启动完成,实现如下

//frameworks/base/services/java/com/android/server/SystemServer.java
main
    new SystemServer().run()
        startOtherServices()
            mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE);

  startBootPhase会调用到所有通过它启动的SystemService中的startBootPhase方法,下面是 SensorService中对应的实现

//platform/frameworks/base/services/core/java/com/android/server/sensors/SensorService.java
@Override
public void onBootPhase(int phase) {
    if (phase == SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE) {
        ConcurrentUtils.waitForFutureNoInterrupt(mSensorServiceStart,
                START_NATIVE_SENSOR_SERVICE);
    }
}

  实现也非常的简单,内部会持续等待 mSensorServiceStart 为true,mSensorServiceStart则会在mSensorServiceStart = SystemServerInitThreadPool.submit 中的任务执行完成并且退出后返回,如果是主动的退出,Future中的值为 true,那么也就认为SensorService此时已经可用。

private Future<?> mSensorServiceStart;
public SensorService(Context ctx) {
    mSensorServiceStart = SystemServerInitThreadPool.submit(() -> {
        ...
    }, START_NATIVE_SENSOR_SERVICE);
}

4.时序图如下

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐