学习思路,重在理解,多看几遍,难度较深。涉及java,c,c++
Zyugote(孵化器)进程是什么?
一、linux启动:
bootloader
kernel
二、android系统启动-Init.rc启动(system/bin下的系统启动配置文件、脚本)
/system/bin/ServiceManager--Binder守护进程(和界面无关,会持续运行在后台,会用来接收响应和维持系统运营。apache服务器的服务监听就是个守护进程)
Runtime
Zygote-app_process/App_main
Start VM
System Server
start android services-Register to ServiceManager
start launcher
uml图
/system/bin/ServiceManager
Zygote----app_main.cpp:main()
AndroidRuntime.cpp:start()
JNI invoke
ZygoteInit.java:main()
SystemServer.java:
main()
init1()
com_android_server_systemService.cpp
system_init.cpp
init2() 调用runtime->callStatic
(),启动ServerThread(核心服务在这里):
PowerManagerService
ActivityManagerService
WindowManagerService
PackageManagerService(最重要的,应用程序靠这个启动)
...
跟踪代码。
Init.rc(system/core/)两处关键启动:
service servicemanager /system/bin/servicemanager(守护进程,早于启动虚拟机)
service zygote /system/bin/app_process ...(启动系统服务)
ServiceManager.cpp
start() (运行在后台,让后面虚拟机启动,池的启动有个正常的环境)
app_main.cpp(类)
main() 添加虚拟机参数;设置了一个进程,名为zygote;runtime.start()启动了一个类ZygoteInit;runtime是个AppRuntime类;猜ZygoteInit是孵化虚拟机的,每启动一个应用都启动一个虚拟机
zytogeInit.java
main() startSystemServer()启动系统服务;永久的循环监听,一直运行runSelectLoopMode() (socket通讯也会这样做),得到socket通讯的请求,来启动一个虚拟机(startSystemServer()启动虚拟机,名字叫SystemServer)。
SystemServer.java(framework下)
main()调用Init1()是个native JNI的调用。找到对应文件夹的cpp源文件/frameworks/base/services/jni/com_android_server_SystemServer.cpp
com_android_server_SystemServer.cpp
c的动态链接extern "C" int system_init();
system_init.cpp
runtime->callStatic 调回去SystemServer,init2方法
SystemServer.java
Init2()启动线程ServerThread()---每个系统的service的启动线程,开机就启动,远程的;
ServerThread()中PackageManagerService等系统service的启动。
此后再启动launcher,完成启动。
三、应用程序启动-Running PackageManager