目录
ServiceManager,Zygote, SystemServer,三者之间的关系
kernel不需要的驱动
正则表达式下搜索: probe.+error
可看是否有驱动报错,没有用到的删除。
查看开机各阶段:
boot_progress|bootAnimation:|wm_boot_animation_done
boot_progress_start: 6914 标志着kernel启动完成。Zygote开始启动 此时界面还是现实开机静态图片
BootAnimation: BootAnimationStartTiming start time: 15202ms 界面开始开机动画
boot_progress_preload_start: 9509 Zygote开始加载资源
boot_progress_preload_end: 12251 Zygote加载资源结束
boot_progress_system_run: 12619 SystemServer开始启动
boot_progress_pms_start: 13424 PMS开始启动
boot_progress_pms_system_scan_start: 13482 PMS扫描/system目录下的安装包
boot_progress_pms_data_scan_start: 15598 PMS扫描/data目录下的安装包
boot_progress_pms_scan_end: 15633 PMS扫描结束
boot_progress_pms_ready: 16225 PMS初始化完毕
boot_progress_ams_ready: 22036 AMS就绪
android.intent.category.HOME: 先启动“Android正在启动” FallbackHome。
boot_progress_enable_screen: 24814 AMS启动完成后开始激活屏幕,从此以后
屏幕才能响应用户的触摸
wm_boot_animation_done: 27995 开机动画结束,这一步用户能直观感受到开
机结束
ACTION_LOCKED_BOOT_COMPLETED: Android7.0之后才有,在解锁前就会发出。
ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.launcher3/.Launcher} from uid 0, pid 0 启动launcher
wm_boot_animation_done:表示开机动画结束,一般统计到这个时间点。
过滤 SystemServerTiming 看子服务启动时间。
Zygote32Timing 查看zygote加载各资源消耗的时间,主要是preloaded-classes 耗时。
Android启动过程
- bootloader启动kernel.
- kernel启动后,首先启动init进程。
- system\core\init\Init.cpp。在里面搭建系统运行环境,并解析启动init.rc (init会启动service_manager 和zygote)。在init.zygote*.rc中启动app_process(即zygote进程)。app_progress 入口在app_main.cpp。 里面启动ZygoteInit 和RuntimeInit。
- ZygoteInit 里面启动 SystemServer,并用ZygoteServer注册一个socket,死循环等待AMS的信息来创建应用进程。
ServiceManager,Zygote, SystemServer,三者之间的关系
Android中SystemServer,Zygote,ServiceManager三者之间的关系_android 中 zygote与servicemanager 哪个先启动-CSDN博客
ServiceManager binder驱动的管理者,通过其找实际binder 实体。
zygote 孵化java进程,包括SystemServer, 上层服务集合体。
ServiceManager
- 用:
1)初始化binder驱动
2)将自身以“manager” 添加到servicemanager中的map集合中
3)注册成为binder驱动的上下问管理者
4) 给Looper设置callback,进入无限循环,处理client端发来的请求
Android Binder原理(四)ServiceManager的启动过程_servicemanager 是 由哪个进程启动的-CSDN博客
Zygote 启动流程
https://juejin.cn/post/6975756109881540622
AMS 通知zygote 创建应用是用的socket,而不是binder.
原因:
1.linux fork 不完美,子进程中binder线程的挂起和锁状态不可恢复。
2.zygote 和serviceManager 时两个进程,可能zygote要注册binder时,serviceManager还没初始化好。
SystemServer启动过程
1.设置时间、时区、语言等;
2.startBootstrapServices:读配置,启动开机必备的服务:AMS、PMS等等
startCoreServices:其他重要服务,DropBox、电池、应用使用情况服务等
startOtherServices:通知、蓝牙、wifi等设备相关服务。
3.在AMS的systemReady 中调用startHomeActivityLocked 启动launcher。
4.Launcher启动后,会在ActivityThread.handleResumeActivity中通过Idler 最终通过 finishBooting(里面设置sys.boot_completed 属性为1) 调用UserController.sendBootCompleted。这里涉及各种开机相关广播,在对credential-encrypted storage解锁后,BOOT_COMPLETED在UserController.finishUserUnlockedCompleted 中发出。
Launcher 启动流程
startHomeOnAllDisplays
RootWindowContainer.startHomeOnAllDisplays---startHomeOnDisplay -- startHomeOnTaskDisplayArea ---
resolveHomeActivity
getActivityStartController().startHomeActivity
主要的开机广播及其顺序
以下是 Android 系统启动过程中常见的开机广播及其大致触发顺序(从最早到最晚):
广播 Action | 触发时机 | 说明 |
---|---|---|
android.intent.action.PRE_BOOT_COMPLETED | 系统启动早期 | 在系统完成基本初始化后、用户数据加载前发送。通常用于需要极早启动的服务(如加密相关)。 |
android.intent.action.BOOT_COMPLETED | 系统启动完成 | 系统完全启动后发送,包括用户数据加载完成。这是最常用的开机广播。 |
android.intent.action.LOCKED_BOOT_COMPLETED | 系统启动早期(锁屏状态) | 在系统完成基本初始化后、用户解锁前发送,表示解锁之前的Direct Boot Mode 启动完成。适用于需要在锁屏状态下运行的服务(如闹钟、同步)。 |
android.intent.action.USER_UNLOCKED | 用户解锁后 | 用户解锁设备后发送,适用于需要用户登录后才能运行的服务(如账户同步)。 |
android.intent.action.USER_INITIALIZE | 新用户初始化 | 当新用户首次创建时发送(较少使用)。 |
开机广播发送时机
在Launcher启动时的handleResumeActivity,
ActivityTaskManagerService.activityIdle:
ActivityStackSupervisor.activityIdleInternalLocked:
checkFinishBootingLocked: 检查是否初始化完成,需要所有启动应用的主线程是空闲的
ActivityManagerService.finishBooting:
UserController.sendBootCompleted
finishUserBoot
ACTION_LOCKED_BOOT_COMPLETED 发送;
maybeUnlockUser
unlockUserCleared
finishUserUnlocking:发送 SYSTEM_USER_UNLOCK_MSG 信息,finishUserUnlocked
finishUserUnlockedCompleted:ACTION_BOOT_COMPLETED 这里发送开机广播
ActivityTaskManagerService.postFinishBooting:
参考资料: