Android系统启动流程分析
Android系统启动流程简单分析
系统启动的大致流程为:
当Kernel启动过程会创建init进程。
init进程会启动servicemanager(binder服务管家), Zygote进程(Java进程的鼻祖).
Zygote进程会创建 system_server进程以及各种app进程,
1.先看下init进程怎么去创建zygote进程
init进程去解析所有的init.*.rc文件
init.*.rc是一个配置文件里面采用特殊语法
比如启动zygote进程在这个文件中
system/core/rootdir/init.zygote64.rc
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server class main priority -20 user root group root readproc reserved_disk socket zygote stream 660 root system socket usap_pool_primary stream 660 root system onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart audioserver onrestart restart cameraserver onrestart restart media onrestart restart netd onrestart restart wificond writepid /dev/cpuset/foreground/tasks
service表示服务,zygote表示服务名称,不能重复。
/system/bin/app_precess64是linux的可执行文件。
编译系统之后生成目录为:
out/target/product/sailfish/symbols/system/bin/app_process64
这个app_process64是哪里来的呢?
其实是安卓系统编译过程中生成的具体看下这个目录:
frameworks/base/cmds/app_process
其中Android.mk
... #这个是编译的cpp文件 app_process_src_files := \ app_main.cpp \ ... LOCAL_MODULE:= app_process LOCAL_MULTILIB := both LOCAL_MODULE_STEM_32 := app_process32 LOCAL_MODULE_STEM_64 := app_process64 #生成的名字 ...
所以/system/bin/app_process64运行时走的就是app_main.app,那么它的入口就是app_main.app的main()方法
简单总结一下就是:
init进程通过解析*.rc文件,然后去执行一个预先编译好的可执行文件/system/bin/app_process64,
然后进入zygote的app_main.app的main()方法。
zygoe的启动过程晚点在分析
2.zygote进程fork创建system_server进程
从app_main.main()方法一路向下执行,那么什么时候启动的system_server进程的。
forkSystemServer()方法中通过linux的fork去创建system_server进程
fork是怎么个操作呢,
fork是linux的一个方法,采用copy-on-write(这是什么意思呢,晚点再说好吧)机制,把zygote这个进程拷贝一份,改一下进程的pid,那么就是一个新进程了。
怎么启动system_server的呢?答案是通过反射,怎么触发的反射先不管,反正最后就是通过反射调用到system_server进程里面去了。
反射SystemServer类的main()方法,然后执行
你说反射怎么就定位到SystemServer类了呢,其实是写死的参数,就是上面说的forkSystemServer()方法里面
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
看下面这个args[]数组,就是通过解析这个数组,拿到类名"com.android.server.SystemServer"
,
然后通过类名反射它的class,在去反射调用main()方法
private static Runnable forkSystemServer(String abiList, String socketName, ZygoteServer zygoteServer) { ... /* Hardcoded command line to start the system server */ String args[] = { "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023," + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010", "--capabilities=" + capabilities + "," + capabilities, "--nice-name=system_server", "--runtime-args", "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT, "com.android.server.SystemServer", }; ... }
所以到现在三个进程的关系已经说明白了:
kernel创建init进程,init进程通过linux的可执行文件/system/app/app_process,创建zygote进程,zygote进程再fork出system_server金恒通过写死的参数,反射调用SystemServer类的main()方法。
system_server进程创建AMS,PMS,WMS等系统服务当AMS准备完毕后去启动Luncher。到这里安卓系统就启动完毕了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库