概述
Android系统的启动从按电源键拉起Room,到加载引导程序唤醒nei,再经历init进程、Zygote进程、SystemServer进程启动各种系统服务进程,最后AMS启动Launcher进程进入到系统桌面。
init进程
init进程是系统中的第一个进程,在引导程序BootLoader唤醒内核后启动,init进程会在系统中找到一个init.rc脚本,init进程根据init.rc配置启动了zygote服务进程
Zygote进程
所有的应用进程、包括system_server都是Zygote创建的,通过复制自身创建进程,创建过程中会在内部创建一个虚拟机实例。Zygote进程在Java层中由ZygoteInit启动
public static void main(String argv[]) {
ZygoteServer zygoteServer = new ZygoteServer();//创建服务端socket,并在下面的zygoteServer.registerServerSocket(socketName)注册监听
......
RuntimeInit.enableDdms();//启动DDMS,Dalvik Debug Monitor Service,Android 开发环境中的Dalvik虚拟机调试监控服务
......
zygoteServer.registerServerSocket(socketName);//注册zygote的socket监听端口
if (!enableLazyPreload) {
......
preload(bootTimingsTraceLog);//加载系统资源
......
} else {
Zygote.resetNicePriority();
}
......
if (startSystemServer) {
//这里forkSystemServer服务进程
Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
if (r != null) {
r.run();
return;
}
}
//循环监听和接收消息
caller = zygoteServer.runSelectLoop(abiList);
} catch (Throwable ex) {
Log.e(TAG, "System zygote died with exception", ex);
throw ex;
} finally {
zygoteServer.closeServerSocket();
}
if (caller != null) {
caller.run();
}
}
Zygote进程流程如下:
- 创建AppRunTime并调用start方法,启动Zygote进程 创建JVM并注册JNI
- 通过JNI调用ZygoteInit的main方法进入Zygote的Java层
- 通过registerZygoteSocket方法创建服务端Socket,并通过runSelectLoop方法等待AMS请求
- 启动systemServer进程:forkSystemServer-》handleSystemServerProcess
SystemServer进程
SystemServer进程在系统中是一个非常重要的进程。我们常见的AMS、PMS和WMS以及支撑系统运行的BatteryService、DropBoxManagerService、UsageStatsService等等都在这里初始化的。
public static void main(String[] args) {
new SystemServer().run();
}
......
private void run() {
try {
// 判断时间是否需要重置1970.01.01
if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
}
......
Looper.prepareMainLooper();//初始化主线程Looper
// Initialize native services.
System.loadLibrary("android_servers");
......
// Initialize the system context.
createSystemContext();//初始化context
// Create the system service manager.
//创建SystemServiceManager,后面的各种服务都由它来创建
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
SystemServerInitThreadPool.get();
} finally {
traceEnd(); // InitBeforeStartServices
}
// Start services.
try {
//启动n个服务
startBootstrapServices();//引导服务
startCoreServices();//核心服务
startOtherServices();//其他服务
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
throw ex;
} finally {
traceEnd();
}
......
// Loop forever.进入Loop循环
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
SystemServer进程主要做了哪些事情呢?
首先初始化了主线程Looper;创建SystemServerManager为后续的服务启动做准备;启动各种服务,主要分为三大种类:引导服务、核心服务和其他服务。
Launcher启动
Launcher进程算是系统启动的最后一步了,通过前面SystemServer进程已经初始化的AMS和PackageManagerService服务,由AMS启动Launcher,再通过PackageManagerService获取系统已安装应用信息,最后通过Launcher展示在ListView上。
最后
附上思维导图一张
欢迎关注我的个人微信公众号,【优了个秀】和你每天进步一点点