参考资料:
https://cloud.tencent.com/developer/article/1199449
https://duanqz.github.io/2016-07-15-AMS-LaunchProcess
1、 SystemServer 启动
在Android系统开机启动的时候会调用SystemServer的main方法
/**
* The main entry point from zygote.
*/
public static void main(String[] args) {
new SystemServer().run();
}
在run里面会设置系统语言,系统属性等,然后加载native的System Server。创建SystemServiceManager,并添加到LocalService中。最后加载启动服务,开启线程循环。
1.1 启动引导服务startBootstrapServices
1.2 启动核心服务
2、 SystemServiceManager启动
2.1 类图
2.2 SystemService--服务启动阶段
public abstract class SystemService {
// 阶段 1: 等待显示设备准备完毕
// 这个阶段,Installer, AMS, PowerManagerService, DisplayManagerService已经构建完毕
public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;
// 阶段 2: 锁屏服务已经准备完毕
// 这个阶段,大部分系统服务已经构建完毕。其他服务可以获取锁屏相关的数据了,譬如锁屏密码等
public static final int PHASE_LOCK_SETTINGS_READY = 480;
// 阶段 3: 系统服务已经准备完毕
// 这个阶段,大部分系统服务已经构建完毕,PackageManagerService,PowerManagerService已经能够提供服务
public static final int PHASE_SYSTEM_SERVICES_READY = 500;
// 阶段 4: ActivityManagerService已经能够提供服务了
// 这个阶段,获取ContentProvider、发送广播等AMS相关的功能已经可以用了
public static final int PHASE_ACTIVITY_MANAGER_READY = 550;
// 阶段 5: 已经可以启动应用程序了
// 这个阶段,用户界面已经启动,数据连接、音频等服务都已可用
public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;
// 阶段 6: 系统起机完成
public static final int PHASE_BOOT_COMPLETED = 1000;
public abstract void onStart();
public void onBootPhase(int phase) {}
// ... 省略其他函数
}
部分系统服务的初始化依赖于当前系统已经启动到什么阶段,当系统服务启动时,onStart()函数会被调用; 系统启动到一定的阶段,onBootPhase()函数会被调用。所有系统服务的创建和生命周期的管理都是由SystemServiceManager这个类完成的
2.3 startService(): 启动系统服务
public SystemService startService(String className) {
final Class<SystemService> serviceClass;
try {
serviceClass = (Class<SystemService>)Class.forName(className);
} catch (ClassNotFoundException ex) {
Slog.i(TAG, "Starting " + className);
......
}
return startService(serviceClass);
}
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {
final String name = serviceClass.getName();
Slog.i(TAG, "Starting " + name);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);
// Create the service.
if (!SystemService.class.isAssignableFrom(serviceClass)) {
throw new RuntimeException("Failed to create " + name
+ ": service must extend " + SystemService.class.getName());
}
final T service;
try {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
......
startService(service);
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service);
// Start it.
long time = SystemClock.elapsedRealtime();
try {
service.onStart();
....
}