Android启动过程

目录

kernel不需要的驱动

查看开机各阶段:

Android启动过程

ServiceManager,Zygote, SystemServer,三者之间的关系

ServiceManager

Zygote 启动流程

SystemServer启动过程

Launcher 启动流程

几种开机广播

开机广播发送时机



引用别人的图

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启动过程

  1. bootloader启动kernel.
  2. kernel启动后,首先启动init进程。
  3. system\core\init\Init.cpp。在里面搭建系统运行环境,并解析启动init.rc (init会启动service_manager 和zygote)。在init.zygote*.rc中启动app_process(即zygote进程)。app_progress 入口在app_main.cpp。 里面启动ZygoteInit 和RuntimeInit。
  4. ZygoteInit 里面启动 SystemServer,并用ZygoteServer注册一个socket,死循环等待AMS的信息来创建应用进程。

ServiceManager,Zygote, SystemServer,三者之间的关系

Android中SystemServer,Zygote,ServiceManager三者之间的关系_android 中 zygote与servicemanager 哪个先启动-CSDN博客

ServiceManager binder驱动的管理者,通过其找实际binder 实体。

zygote 孵化java进程,包括SystemServer, 上层服务集合体。

ServiceManager

  1. 用:

    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: 

参考资料:

开机广播BOOT_COMPLETED发送流程

Android10 系统发送开机广播时机

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值