init.rc —— 从kernel Log查看
Android是基于Linux内核的系统,因此Android的启动过程是分为两个阶段的:
- 第一个阶段就是Linux内核的启动
- 第二个阶段就是Android框架的启动(包括核心服务和程序)。
看了Android系统启动、init进程 – 干了啥事有点感觉,还是云里雾里,现在查看实际Log印证一下
获取kernel Log日志
获取权限问题,通过 adb bugreport 获取 bugreport-XXXXX-2021-01-04-15-28-49.zip包
init main 几个阶段
与init进程 – 干了啥事对照,FirstStageMain(argc, argv) -> SetupSelinux(argv) -> SecondStageMain(argc, argv)
LoadBootScripts相关init.rc解析执行
Log比较少,还是可以看到 rc 文件加载,以及service启动等,关键Log可查看init:
确实Log少的可怜,一般公司都会添加调试Log
触发器的执行顺序为on early-init -> init -> late-init
Log 没有 init.rc 相关触发执行相关节点日志,从 init.rc 文件查看一下🙈
调试查看重启on nonencrypted
触发class_start main
启动zygote服务的class main
# Cgroups are mounted right before early-init using list from /etc/cgroups.json
on early-init
# ...... ......
start ueventd
# ...... ......
# Mount tracefs
mount tracefs tracefs /sys/kernel/tracing
# Run boringssl self test for each ABI so that later processes can skip it. http://b/139348610
on early-init && property:ro.product.cpu.abilist32=*
exec_start boringssl_self_test32
on early-init && property:ro.product.cpu.abilist64=*
exec_start boringssl_self_test64
# ...... ......
# ...... ......
on init
# ...... ......
mkdir /mnt/user 0755 root root
mkdir /mnt/user/0 0755 root root
mkdir /mnt/user/0/self 0755 root root
mkdir /mnt/user/0/emulated 0755 root root
mkdir /mnt/user/0/emulated/0 0755 root root
# ...... ......
# Symlink to keep legacy apps working in multi-user world
symlink /storage/self/primary /mnt/sdcard
symlink /mnt/user/0/primary /mnt/runtime/default/self/primary
# ...... ......
# Start logd before any other services run to ensure we capture all of their logs.
start logd
# Start lmkd before any other services run so that it can register them
chown root system /sys/module/lowmemorykiller/parameters/adj
chmod 0664 /sys/module/lowmemorykiller/parameters/adj
chown root system /sys/module/lowmemorykiller/parameters/minfree
chmod 0664 /sys/module/lowmemorykiller/parameters/minfree
start lmkd
# Start essential services.
start servicemanager
start hwservicemanager
start vndservicemanager
# ...... ......
# ...... ......
# Mount filesystems and start core system services.
on late-init
trigger early-fs
# Mount fstab in init.{$device}.rc by mount_all command. Optional parameter
# '--early' can be specified to skip entries with 'latemount'.
# /system and /vendor must be mounted by the end of the fs stage,
# while /data is optional.
trigger fs
trigger post-fs
# Mount fstab in init.{$device}.rc by mount_all with '--late' parameter
# to only mount entries with 'latemount'. This is needed if '--early' is
# specified in the previous mount_all command on the fs stage.
# With /system mounted and properties form /system + /factory available,
# some services can be started.
trigger late-fs
# Now we can mount /data. File encryption requires keymaster to decrypt
# /data, which in turn can only be loaded when system properties are present.
trigger post-fs-data
# Load persist properties and override properties (if enabled) from /data.
trigger load_persist_props_action
# Should be before netd, but after apex, properties and logging is available.
trigger load_bpf_programs
# Now we can start zygote for devices with file based encryption
trigger zygote-start
# Remove a file to wake up anything waiting for firmware.
trigger firmware_mounts_complete
trigger early-boot
trigger boot
# ...... ......
# ...... ......
on boot
# ...... ......
# limit discard size to 128MB in order to avoid long IO latency
# for filesystem tuning first (dm or sda)
# Note that, if dm-<num> is used, sda/mmcblk0 should be tuned in vendor/init.rc
write /sys/devices/virtual/block/${dev.mnt.blk.data}/queue/discard_max_bytes 134217728
# ...... ......
# Start standard binderized HAL daemons
class_start hal
class_start core
# Requires keystore (currently a core service) to be ready first.
exec -- /system/bin/fsverity_init
on nonencrypted
class_start main
class_start late_start
on property:sys.init_log_level=*
loglevel ${sys.init_log_level}
on charger
class_start charger
on property:vold.decrypt=trigger_load_persist_props
load_persist_props
start logd
start logd-reinit
on property:vold.decrypt=trigger_post_fs_data
trigger post-fs-data
trigger zygote-start
on property:vold.decrypt=trigger_restart_min_framework
# A/B update verifier that marks a successful boot.
exec_start update_verifier
class_start main
on property:vold.decrypt=trigger_restart_framework
# A/B update verifier that marks a successful boot.
exec_start update_verifier
class_start_post_data hal
class_start_post_data core
class_start main
class_start late_start
setprop service.bootanim.exit 0
start bootanim