美文网首页
Android系统启动

Android系统启动

作者: 钦_79f7 | 来源:发表于2019-12-19 12:31 被阅读0次

init进程

启动电源,加载引导程序,引导程序启动Linux内核,Linux内核加载完成后,首先启动 init 进程,

通过 init.rc 文件启动 init 进程,而这些文件位于源码目录:system/core/init

init 进程的工作:

  • 创建和挂载启动所需的文件目录
  • 初始化和启动属性服务
  • 解析 init.rc 配置文件并启动 Zygote 进程。

僵尸进程与危害

在 UNIX/Linux 中,父进程使用 fork 创建子进程,在子进程终止后,如果父进程并不知道子进程已经终止了,这时子进程虽然已经退出了,但是在系统进程表中还为它保留了一定的信息(比如进程号、退出状态、运行时间等),这个子进程就被称为僵尸进程。系统进程表是一项有些有限资源,如果系统进程表被僵尸进程耗尽的话,系统就可能无法创建新的进程了。

为了防止僵尸进程,系统会在子进程(如 Zygote)暂停和终止时发出SIGCHLD信号,而signal_handler_init函数接收 SIGCHLD信号后(其内部只处理进程终止的SIGCHLD信号),会调用handle_signal函数,最终会找到Zygote进程并移除所有Zygote进程的信息,然后再重启Zygote进程。

Zygote进程

Zygote启动脚本位于:system/core/rootdir,根据不同的系统来启动不同的脚本

  • init.zygote32.rc 支持纯32位程序
  • init.zygote32_64.rc 32、64位程序都支持,只是32位作为主模式,63作为辅模式
  • init.zygote64.rc
  • init.zygote64_32.rc

最终在AndroidRuntime.cpp中通过 JNI 调用了 ZygoteInit 的main方法,而这个 ZygoteInit是Java语言编写的,这样 Zygote就从Native层进入了 Java框架层。

换句话说:Zygote开创了Java框架层。

Zygote启动工作总结:

  • 创建AppRuntime并调用其start方法,启动Zygote进程
  • 创建Java虚拟机并为Java虚拟机注册JNI方法。
  • 通过JNI调用ZygoteInit的 main 函数进入Zygote的Java框架层
  • 通过 registerZygoteSocket 方法创建服务器端Socket,并通过 runSelectLoop方法等待AMS的请求来创建新的应用程序进程
  • 启动SystemServer进程

相关文章

网友评论

      本文标题:Android系统启动

      本文链接:https://www.haomeiwen.com/subject/vnsmnctx.html