开机启动流程
启动一个Android手机的步骤是:
- 按电源键
- 进入开机动画
- 经过漫长的等待
- 开机动画结束
- 正式开机,进入设置画面
- 进入系统桌面(Launcher)
Bootloader引导
当电源按下时,引导芯片代码 从 ROM (4G)开始执行。Bootloader引导程序把操作系统映像文件拷贝到
RAM中去,然后跳转到它的入口处去执行,启动Linux内核。
主要负责对kenel进行解压和初始化的工作
idle进程
kernel中的idle进程是0号进程,由内核中启动,并始终执行在内核态,
由内核态的idle进程开启我们常提的1号进程,init(对应源码,system/core/init/init.cpp)
init进程
“天字号”进程,但是经过我们上面的分析,其实它并不是开天辟地的始祖,他也是由idle创建的
主要任务是解析 init.rc 配置文件并启动 Zygote , servicemanager等进程
import /init.environ.rc
import /system/etc/init/hw/init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /system/etc/init/hw/init.usb.configfs.rc
import /system/etc/init/hw/init.${ro.zygote}.rc
如下所示,init的父进程是0号idle进程
USER PID PPID VSIZE RSS WCHAN PC NAME
aosp:/ # ps | grep "1 "
root 1 0 8216 2056 0 c7fffc10 S /init
root 783 1 3024 1428 0 c7fffc10 S /sbin/ueventd
system 1073 1 5868 2124 0 c7f28c10 S /system/bin/servicemanager
root 1074 1 48060 6116 0 c7f28c10 S /system/bin/surfaceflinger
root 1080 1 1124684 75268 0 c7f28c10 S zygote
audioserver 1081 1 41576 6788 0 c7f28c10 S /system/bin/audioserver
cameraserver 1082 1 36680 6140 0 c7f28c10 S /system/bin/cameraserver
media 1089 1 72824 12608 0 c7f28c10 S /system/bin/mediaserver
zygote进程启动
进程入口:framework/base/cmds/app_process/app_main
- 孵化其他应用程序进程,所有的应用的进程都是由zygote进程fork出来的。
通过创建服务端Socket,等待AMS的请求来创建新的应用程序进程。 - 创建SystemServer进程,在Zygote进程启动之后,会通过ZygoteInit的main方法fork出SystemServer进程
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 exec_background - system system -- /system/bin/vdc volume abort_fuse
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
由zigote创建的进程
aosp:/ # ps | grep "1080"
root 1080 1 1124684 75268 0 c7f28c10 S zygote
system 1266 1080 1277624 115916 0 c7f28c10 S system_server
radio 1455 1080 1086252 84392 0 c7f28c10 S com.android.phone
u0_a17 1462 1080 1209704 142496 0 c7f28c10 S com.android.systemui
system 1536 1080 1099024 79508 0 c7f28c10 S com.android.settings
u0_a8 1646 1080 1065556 53912 0 c7f28c10 S android.ext.services
system 1673 1080 1085972 63144 0 c7f28c10 S com.android.coreservice
u0_a7 1679 1080 1075960 75232 0 c7f28c10 S android.process.media
u0_a28 1705 1080 1114972 110280 0 c7f28c10 S com.android.launcher3
system 1711 1080 1066764 55988 0 c7f28c10 S com.android.keychain
u0_a31 1743 1080 1067748 58176 0 c7f28c10 S com.android.printspooler
u0_a2 1787 1080 1067892 54448 0 c7f28c10 S com.android.carrierconfig
u0_a11 1809 1080 1066544 54732 0 c7f28c10 S com.android.managedprovisioning
u0_a1 1826 1080 1068220 65096 0 c7f28c10 S com.android.providers.calendar
u0_a30 1849 1080 1067212 64140 0 c7f28c10 S com.android.inputmethod.pinyin
systemServer进程启动
- 创建SystemServiceManager,一个普通类,它用来对系统服务进行创建、启动和生命周期管理。
- ServerManager.startService启动各种系统服务:WMS/PMS/AMS等,
- 调用ServerManager的addService
方,将这些Service服务注册到创建SystemServiceManagerr里面