news 2026/7/1 21:16:06

安卓冷启动流程(Android 15)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
安卓冷启动流程(Android 15)

大纲
Android触控事件处理机制
Zygote进程启动和应用进程创建流程
Handler消息机制
AMS的Activity组件管理
应用Application和Activity组件创建与初始化
应用UI布局与绘制
RenderThread渲染
SurfaceFlinger合成显示

桌面点击图标

Android 系统是由事件驱动的,而 input 是最常见的事件之一,用户的点击、滑动、长按等操作,都属于 input 事件驱动,其中的核心就是 InputReader 和 InputDispatcher。InputReader 和 InputDispatcher 是跑在 SystemServer进程中的两个 native 循环线程,负责读取和分发 Input 事件。整个处理过程大致流程如下:

1)InputReader负责从EventHub里面把Input事件读取出来,然后交给 InputDispatcher 进行事件分发;
2)InputDispatcher在拿到 InputReader获取的事件之后,对事件进行包装后,寻找并分发到目标窗口;
3)InboundQueue队列(“iq”)中放着InputDispatcher从InputReader中拿到的input事件;
4)OutboundQueue(“oq”)队列里面放的是即将要被派发给各个目标窗口App的事件;
5)WaitQueue队列里面记录的是已经派发给 App(“wq”),但是 App还在处理没有返回处理成功的事件;
6)PendingInputEventQueue队列(“aq”)中记录的是应用需要处理的Input事件,这里可以看到input事件已经传递到了应用进程;
7)deliverInputEvent 标识 App UI Thread 被 Input 事件唤醒;
8)InputResponse 标识 Input 事件区域,这里可以看到一个 Input_Down 事件 + 若干个 Input_Move 事件 + 一个 Input_Up 事件的处理阶段都被算到了这里;
9)App 响应处理Input 事件,内部会在其界面View树中传递处理。

从桌面点击应用图标启动应用,system_server的native线程InputReader首先负责从EventHub中利用linux的epolle机制监听并从屏幕驱动读取上报的触控事件,然后唤醒另外一条native线程InputDispatcher负责进行进一步事件分发。

InputDispatcher中会先将事件放到InboundQueue也就是“iq”队列中,然后寻找具体处理input事件的目标应用窗口,并将事件放入对应的目标窗口OutboundQueue也就是“oq”队列中等待通过SocketPair双工信道发送到应用目标窗口中。

桌面应用界面View中在连续处理一个ACTION_DOWN的TouchEvent触控事件和多个ACTION_MOVE,直到最后出现一个ACTION_UP的TouchEvent事件后,判断属于onClick点击事件,然后透过ActivityManager Binder调用AMS的startActivity服务接口触发启动应用的逻辑。

桌面启动应用

Launcher.java -> super.startActivitySafely()

Launcher启动后会将已安装应用程序的快捷图标显示到界面上,当我们点击应用程序的快捷图标时就会调用Launcher的startActivitySafely方法,如下所示。
正常会走super.startActivitySafely(v, intent, item);

publicclassLauncherextendsStatefulActivity<LauncherState>publicabstractclassStatefulActivity<STATE_TYPEextendsBaseState<STATE_TYPE>>extendsBaseDraggingActivitypublicabstractclassBaseDraggingActivityextendsBaseActivitypublicabstractclassBaseActivityextendsActivityimplementsActivityContext

从调用关系可以看出,会调到ActivityContext.java的startActivitySafely

ActivityContext.java -> startActivitySafely()

try{……}elseif(user==null||user.equals(Process.myUserHandle())){// Could be launching some bookkeeping activity// 调用startActivitycontext.startActivity(intent,optsBundle);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 11:29:25

5分钟极速部署UnoCSS到Netlify:零代码配置全攻略

5分钟极速部署UnoCSS到Netlify&#xff1a;零代码配置全攻略 【免费下载链接】unocss The instant on-demand atomic CSS engine. 项目地址: https://gitcode.com/GitHub_Trending/un/unocss 还在为CSS框架在Netlify部署后样式异常而烦恼&#xff1f;本文将用5个关键环节…

作者头像 李华
网站建设 2026/7/1 21:39:07

掌握AI图像生成:用PyTorch-GAN实现艺术风格迁移与高效训练

掌握AI图像生成&#xff1a;用PyTorch-GAN实现艺术风格迁移与高效训练 【免费下载链接】PyTorch-GAN PyTorch implementations of Generative Adversarial Networks. 项目地址: https://gitcode.com/gh_mirrors/py/PyTorch-GAN 在当今AI图像生成领域&#xff0c;风格迁移…

作者头像 李华
网站建设 2026/7/1 11:30:52

如何快速上手Bilidown:8K超高清B站视频下载完整教程

如何快速上手Bilidown&#xff1a;8K超高清B站视频下载完整教程 【免费下载链接】bilidown 哔哩哔哩视频解析下载工具&#xff0c;支持 8K 视频、Hi-Res 音频、杜比视界下载、批量解析&#xff0c;可扫码登录&#xff0c;常驻托盘。 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/7/1 11:29:34

IQuest-Coder-V1显存溢出?分步调试与优化实战教程

IQuest-Coder-V1显存溢出&#xff1f;分步调试与优化实战教程 你是不是也遇到过这样的情况&#xff1a;刚想用上最新的IQuest-Coder-V1-40B-Instruct模型写点高效代码&#xff0c;结果一加载就报“CUDA out of memory”&#xff1f;别急&#xff0c;这不怪你&#xff0c;也不怪…

作者头像 李华
网站建设 2026/7/1 11:29:54

AI视频画质修复的5大替代方案:从入门到精通

AI视频画质修复的5大替代方案&#xff1a;从入门到精通 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 在数字内容创作蓬勃发展的今天&#xff0c;AI视频画质修复已成为创作者必备技能。面对模糊…

作者头像 李华