当前位置: 首页 > article >正文

Android Framework startServices 流程

找到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.kler.cn/a/569295.html

相关文章:

  • 对seacmsv9进行sql注入,orderby,过滤information_schema
  • mac多版本python环境下解决模块导入问题
  • 图论题目。
  • 当前 Qt 应用程序中无法打开串口,并且没有使用通用的 Modbus 类,可在应用程序添加一个专门的“打开串口”按钮
  • 【Python 数据结构 2.时间复杂度和空间复杂度】
  • 机器学习数学基础:32.复本信度
  • 计算机毕业设计SpringBoot+Vue.js社区智慧养老监护管理平台(源码+文档+PPT+讲解)
  • 前端面试题---在vue中为什么要用路由
  • 谈谈 ES 6.8 到 7.10 的功能变迁(5)- 任务和集群管理
  • 【Redis】持久化
  • leetcode459 重复的子字符串 周期性字符串问题 KMP算法
  • 20250228下载MOOC课程的视频【单集】
  • 1-21 GIT关联本地仓库到远程
  • 配置后端验证功能之validation
  • 如何成为一名专业的程序员,准备一本《AI辅助编程:Python实战》
  • 在AI中,tokens是自然语言处理(NLP)的基本单位,用于文本的分割和处理。
  • easyExcel使用案例有代码
  • 三、数据提取
  • AI视频监控的技术架构
  • 基于大数据的招聘系统可视化及推荐系统