分类: LINUX
2011-07-25 11:56:09
(一)
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()服务)
(四)