Android T(13)--java层的SensorService初始化(一)
sensorService的实现代码主要在native层,其是使用c++实现的。native sensorService 并没有作为独立的进程启动,而是由 java SensorService通过JNI代码拉起来的,而 java SensorService 则在 system_server 的虚拟机中运行。本章仅仅介绍 java SensorService的启动。 下面是对应的实现代码 m
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.时序图如下
更多推荐
所有评论(0)