• 面试:系统启动流程简介


    SystemServer服务和ServiceManager服务分析

    SystemServer服务和ServiceManager服务分析_站在巨人的肩膀上,温故而知新的博客-CSDN博客_systemservicemanager

    SystemServer vs ServiceManager_Eliot_shao的博客-CSDN博客

    整体启动流程: 

    启动用户级别的第一个进程: init 进程。init 进程会解析init.rc 脚 本 做一些初始化工作,包括挂载文件系统、创建工作目录以及启动系统服务进程等,其中系统服务进程包括 Zygote、service manager、media 等 。在 Zygote 中 会 进 一 步 去 启 动 system_ server进 程 , 然 后 在 system_server 进 程 中 会 启 动 AMS、WMS、PMS 等 服 务 ,等 这 些 服 务 启 动 之 后 ,AMS 中 就 会 打 开 Launcher 应 用 的 home Activity, 最 终 就 看 到 了 手 机 的 "桌 面 "。

    一、SystemServer服务分析

    1、SystemServer概述

    SystemServer是Android系统的一个核心进程,它是由zygote进程创建的,因此在android的启动过程中位于zygote之后。android的所有服务循环都是建立在 SystemServer之上的。在SystemServer中,将可以看到它建立了android中的大部分服务,并通过ServerManager的add_service方法把这些服务加入到了ServiceManager的svclist中。从而完成ServcieManager对服务的管理。

    2、SystemServer启动的服务

    二、ServiceManager服务分析

    2.1 ServiceManager服务概述

    (1) 服务进程,是android系统的核心服务之一
    (2) 系统服务管理:管理系统和应用向系统添加的服务
    (3) 查询获取服务:响应client请求并返回相应的服务
    Android应用如果想要获取某个系统服务,这个系统服务需要提前添加到ServiceManager中。如果ServiceManager异常退出,系统会重启。如果该服务重启,系统会重启zygote,surfaceflinger,media等服务。

    2.2 ServiceManager是何时创建的?

    ServiceManager是由init进程通过解析init.rc文件而创建的,其所对应的可执行程序/system/bin/servicemanager,所对应的源文件是service_manager.c。

    1. service servicemanager /system/bin/servicemanager
    2. class core
    3. user system
    4. group system
    5. critical
    6. onrestart restart healthd
    7. onrestart restart zygote
    8. onrestart restart media
    9. onrestart restart surfaceflinger
    10. onrestart restart drm

    从这里可以看出servicemanager 是init通过init.rc加载的第一个进程,接下来启动了zygote和media 

    ServiceManager管理服务

    (1) 系统或Android应用进程发送添加系统服务的请求,通过binder进程间通信到ServiceManager进程处理,然后检查发起请求的进程的权限,再检查该服务是否已经存在,如果存在直接返回;如果不存在,将该服务添加到Service List里。
    (2) 获取该服务时也是通过binder进程间通信到ServiceManager进程处理,查询Service List找出该Service,然后返回。

    简单小结:

    init.rc --> servicemanager --> zygote --> fork的第一个进程 system_server --> 开启AMS/WMS...并注册到servicemanager进程中,向外提供服务。

    Activity启动解析

    如何评价360的Android插件化框架RePlugin? - 知乎

    1. 调用Context.startActivity -> ActivityManagerNative -> AMS, AMS通过Intent从PMS拿到ActivityInfo并创建ActivityRecord和token放入前台ActivityStack,接着按需启动Activity所属进程
    2. 进程启动后,马上执行入口ActivityThread.main并调用attachApplication将启动信息反馈到AMS,AMS通过pid找到对应的ProcessRecord并更新其数据
    3. 从前台ActivityStack中拿到栈顶的ActivityRecord,如果其proecssrecord为null,并且uid和processname跟新创建的ProcessRecord一致,则正式调用app.thread.scheduleLaunchActivity
    4. ActivityThread在scheduleLaunchActivity中创建ActivityClientRecord,用于跟AMS中的ActivityRecord对应,ActivityClientRecord最重要的两个字段是token和activityinfo,token用于关联ActivityRecord,activityinfo则包含activity的描述和所属包等信息
    5. 在scheduleLaunchActivity内部接着发送LAUNCH_ACTIVITY message到mH这个handler,mH收到LAUNCH_ACTIVITY message后

    三、AMS启动做了啥事

    主要负责系统中 四大组件 的启动、切换、调度及应用程序的管理和调度等工作。

    • AMS是在SystemServer进程中进行创建并启动的
    • 在AMS的服务启动过程中,通过构造函数进行了一些对象的创建和初始化工作(初Activity外其他3大组件的列表和调度对象的创建;内存、电池、权限、CPU等的监控等等相关对象的创建),并且通过start()方法启动服务(移除进程组、启动CPU线程、权限注册、电池服务等等)。

    AMS启动详解 - 掘金

  • 相关阅读:
    qrcodejs2 生成二维码 并上传oss
    1Panel应用推荐:Uptime Kuma
    uniapp配置了pages.json 的 tabbar 国际化,小程序切换语言没有实时切换
    js实现日历 完整版
    linux网络编程之TCP协议编程
    javaI/O包中的包装模式
    react--电商商品列表使用
    一.基础算法
    pip 更新命令使用和报错解决
    虹科分享 | 如何测试与验证复杂的FPGA设计(1)——面向实体或块的仿真
  • 原文地址:https://blog.csdn.net/cpcpcp123/article/details/127990404