1、BootLoader 加载引导程序
在 Android 系统启动时,CPU 首先执行存储在 ROM 中的引导程序 BootLoader。BootLoader 读取其中的配置信息和参数,并将控制权交给下一阶段的引导程序。
2、加载 Linux 内核 Kernel
接着,BootLoader 加载 Linux 内核 Kernel,并将控制权交给内核。此时,内核开始初始化系统并加载必要的驱动程序模块。
3、启动 init 进程
内核完成基本系统初始化后,会启动 init 进程,它是 Android 系统中的第一个用户空间进程,负责启动系统中的各个服务和应用程序。
在 init 进程中,会执行 init.rc 脚本文件,该文件定义了系统启动时需要执行的命令。例如,以下命令会启动 ril-daemon 进程,用于处理与基带通信相关的事务:
service ril-daemon /system/bin/rild
socket rild stream 660 root radio
oneshot
4、启动 Zygote 进程
init 进程会启动 Zygote 进程,它是一个特殊的进程,负责启动其他进程的虚拟机。当应用程序首次被启动时,Zygote 进程会创建一个新的虚拟机,并在其中运行该应用程序。
在 init 进程中,会执行 /system/bin/app_process 命令,该命令会启动 Zygote 进程。具体来说,该命令会执行 com.android.internal.os.ZygoteInit 类的 main() 方法:
public static void main(String[] argv) {
ZygoteServer zygoteServer = new ZygoteServer();
if (argv.length == 2 && argv[1].equals("start-system-server")) {
zygoteServer.registerServerSocket("android-system", ZygoteServer.ABSTRACT_SOCKET_NAME);
Runnable r = zygoteServer.runSelectLoop(String.valueOf(Process.myUid()));
Thread thr = new Thread(r, "ZygoteStartSystemServer");
thr.start();
} else {
zygoteServer.registerServerSocket(ZygoteServer.PRIMARY_SOCKET_NAME, null);
zygoteServer.runSelectLoop(null);
}
}
在 main() 方法中,会创建一个 ZygoteServer 对象,并调用其 startServer() 方法,创建一个 LocalServerSocket 对象,以便其他进程可以通过 UNIX 域套接字与该进程通信。如果启动 System Server 进程,会将参数 “start-system-server” 传递给 Zygote 进程,此时 Zygote 进程会创建一个名为 “android-system” 的 UNIX 域套接字。
5、启动 System Server 进程
SystemServer 是 Android 系统中最重要的进程之一,负责管理系统服务,如网络连接、电源管理、传感器等,以及与应用程序进行通信。SystemServer 进程也由 Zygote 进程启动.
SystemServer 的启动主要包括以下几个步骤:
1、从 Zygote 进程中复制资源
SystemServer 进程从 Zygote 进程中继承了一些重要的资源,如类加载器、内存映射等。
在 Zygote 进程中,我们可以看到以下代码段:
class ZygoteInit {
// ...
public static void main(String argv[]) {
// ...
preload()