android从点击图标icon到进入首页的系统调用过程

一、总览(参与者)

Launcher(三方/系统桌面) → ActivityTaskManagerService(ATMS in system_server)

→(无进程则)Zygote → app 进程(ActivityThread) → WindowManagerService(WMS)/SurfaceFlinger


二、冷启动:逐步调用链

1) 点图标(从输入到 Intent)

  1. 用户触摸 → InputDispatcher 投递给前台窗口(Launcher)。
  2. Launcher 的 onClick 里构造启动 Intent(标准 MAIN/LAUNCHER):
scss 复制代码
Intent(ACTION_MAIN).addCategory(CATEGORY_LAUNCHER)
    .setPackage(pkg).setClassName(pkg, mainActivity)
    .addFlags(FLAG_ACTIVITY_NEW_TASK)
  1. startActivity() 通过 Binder 调到 ATMS(IActivityTaskManager.startActivity)。

2) system_server:解析与建任务

  1. ATMS → ActivityStartController/ActivityStarter:解析 Intent、校验权限、查 PackageManager 得到 ActivityInfo。

  2. 选择/创建 Task(任务栈,Android 12+ 的 Task/TaskDisplayArea),决定是否复用已有栈(单例/任务亲和)。

  3. 查目标应用是否已有 进程记录(ProcessRecord):

    • 没有进程 → 进入"拉起进程"。

    • 已有进程 → 直接发"启动 Activity"事务。

3) 拉起应用进程(Zygote 分叉)

  1. ATMS/ActivityManager → ProcessList.startProcessLocked → ZygoteProcess#start

    通过 zygote socket 把进程参数发给 Zygote。

  2. Zygote 执行 fork() (真正的 Linux 系统调用),子进程进入 RuntimeInit.zygoteInit():

    • 设置类加载器、Binder 进程状态;

    • 调用 ActivityThread.main()。

4) 应用进程:主线程就绪与绑定

  1. ActivityThread.main() :Looper.prepareMainLooper() → 开消息循环;

    通过 Binder 回调 IActivityManager.attachApplication 通知 AMS:"我起来了"。

  2. AMS.attachApplicationLocked:把应用和系统一一对接,然后回调到应用进程:

    • bindApplication(ClientTransaction):进程级初始化。
  3. ActivityThread.handleBindApplication

    • 安装 ContentProvider(先于 Application);

    • 创建 Application 并调用 Application.onCreate()

5) 启动首页 Activity(生命周期)

  1. AMS 发送 LaunchActivity 事务(ClientTransaction)给应用。

  2. ActivityThread.handleLaunchActivity → performLaunchActivity

    • 反射创建 MainActivity、attach();
    • 回调 onCreate() (通常在这里 setContentView);
    • 回调 onStart()
  3. onResume() :Activity 进入 Resumed,准备绘制首帧。

6) 建窗口与绘制首帧(可见)

  1. 创建 PhoneWindow/DecorView,WindowManagerGlobal.addView() → BinderWMS 新建窗口(SurfaceControl)。

  2. ViewRootImpl 建立渲染管线:Choreographer 安排 VSYNC 帧回调 → performTraversals()(measure/layout/draw)。

  3. 首帧提交到 SurfaceFlinger 合成;WMS 标记窗口 DRAWN → 过渡动画完成 → 首页可见

    (Android 12+ 如使用 SplashScreen API,在 onResume 前后由系统/主题层显示/移除启动画面)

日志里关键点****

  • I ActivityManager: Start proc(拉起)

  • ActivityTaskManager: START u0 {...}(发起启动)

  • Timeline: Activity_launch_request / Displayed pkg/.Main (xxx ms)(首帧)


三、热/温启动差异

  • 热启动(Hot) :Activity 仍在前台 Task 的栈顶但不可见(比如 Home 回桌面再点图标)。

    • 进程、Activity、View 都在;路径≈ 直接 bringToFront + onRestart → onStart → onResume,无 fork、无 Application 创建,首帧极快。
  • 温启动(Warm) :进程在但 Activity 被销毁(或仅 Task 在)。

    • 路径跳过 Zygote,**从"5) 启动首页 Activity"**开始;Application.onCreate 不会再调

四、生命周期与回调顺序(冷启动常见顺序)

  1. Application.onCreate()

  2. Activity.onCreate()

  3. Activity.onStart()

  4. Activity.onResume()

    5)(首帧绘制完成后可上报)reportFullyDrawn()

ContentProvider.onCreate() 在 Application 之前。
使用 SplashScreen 时,系统在 onResume 早期持有启动画面,直到首帧 ready 再移除。


五、关键 Binder/系统点位(便于排查)

  • Launcher → ATMS:startActivity(IActivityTaskManager)
  • system_server → Zygote:zygote socket + fork()
  • app → AMS:attachApplication / bindApplication
  • AMS → app:ClientTransaction(LaunchActivity)
  • app → WMS:addView(ViewRootImpl) 新建窗口
  • 渲染:Choreographer → RenderThread → SurfaceFlinger

六、常见优化对位

  • 冷启动:减少 Application.onCreate 工作量(延迟初始化)、按需注册 Provider、用 SplashScreen、首屏必要资源打小包;
  • 首帧:避免首帧做 I/O/大对象构建;首屏布局扁平化;图片解码异步化;
  • 温/热启动:利用 onTrimMemory 做轻量释放,避免回到冷启动路径。
相关推荐
Q741_1471 小时前
海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(1) 作答语言:C/C++ 链表 二叉树
开发语言·c++·经验分享·面试·笔试
Chan161 小时前
微服务 - Higress网关
java·spring boot·微服务·云原生·面试·架构·intellij-idea
Cx330❀3 小时前
【优选算法必刷100题】第43题(模拟):数青蛙
c++·算法·leetcode·面试
释怀°Believe3 小时前
Daily算法刷题【面试经典150题-7️⃣位运算/数学/】
算法·面试·职场和发展
CCPC不拿奖不改名3 小时前
网络与API:HTTP基础+面试习题
网络·python·网络协议·学习·http·面试·职场和发展
无限码力3 小时前
华为OD技术面真题 - 计算机网络 - 3
计算机网络·华为od·面试·华为od技术面真题·华为od面试八股文·华为od技术面计算机网络相关
Bigbig.3 小时前
驱动工程师面试题 - 操作系统1
linux·开发语言·面试·硬件架构
码农丁丁4 小时前
谈谈面试的本质
面试·职场和发展·技术管理·ai时代的技术管理
a程序小傲5 小时前
【Node】单线程的Node.js为什么可以实现多线程?
java·数据库·后端·面试·node.js
独自归家的兔13 小时前
Spring Cloud核心架构组件深度解析(原理+实战+面试高频)
spring cloud·面试·架构