Android随笔-APP首次启动流程
从用户点击应用图标到 Activity 执行 onCreate() 的完整流程涉及Launcher 进程 → SystemServer 进程 → Zygote 进程 → 应用进程之间的多轮跨进程通信。以下是详细拆解一、核心通信方式概览通信双方IPC 方式作用Launcher → AMS/ATMSBinder IPC发送启动 Activity 的请求AMS → ZygoteSocket请求 fork 创建新应用进程AMS → 应用进程Binder IPC通过 ApplicationThread 代理回调应用进程应用进程 → AMSBinder IPC应用进程向 AMS 注册自身注Android 10 中 AMS 的 Activity 管理职责已拆分至 ActivityTaskManagerService (ATMS)但核心逻辑不变。以下以 AMS 代指系统侧服务 。二、详细流程阶段 1Launcher 发起启动请求Binder IPC用户点击桌面图标时Launcher 进程本质也是一个普通应用执行以下调用链// Launcher 点击图标Launcher.onClick()→startActivity(intent)→Instrumentation.execStartActivity()→ActivityManager.getService().startActivity()// 跨进程 Binder 调用ActivityManager.getService() 返回的是 AMS 的 Binder 代理对象IActivityManager 接口的代理通过 Binder 驱动 将请求发送到 SystemServer 进程中的 AMS传递的 Intent 包含目标组件信息component com.example.app/.MainActivity阶段 2AMS 处理启动请求SystemServer 进程AMS收到请求后执行以下关键步骤权限校验— 检查调用方是否有启动权限创建 ActivityRecord— 在 AMS 内部为本次启动创建对应的 ActivityRecord 对象记录 Activity 状态检查进程状态— 通过 ProcessRecord 查询目标应用进程是否存在若进程已存在 → 直接走 realStartActivityLocked() 启动 Activity若进程不存在 → 进入进程创建流程阶段 3AMS 请求 Zygote 创建新进程Socket当 AMS 发现目标进程不存在时AMS.startProcessLocked()→Process.start()→ZygoteProcess.startViaZygote()→ 通过Socket连接Zygote进程发送 fork 参数为什么用 Socket 而非 BinderZygote 进程在启动时初始化并预加载了大量类和资源需要保持干净状态如果使用 BinderZygote 需注册到 ServiceManager会引入额外依赖Socket 通信更简单、开销更小且 fork 后子进程无需继承 Binder 线程池的复杂状态Zygote 收到请求后调用 fork() 创建子进程子进程继承了预加载的环境然后反射调用 ActivityThread.main() 作为应用进程入口阶段 4应用进程初始化ActivityThread.main新创建的应用进程执行 ActivityThread.main()publicstaticvoidmain(String[]args){// 1. 初始化主线程 LooperLooper.prepareMainLooper();// 2. 创建 ActivityThread 实例ActivityThreadthreadnewActivityThread();thread.attach(false);// 关键向 AMS 注册// 3. 创建 ApplicationThreadBinder 服务端// 4. 进入消息循环等待 AMS 指令Looper.loop();}ActivityThread 是应用进程的主线程管理类每个应用进程只有一个实例ApplicationThread 是 ActivityThread 的内部类继承 IApplicationThread.Stub作为应用进程向 AMS 暴露的 Binder 服务端接口thread.attach(false) 通过 Binder 调用 AMS 的 attachApplication() 方法将ApplicationThread 的 Binder 代理注册到 AMS 下阶段 5AMS 回调应用进程创建 ApplicationBinder IPCAMS 收到 attachApplication() 后通过 ApplicationThread 的代理回调应用进程AMS.attachApplicationLocked()→ApplicationThreadProxy.bindApplication()// Binder 跨进程调用→ 应用进程ApplicationThread.bindApplication()→sendMessage(H.BIND_APPLICATION,data)// 向主线程 Handler 发消息→ActivityThread.handleBindApplication()handleBindApplication() 的核心逻辑privatevoidhandleBindApplication(AppBindDatadata){// 1. 创建 LoadedApk代表已加载的 APK// 2. 创建 ContextImpl应用级 Context// 3. 反射创建 Instrumentation// 4. 创建 Application 实例Applicationappdata.info.makeApplication(false,mInstrumentation);// 5. 调用 Application.attachBaseContext() — 最早的应用入口app.attach(context);// 内部调用 attachBaseContext()// 6. 安装 ContentProviders比 onCreate 更早installContentProviders(app,data.providers);// 7. 调用 Application.onCreate()mInstrumentation.callApplicationOnCreate(app);}关键顺序attachBaseContext() → ContentProvider.onCreate() → Application.onCreate()阶段 6AMS 请求启动 ActivityBinder IPCApplication 初始化完成后AMS 再次通过 ApplicationThread 代理发送启动 Activity 的请求AMS.realStartActivityLocked()→ClientTransaction.schedule()→ApplicationThreadProxy.scheduleLaunchActivity()// Binder 跨进程→ 应用进程ApplicationThread.scheduleLaunchActivity()→sendMessage(H.LAUNCH_ACTIVITY,r)// 向主线程发消息→ActivityThread.handleLaunchActivity()阶段 7应用进程创建 Activity 并执行 onCreate()handleLaunchActivity() 调用 performLaunchActivity() 完成 Activity 创建privateActivityperformLaunchActivity(ActivityClientRecordr,IntentcustomIntent){// 1. 创建 Activity 的 ContextContextImplappContextcreateBaseContextForActivity(r);// 2. 反射创建 Activity 实例ActivityactivitymInstrumentation.newActivity(cl,component.getClassName(),r.intent);// 3. 获取 Application 实例Applicationappr.packageInfo.makeApplication(false,mInstrumentation);// 4. 调用 Activity.attach() — 创建 PhoneWindow、绑定 WindowManageractivity.attach(appContext,this,getInstrumentation(),r.token,r.ident,app,r.intent,r.activityInfo,title,r.parent,...);// 5. 调用 Activity.onCreate()if(r.isPersistable()){mInstrumentation.callActivityOnCreate(activity,r.state,r.persistentState);}else{mInstrumentation.callActivityOnCreate(activity,r.state);}// 6. 设置 Activity 状态为 ON_CREATEr.setState(ON_CREATE);}Activity.attach() 内部关键操作调用 attachBaseContext(context) — 绑定 Context创建 PhoneWindow — 这是 Activity 的窗口实现创建 WindowManager — 与系统窗口管理服务绑定初始化 FragmentController 等内部组件Instrumentation.callActivityOnCreate() 最终调用publicvoidcallActivityOnCreate(Activityactivity,Bundleicicle){activity.performCreate(icicle);// 内部调用 activity.onCreate(icicle)}三、关键类与角色总结类/组件所属进程角色LauncherLauncher 进程桌面应用接收点击事件发起启动请求ActivityManagerService (AMS)SystemServer管理系统所有 Activity 的生命周期和进程ActivityTaskManagerService (ATMS)SystemServerAndroid 10 负责 Activity 栈管理从 AMS 拆分ZygoteZygote 进程所有应用进程的父进程通过 fork 快速创建新进程ActivityThread应用进程应用主线程管理类入口为main()ApplicationThread应用进程应用进程暴露给 AMS 的 Binder 服务端IApplicationThread接口定义AMS 调用应用进程的 Binder 接口Instrumentation应用进程应用进程的管家封装 Activity/Application 的创建和生命周期调用ActivityRecordAMS 内部AMS 中代表一个 Activity 实例的管理对象ProcessRecordAMS 内部AMS 中记录进程状态信息的对象四、总结点击图标后Launcher 通过 Binder 请求 AMS → AMS 通过 Socket 让 Zygote fork 进程 →新进程通过 Binder 向 AMS 注册 → AMS 通过 Binder 回调应用进程创建 Application → 再回调创建Activity 并执行 onCreate()。整个过程经历了 2 次 Binder 往返 1 次 Socket 通信 多次 Handler 消息调度。

相关新闻

如何用沉浸式翻译插件实现一键双语阅读外文资料?

如何用沉浸式翻译插件实现一键双语阅读外文资料?

一、先说结论:沉浸式翻译适合谁? 直接结论 用户类型是否推荐推荐理由经常读英文网页的人强烈推荐一键网页双语,阅读阻力明显下降学生 / 研究生强烈推荐适合论文、资料、课程、英文网站内容创作者强烈推荐适合快速读海外资讯、产品文档、报道…

2026/7/5 3:14:57 阅读更多 →
UNY Finance生态航母再扩容,UNY Bet(UNY预测)即将上线!

UNY Finance生态航母再扩容,UNY Bet(UNY预测)即将上线!

2026/7/5 3:12:56 阅读更多 →
trae接如claudecode

trae接如claudecode

配置流程 使用cc-switch接入国内模型使用trae安装Claude Code插件Claude Code插件自动调用cc-switch接入的模型 1.cc-switch安装并接入大模型 https://www.cnblogs.com/Leonardo-li/p/19890846 2.trae下载并安装,安装略 https://www.trae.cn/sem?utm_sourceba…

2026/7/5 3:12:56 阅读更多 →

最新新闻

聊城食品洁净车间建设指南,按加工场景适配净化板更耐用

聊城食品洁净车间建设指南,按加工场景适配净化板更耐用

聊城作为鲁西农副产品加工核心区域,形成禽肉屠宰、速冻预制菜、果蔬深加工、杂粮面点、宠物食品五大加工集群,大量新建洁净车间、老旧厂房改造需求持续增多。本地的特殊工况,也让选择板材变得复杂纠结起来。 生产线全天用水冲洗,血…

2026/7/5 4:15:13 阅读更多 →
基于TB9051FTG与MSP432的静音直流电机控制方案

基于TB9051FTG与MSP432的静音直流电机控制方案

1. 项目背景与核心需求在工业自动化、消费电子和机器人领域,直流电机控制一直是个经典课题。传统PWM调速方案虽然简单易实现,但存在明显的电磁噪声和机械振动问题——当PWM频率落在人耳可听范围(20Hz-20kHz)时,电机会发…

2026/7/5 4:13:13 阅读更多 →
Power BI热力图实战:用矩阵+条件格式驱动业务决策

Power BI热力图实战:用矩阵+条件格式驱动业务决策

1. 为什么一张“彩色表格”能成为业务决策的加速器?在Power BI里做可视化,很多人第一反应是柱状图、折线图、饼图——稳妥、熟悉、老板一眼能看懂。但真正让我在客户现场被反复追问“这个怎么做的?”“能不能再加一列?”“能不能按…

2026/7/5 4:11:12 阅读更多 →
轻量级AI智能体:安全、场景与硬件穿透的工程实践

轻量级AI智能体:安全、场景与硬件穿透的工程实践

1. 项目概述:轻量级AI智能体不是“减配版”,而是精准适配的生产力工具最近在技术圈和办公软件社群里,“养龙虾”这个词火了——它不是水产养殖指南,而是对 OpenClaw 架构下各类 AI 智能体(Agent)产品的戏称…

2026/7/5 4:11:12 阅读更多 →
百元头戴耳机内卷!vivo、REDMI新品全面对比

百元头戴耳机内卷!vivo、REDMI新品全面对比

当下头戴耳机新品层出不穷,vivo 与 REDMI 先后推出自家首款头戴降噪耳机,两款百元级新品定位相近却各有取舍。两种简约风格,配色各有特色从外观颜值上看,两款耳机均走极简圆润设计路线,无繁杂装饰,同时兼具…

2026/7/5 4:09:11 阅读更多 →
Pytest自动化测试进阶:工程化、数据驱动与性能优化实战

Pytest自动化测试进阶:工程化、数据驱动与性能优化实战

1. 项目概述:从“会用”到“精通”的自动化测试进阶如果你已经用pytest写过一些简单的测试用例,感觉它比unittest好用,断言更直观,夹具(fixture)也挺方便,那么恭喜你,你已经迈出了自…

2026/7/5 4:09:11 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻