天天看点

android系统启动流程分析:

(一)

1).

init进程启动控制台进程

init进程启动servicemanager进程(即runtime进程)

=> 打开/dev/binder等,并设置自己为runtime(context),用于对系统中的所有服务进行统一管理

init进程启动vold/debuggerd/rild进程

2).

init进程启动Zygote进程

3).

runtime进程请求Zygote启动SystemServer进程

4).

SystemServer进程启动两个本地服务: SurfaceFlinger/AudioFlinger

SurfaceFlinger/AudioFlinger向ServiceManager注册

5).

SystemServer进程启动其他Android服务(如WindowManager)

所有的Android服务向ServiceManager注册

(二)

android_src/system/core/init.c

parse_config_file("/init.rc")

snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware)

parse_config_file(tmp)

action_for_each_trigger("init", action_add_queue_tail) // 运行脚本文件中的on init段

action_for_each_trigger("early-boot", action_add_queue_tail);

action_for_each_trigger("boot", action_add_queue_tail);

(三)

init.rc

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

frameworks/base/cmds/app_process/app_main.cpp

main()

Step 1 => 解析虚拟机的运行参数

Step 2 => 解析dexopt运行参数

Step 3 => 初始化VM虚拟机(Initialize the VM) : 这里启动虚拟机后,这以后就可以运行java代码了

Step 4 => 初始化JNI模块(注册android函数) : 这以后,CPP和JAVA代码之间就可以互相函数调用了

Step 5 => 启动VM虚拟机(Start VM.  This thread becomes the main thread of the VM, and will not return until the VM exits)

Step 6 => 启动进程system_server => 该进程会启动android的后续全部进程

Step 7 => 启动SurfaceFlinger和AudioFlinger  

打开/dev/pmem设备:

开始android机器人开机动画的显示:

Step 8 => 启动其他的各种服务并将这些服务添加到ServiceManager中: 如PowerManager,ActivityManager,WindowManager,InputMethodManagerService,...

这里将启动android系统上电后用户看到的第一个锁屏显示界面(HomeApp) => 最后SystemServer::init2 将会调用 ActivityManagerService.systemReady 通过发送Intent.CATEGORY_HOME intent来启动第一个 activity 

          然后开始等待新的android应用启动请求(提供fork()服务)

(四)

android系统启动流程分析: