Android 系统启动流程

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()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值