1. SystemServiceManger启动
分析过SystemServer的朋友应该都有记忆,SystemServiceManager就是在SystemServer中启动的,下面是SystemServiceManager的启动代码:
[SystemServer.java] // Create the system service manager. mSystemServiceManager = new SystemServiceManager(mSystemContext); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
这里直接通过new一个SystemServiceManager对象,然后将新new的对象保存到mSystemServiceManager中,以备后用。
SystemServiceManager的代码如下:
public SystemServiceManager(Context context) {
mContext = context;
}
这里只要将context保存到mContext中即可,现在SystemServiceManager就初始化完毕了。
2. SystemServiceManager代码分析
2.1 SystemServiceManager中的startService函数
/**
* Starts a service by class name.
*
* @return The service instance.
*/
@SuppressWarnings("unchecked")
public SystemService startService(String className) {
// SystemrService类的class对象
final Class<SystemService> serviceClass;
try {
// 通过Class.forName,传入String型类名,得到对应类名的class对象
serviceClass = (Class<SystemService>)Class.forName(className);
} catch (ClassNotFoundException ex) {
Slog.i(TAG, "Starting " + className);
throw new RuntimeException("Failed to create service " + className
+ ": service class not found, usually indicates that the caller should "
+ "have called PackageManager.hasSystemFeature() to check whether the "
+ "feature is available on this device before trying to start the "
+ "services that implement it", ex);
}
// 调用另一个startService重载函数
return startService(serviceClass);
}
/**
* Creates and starts a system service. The class must be a subclass of
* {@link com.android.server.SystemService}.
*
* @param serviceClass A Java class that implements the SystemService interface.
* @return The service instance, never null.
* @throws RuntimeException if the service fails to start.
*/
@SuppressWarnings("unchecked")
// 模板类函数,其中serviceClass必须是SystemService的子类
public <T extends SystemService> T startService(Class<T> serviceClass) {
final String name = serviceClass.getName();
Slog.i(TAG, "Starting " + name);
// Create the service.
// 再次确认serviceClass是SystemService的子类
if (!SystemService.class.isAssignableFrom(serviceClass)) {
throw new RuntimeException("Failed to create " + name
+ ": service must extend " + SystemService.class.getName());
}
final T service;
try {
// 获取service的构造函数
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
// 创建service对象
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service could not be instantiated", ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service must have a public constructor with a Context argument", ex);
} catch (NoSuchMethodException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service must have a public constructor with a Context argument", ex);
} catch (InvocationTargetException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service constructor threw an exception", ex);
}
// Register it.
// 将service添加到mServices ArrayList中
mServices.add(service);
// Start it.
try {
// 启动service
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + name
+ ": onStart threw an exception", ex);
}
return service;
}
2.2 SystemServiceManager中的startBootPhase函数
/**
* Starts the specified boot phase for all system services that have been started up to
* this point.
*
* @param phase The boot phase to start.
*/
public void startBootPhase(final int phase) {
if (phase <= mCurrentPhase) {
throw new IllegalArgumentException("Next phase must be larger than previous");
}
mCurrentPhase = phase;
Slog.i(TAG, "Starting phase " + mCurrentPhase);
// 轮询mServices中所有的service
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
try {
/// M: Service operation time log @{
long startTime = 0;
if (!IS_USER_BUILD) startTime = SystemClock.elapsedRealtime();
/// @}
// 调用service的onBootPhase方法
service.onBootPhase(mCurrentPhase);
/// M: Service operation time log @{
if (!IS_USER_BUILD) {
checkTime(startTime, "Phase " + mCurrentPhase, service.getClass().getName());
}
/// @}
} catch (Exception ex) {
throw new RuntimeException("Failed to boot service "
+ service.getClass().getName()
+ ": onBootPhase threw an exception during phase "
+ mCurrentPhase, ex);
}
}
}
startBootPhase也比较简单,因为有些service的启动需要以来其他的service,所以Systemserver会将设备启动分成几个阶段,每个阶段启动不同的service,而这些就是由startBootPhase这个方法来实现的。如果检测到当前的phase达到service的设定值,service就会完成相应的工作。下面是BatteryService的onBootPhase方法,可以知道当设备启动到PHASE_ACTIVITY_MANAGER_READY,该方法就会调用执行相应的操作。
public void onBootPhase(int phase) {
if (phase == PHASE_ACTIVITY_MANAGER_READY) {
// check our power situation now that it is safe to display the shutdown dialog.
synchronized (mLock) {
mBootCompleted = true;
ContentObserver obs = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
synchronized (mLock) {
updateBatteryWarningLevelLocked();
}
}
};
final ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
false, obs, UserHandle.USER_ALL);
updateBatteryWarningLevelLocked();
}
}
}
2.3 SystemServiceManager中剩余关于user的函数
SystemServiceManager中剩余一下关于特定user的函数,具体的使用场景在SystemService.java中有描述,大家可以看下面代码中的注释,简单明了。
/**
* Called when switching to a different foreground user, for system services that have
* special behavior for whichever user is currently in the foreground. This is called
* before any application processes are aware of the new user.
* @param userHandle The identifier of the user.
*/
public void onSwitchUser(int userHandle) {}
/**
* Called when an existing user is stopping, for system services to finalize any per-user
* state they maintain for running users. This is called prior to sending the SHUTDOWN
* broadcast to the user; it is a good place to stop making use of any resources of that
* user (such as binding to a service running in the user).
* @param userHandle The identifier of the user.
*/
public void onStopUser(int userHandle) {}
/**
* Called when an existing user is stopping, for system services to finalize any per-user
* state they maintain for running users. This is called after all application process
* teardown of the user is complete.
* @param userHandle The identifier of the user.
*/
public void onCleanupUser(int userHandle) {}
3. 看看SystemService的内容
系统中存在部分service是systemservice的子类,所以就顺便看看Systemservice的代码都有哪些:
public abstract class SystemService {
// 列出设备启动的各个阶段
/*
* Boot Phases
*/
public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100; // maybe should be a dependency?
/**
* After receiving this boot phase, services can obtain lock settings data.
*/
public static final int PHASE_LOCK_SETTINGS_READY = 480;
/**
* After receiving this boot phase, services can safely call into core system services
* such as the PowerManager or PackageManager.
*/
public static final int PHASE_SYSTEM_SERVICES_READY = 500;
/**
* After receiving this boot phase, services can broadcast Intents.
*/
public static final int PHASE_ACTIVITY_MANAGER_READY = 550;
/**
* After receiving this boot phase, services can start/bind to third party apps.
* Apps will be able to make Binder calls into services at this point.
*/
public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;
/**
* After receiving this boot phase, services can allow user interaction with the device.
* This phase occurs when boot has completed and the home application has started.
* System services may prefer to listen to this phase rather than registering a
* broadcast receiver for ACTION_BOOT_COMPLETED to reduce overall latency.
*/
public static final int PHASE_BOOT_COMPLETED = 1000;
private final Context mContext;
/**
* Initializes the system service.
*
* Subclasses must define a single argument constructor that accepts the context
* and passes it to super.
*
*
* @param context The system server context.
*/
// systemservice的构造函数
public SystemService(Context context) {
mContext = context;
}
/**
* Gets the system context.
*/
public final Context getContext() {
return mContext;
}
/**
* Returns true if the system is running in safe mode.
* TODO: we should define in which phase this becomes valid
*/
public final boolean isSafeMode() {
return getManager().isSafeMode();
}
/**
* Called when the dependencies listed in the @Service class-annotation are available
* and after the chosen start phase.
* When this method returns, the service should be published.
*/
public abstract void onStart();
/**
* Called on each phase of the boot process. Phases before the service's start phase
* (as defined in the @Service annotation) are never received.
*
* @param phase The current boot phase.
*/
public void onBootPhase(int phase) {}
/**
* Called when a new user is starting, for system services to initialize any per-user
* state they maintain for running users.
* @param userHandle The identifier of the user.
*/
public void onStartUser(int userHandle) {}
/**
* Called when switching to a different foreground user, for system services that have
* special behavior for whichever user is currently in the foreground. This is called
* before any application processes are aware of the new user.
* @param userHandle The identifier of the user.
*/
public void onSwitchUser(int userHandle) {}
/**
* Called when an existing user is stopping, for system services to finalize any per-user
* state they maintain for running users. This is called prior to sending the SHUTDOWN
* broadcast to the user; it is a good place to stop making use of any resources of that
* user (such as binding to a service running in the user).
* @param userHandle The identifier of the user.
*/
public void onStopUser(int userHandle) {}
/**
* Called when an existing user is stopping, for system services to finalize any per-user
* state they maintain for running users. This is called after all application process
* teardown of the user is complete.
* @param userHandle The identifier of the user.
*/
public void onCleanupUser(int userHandle) {}
/**
* Publish the service so it is accessible to other services and apps.
*/
protected final void publishBinderService(String name, IBinder service) {
publishBinderService(name, service, false);
}
/**
* Publish the service so it is accessible to other services and apps.
*/
protected final void publishBinderService(String name, IBinder service,
boolean allowIsolated) {
ServiceManager.addService(name, service, allowIsolated);
}
/**
* Get a binder service by its name.
*/
protected final IBinder getBinderService(String name) {
return ServiceManager.getService(name);
}
/**
* Publish the service so it is only accessible to the system process.
*/
protected final void publishLocalService(Class type, T service) {
LocalServices.addService(type, service);
}
/**
* Get a local service by interface.
*/
protected final T getLocalService(Class type) {
return LocalServices.getService(type);
}
private SystemServiceManager getManager() {
return LocalServices.getService(SystemServiceManager.class);
}
}
其中比较感兴趣的是publishBinderService这个方法,在之前看到这个函数还不知道是做什么用的,现在看到这个方法的代码,瞬间清晰了,这个方法最终也还是会调用ServiceManager.addService方法,将service添加到ServiceManager中。
另一个感兴趣的方法是publishLocalService,这个方法将一些要在system process中用到的service添加到LocalServices static类对象中,这个类内部通过ArrayMap将这些service记录起来,到后面需要使用就可以非常快速方便的取出来了。
http://blog4jimmy.com/2018/01/330.html

本文详细解析了Android系统中SystemServer的启动过程,包括SystemServiceManager的初始化、system服务的启动与管理机制,以及各服务间的依赖关系与启动时机。
363

被折叠的 条评论
为什么被折叠?



