目录
内核空间创建线程
https://cloud.tencent.com/developer/article/1842304
用户空间创建线程
https://cloud.tencent.com/developer/article/1842307
kernel 到android核心启动过程
kernel镜像执行跳转到start_kernel开始执行,在rest_init会创建两个kernel 进程(线程),其分别是为kernel_init 与kthreadd,创建完后系统通过init_idle_bootup_task蜕化为idle进程(cpu_idle)。
kthreadd作用是管理调度其它的内核线程;idle 进程就是cpu 空闲会执行;kernel_init主要加载初始化设备驱动,之后在run_init_process通过execv执行init镜像变身(pid 不变,镜像变了)为用户态init 进程,执行init 解析.rc 启动native服务,创建zygote进程就进入到android。
static int __init hottemptature_watchdog_init(void)
arch_initcall_sync(hottemptature_watchdog_init)
这里的hottemptature_watchdog_init在do_initcalls函数中执行,其被调用的过程为start_kernel -> rest_init-> kernel_init -> do_basic_setup-> do_initcalls
init 启动过程
Android 10.0系统启动之init进程-[Android取经之路]_IngresGe的博客-CSDN博客_run_init_process
调用kernel_thread()创建1号内核线程, 该线程随后转向用户空间, 演变为init进程
调用kernel_thread()创建kthreadd内核线程。
init_idle_bootup_task():当前0号进程init_task最终会退化成idle进程,所以这里调用init_idle_bootup_task()函数,让init_task进程隶属到idle调度类中。即选择idle的调度相关函数。
调用schedule()函数切换当前进程,在调用该函数之前,Linux系统中只有两个进程,即0号进程init_task和1号进程kernel_init,其中kernel_init进程也是刚刚被创建的。调用该函数后,1号进程kernel_init将会运行!
调用cpu_idle(),0号线程进入idle函数的循环,在该循环中会周期性地检查
kernel_init 中会执行/init(ramdisk_execute_command的值为"/init")
service ueventd /system/bin/ueventd
class core
critical
seclabel u:r:ueventd:s0
shutdown critical
on early-init
start ueventd
/init 启动后执行/system/core/init/main.cpp 中main 方法,这里执行FirstStageMain()
system/core/init/first_stage_init.cpp
FirstStageMain()中通过execv 执行/system/bin/init,参数为selinux_setup。这里init 跟/init 一样,因此再次执行init 镜像。这里如果是重启到bootloader,会执行InstallRebootSignalHandlers
SetupSelinux 中再次执行init,这里会注册信号处理函数
从而参数second_stage,执行SecondStageMain ,在这里解析.rc ,启动ueventd,并等待其启动完成。
init 镜像通过execv会执行两次,分别通过FirstStageMain和SecondStageMain执行。
FirstStageMain主要操作
- 设置环境变量
- 创建并挂载相关的文件系统
- 重定向输入输出/内核Log系统
- 初始化AVB版本
- 初始化Selinux
SecondStageMain阶段主要操作
- 设置会话密钥环
- 初始化属性
- 处理内核命令
- 清除上一个阶段环境变量
- Selinux策略加载
- Selinux属性重置
- 创建epoll句柄
- 启动属性服务
- 加载bootscript,解析*.rc文件
- 触发执行early-init,启动ueventd
- 执行Action
- 触发执行init,启动servicemanager,启动binder
- 触发执行late-init,触发early-fs,启动vold
- 触发fs,解析fstab,挂载data分区,检查加密要求,执行触发nonencrypted
- 触发post-fs、late-fs,启动keymaster服务
- 触发post-fs-data,installkey对data分区做文件加密,init_user0进行CE加密,加载data分区下persist属性
- 触发on boot ,class_start core 中启动surfaceflinger ,class_start main 中启动zygote
Zygote 启动过程
System_Server与Zygote共存亡_空白的泡的博客-CSDN博客
System_server 跟zygote 共亡
Zygote从frameworks/base/cmds/app_process/app_main.cpp的main()函数开始
Zygote 是init 通过解析.rc文件启动的。
service zygote /system/bin/app_process32 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
class main
service zygote_secondary /system/bin/app_process64 -Xzygote /system/bin --zygote --socket-name=zygote_secondary
class main
这里分32 位和64位,以32为为主,64位为辅。
app_process32(64)可执行程序对应app_main文件中main 方法。
Zygote流程总结:
- 创建AppRuntime对象,并调用它的start。此后的活动则由AppRuntime来控制。
- 调用startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
- 通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了Java世界。
- 调用registerZygoteSocket响应应用创建请求,同时Zygote调用preload来加载framework 类、资源、库等来创建公共java 环境,后面应用共享。
- Zygote通过startSystemServer创建子进程system_server来为Java世界服务。
- Zygote完成了Java世界的初创工作,下一步该做的就是调用runSelectLoopMode后一直等待应用进程的请求
开机动画播放过程
开机动画是init 通过解析.rc文件启动的。
<Android10.0 开机广播BOOT_COMPLETED发送流程分析_skytoby的博客-CSDN博客_android boot complete发送时机>
service surfaceflinger /system/bin/surfaceflinger
class core animation
开机动画启动,对应main_surfaceflinger文件中main方法,bootanimation_main文件中main方法。
开机动画播放过程:
- init 解析.rc 启动surfaceflinger 播放动画,紧接着会启动zygote从而进入android;
- 在android 启动过程,在用户手机解密后(FBE 加密方式data解密完成),AMS会收到ACTION_USER_UNLOCK广播,就会启动launcher,通过socket 向zygote 发送请求,创建launcher 进程后AMS启动加载TopActivity桌面;
- launcher 进程加载完在空闲时会发送activityIdle 消失给到AMS,AMS 收到消息会通过WMS发起bootFnished 命令码binder 调用到surfaceflinger;
- surfaceflinger 会设置service.bootanim.exit为1,bootanimation 检测到为1就会退出动画播放
system_server 启动过程
system_server启动就是执行com.android.server.SystemServer类中main方法。
Systemserver启动流程总结:
- Zygote调用startSystemServer创建fork system_server进程;
- system_server进程执行com.android.server.SystemServer的main函数,主要工作
1、加载libandroid_server.so并调用native_init方法;
2、创建SystemServerManagr,管理启动各个服务对应的Manager;
3、通过下面的方法启动一些系统服务
startBootstrapServices()
startCoreServices()
startOtherServices()
4、进入消息循环,等待请求;