从点击电源键到Activity展示给用户的流程

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

前言

最近一直在研究 Framework 相关知识,对于 App 的启动稍微看了下,正好用博文把它们总结下来,避免以后又忘了。

流程

  • 点击电源键
  • 启动 BootLoader
  • 启动 Linux 系统
  • 调用 init 进行初始化
  • 启动 Zygote 进程
  • 启动 SystemService
  • SystemService 进行一系列的 Service 初始化,其中包含 AMS(ActivityManagerService)
  • AMS 启动 Launcher
  • Launcher 从 PMS(PackageManagerService) 中读取 App 列表的数据,将 App 图标以及名字显示桌面上
  • 用户点击应用图标
  • Launcher 调用 Activity
  • Activity 通过 Context 调用 ContextWrapper 的方法
  • ContextWrapper 调用 Instrumentation 的 startActivity 方法
  • (8.0及以后)通过 IActivityManager 以 binder 方式通知 AMS
  • (7.0及以前)通过 ActivityManager 以 binder 方式通知 AMS,其中 ActivityManager 里面包含 AMN(ActivityManagerNative),AMN 调用 getDefault 获取 AMP(ActivityManagerProxy),再通过 AMP 通知 AMS。AMN 和 AMP 都是 ActivityManager 的内部类
  • AMS 通过 Socket 的方式与 Zygote 进程进行通信
  • Zygote 判断当前应用进程是否存在,若不存在,则 fork 自身进程作为应用进程
  • 进程创建和销毁的过程中会在进程表中进行注册或取消,避免出现僵尸进程,所谓的僵尸进程即该进程没有被使用,却一直运行着,可以抽象理解为内存泄漏
  • 进程创建成功后,AMS 会以 binder 方式与 ActivityThread 中的 ApplicationThread 进行联系
  • ApplicationThread 通过 变量名为 H 的Handler 发送 Message 消息
  • ActivityThread 轮询到 Message 消息后会启动 Activity
  • ActivityThread 调用 Activity 的生命周期方法
  • 在 onCreate() 方法中创建 Window 对象,其中,该 Window 为 PhoneWindow,并创建 WindowManager 进行管理,该 WindowManager 的实现类为 WindowMangerImpl,WindowMangerImpl 通过桥接方式,大部分方法为直接调用 WindowMangerGlobal 单例中的方法
  • 创建 DecorView 和 ViewRootImpl
  • 将布局通过 setContentView() 方法加入 DecorView 中
  • WindowMangerGlobal 通过 ViewRootImpl 发送 Session 到 WMS(WindowMangerService)
  • WMS 有两个操作
    • AddWindow:
      • 检查是否合法
      • Window Token 和 Window State
      • 将 ViewRootImpl、layout、view 分别加入三个列表中
    • RemoveWindow:
      • 判断线程正确性,只有创建该 window 的线程才能调用
      • 将 ViewRootImpl、layout、view 分别从三个列表中进行移除
      • 判断是否能够 delete,假如动画还在执行,要等动画执行完才能移除
      • delete
分类:
Android