Android系统启动流程简析

一、从init进程创建开始

Linux kerner启动后调用到system/core/init/init.cpp的main()方法

init进程的作用:

  • 解析init.rc文件
  • 通过init.rc创建设备驱动结点
  • 提供属性服务
  • 启动Zygote进程(启动的细节不分析)

二、启动Zygote进程:

Zygote进程是Android系统的首个Java进程,Zygote是所有Java进程的父进程,包括 system_server进程以及所有的App进程都是Zygote的子进程。

主要操作:

  • 创建java虚拟机,注册JNI方法
  • fork system_server进程
  • 调用runSelectLoop()待命,当收到创建新进程请求时,继续工作

主要会执行frameworks/base/cmds/app_process/App_main.cpp的main方法

辗转到/frameworks/base/core/java/com/android/internal/os/Zygote.java

三、构建system_server进程

system_server进程是用于管理整个Java framework层,包含ActivityManager,PowerManager等各种系统服务。

在Zygote的初始化过程中构建system_server进程

从main方法开始->startSystemServer-->Zygote.forkSystemServer 创建system_server

startSystemServer会抛出MethodAndArgsCaller异常-->caller.run

(从异常信息中看到调用栈信息

at com.android.server.SystemServer.main(SystemServer.java:175)

at java.lang.reflect.Method.invoke!(Native method)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628))

这里使用了反射调用到SystemServer.main方法(采用抛出异常,然后捕获的方法,来清空栈帧,提升利用率)

然后在SystemServer.main中开始一系列的调用

启动主线程,构建Looper,并进入Looper.loop(),等待其他线程的消息

四、构建一般app进程

要构建新的app进程一般从startActivity/startService开始,即App发起进程(当从桌面启动应用,则发起进程便是Launcher所在进程;当从某App内启动远程进程,则发送进程便是该App所在进程。发起进程先通过binder发送消息给system_server进程)

system_server进程(调用Process.start()方法,通过socket向zygote进程发送创建新进程的请求)

zygote进程(在执行ZygoteInit.main()后便进入runSelectLoop()循环体内,runSelectLoop方法一直在循环检测,当有客户端连接时便会执行ZygoteConnection.runOnce()方法,再经过层层调用后fork出新的应用进程

新进程(执行handleChildProc方法,最后调用ActivityThread.main()方法

/frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java

ZygoteConnection.runOnce->Zygote.forkAndSpecialize(构建新的进程完成后后续在该进程中做相关的处理,如调到ActivityThread.main进行applicatoin的构建等)->handleChildProc->RuntimeInit.zygoteInit

/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

RuntimeInit.zygoteInit->applicationInit->invokeStaticMain(构建ActivityThread反射调用的参数)

在invokeStaticMain方法中同样抛出ZygoteInit.MethodAndArgsCaller,最终在runSelectLoop的调用者ZygoteInit.main中

捕获异常,利用反射调用到ActivityThread.main方法

这里与构建system_server时调用SystemServer.main的方式如出一辙,ZygoteInit.startSystemServer是抛出该异常的方法

results for ""

    No results matching ""