Flowchart0.png
開機啟動流程
啟動一個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里面