Android Framework startServices 流程

embedded/2025/3/4 11:57:36/

找到Activity它继承的Context里面就有startService函数
具体实现在ContextImpl,而ContextImpl则是由createBaseContextForActivity这个函数创建的,简单点说就是ActivityThread,startActivity时创建并赋予的

startService往下找就会找到一个Service
在这里插入图片描述
接下来就是启动服务 的AIDL流程
在这里插入图片描述

找到这个AMS服务,他继承了IActivityManager.Stub,正常情况下Stub是服务端的一个内部内,用来实现aidl的接口调用。也就是说他就是服务功能的具体实现者。
在这里插入图片描述
这个ActivieServices持有AMS是一个包装类,注意此处的hostingType
在这里插入图片描述

bringUpServiceLocked有两路
1.当目标进程已存在,则直接执行realStartServiceLocked();
2.当目标进程不存在,则先执行startProcessLocked创建进程

以下介绍流程二
在这里插入图片描述
意思是让zygote启动这个进程
在这里插入图片描述
很明显用的sock连接完成io交互,总之会给一个result回来,

其实反向分析也可以初见端倪
Log.i(TAG, "Service Created",new Exception());
在这里插入图片描述
从日志中发现,我们需要从ZygoteInit.main开始分析。
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

ZygoteInit会fork新进程并返回pid给客户端 的ZygotePrcess

服务端的for循环监听
在这里插入图片描述
prcessOneCmmand处理接收到的数据并执行命令
在这里插入图片描述
最终走到ZygoteInit的zygoteInit函数初始化
在这里插入图片描述
这里就是到了RuntTimeInit的appinit函数
在这里插入图片描述
这个RuntTimeInit主要工作就是findStaticMain 反射main函数
在这里插入图片描述
MeathondAndArgsCaller 内容就是反射ActivtyThread.main函数

终于到了这里的ActivityThread.main部分。我们知道到这里app的进程才算正式启动了
在这里插入图片描述
这段代码很牛皮
将获取AMS服务实例 并attachApplication,mAppThread作为客户端回调监听,给到RunTimeInit来维护。
在这里插入图片描述

最终走到了AMS.attachApplicationLocked
在这里插入图片描述
发现ApplicationThread就是ActivityThread内部成员也是aidl的接口功能实现,这里终于到了handler sendMessage流程
这里面的thread
在这里插入图片描述
他post一下其实就还是在ActivityThread这个类实现,handler作为统一调度工具,避免事件紊乱而这样设计。

AMS包装类调用AtivityThread去post一个creat_Services事件
在这里插入图片描述

最后看到Service基本就是已经启动了
在这里插入图片描述

回到前面的realStartServiceLocked 我们快速介绍流程一
在这里插入图片描述
这里的thread就是ActivityThread的内部Stub IApplicationThread,scheduleCreateService就是调用ActivityThread的post CREATE_SERVICE 事件,在内部内Handler的handleMessage中实现功能
在这里插入图片描述
最终成功回到OnCreat事件
在这里插入图片描述
也印证了改堆栈
在这里插入图片描述


http://www.ppmy.cn/embedded/169908.html

相关文章

企业微信里可以使用的企业内刊制作工具,FLBOOK

如何让员工及时了解公司动态、行业资讯、学习专业知识,并有效沉淀企业文化?一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网,注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…

Codeforces Round 1006 (Div. 3)

ABCDE略 F 感觉考的是分形。首先画图可以发现,从第0行开始算,二的整数次幂的行中间全是零,并且呈现倒三角的形状蔓延至下面的行而这个倒三角左边和右边的正三角和顶部的正三角完全一致。我们可以先把第n行全部赋值为1,然后判断哪…

OpenCV(11):人脸检测、物体识别

1 人脸检测 人脸检测是计算机视觉中的一个经典问题,而 OpenCV 提供了基于 Haar 特征分类器的人脸检测方法,简单易用且效果显著。本文将详细介绍如何使用 OpenCV 中的 cv2.CascadeClassifier() 进行人脸检测。 1.1 Haar 特征分类器 Haar 特征分类器是一种…

反向海淘南美市场案例:Cssbuy淘宝代购集运系统 PHP 搭建功能解析

在全球化电商蓬勃发展的当下,反向海淘业务在南美市场逐渐崭露头角。随着南美消费者对中国优质且丰富商品的需求日益增长,像 CSSBuy 这样的淘宝代购集运系统为满足这一需求提供了有力支持。对于开发者而言,了解如何运用 PHP 搭建针对南美市场的…

RAG组件:向量数据库(Milvus)

在当前大模型盛行的时代,大模型的垂类微调、优化成为产业落地、行业应用的关键;RAG技术应运而生,主要解决大模型对专业知识、实效性知识欠缺的问题; RAG的核心工作逻辑是将专业知识、实效知识等大模型欠缺的知识进行收集、打包、保…

C++核心指导原则: 标准库

C Core Guidelines 整理目录 哲学部分接口(Interface)部分函数部分类和类层次结构部分枚举部分资源管理部分表达式和语句部分性能部分并发和并行错误处理常量和不可变性泛型编程源文件命名和布局建议标准库 The Standard Library 标准库规则总结 SL.1: Use libraries wherev…

蓝桥杯 灯笼大乱斗【算法赛】

问题描述 元宵佳节&#xff0c;一场别开生面的灯笼大赛热闹非凡。NN 位技艺精湛的灯笼师依次落座&#xff0c;每位师傅都有相应的资历值&#xff0c;其中第 ii 位师傅的资历值为 AiAi​。从左到右&#xff0c;师傅们的资历值逐级递增&#xff08;即 A1<A2<⋯<ANA1​&l…

淘天集团算法岗-计算机视觉(T-Star Lab)内推

熟悉计算机视觉、机器学习、图像/视频分析与处理、多模态内容理解、AIGC等相关领域技术和应用&#xff1b; 具备极佳的工程实现能力&#xff0c;熟练掌握C/C、Java、Python等至少一门语言&#xff1b; 学习能力强&#xff0c;对新事物有好奇心&#xff0c;对所在领域有热情&a…