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

android framework之Applicataion启动流程分析

Application启动流程分析
启动方式一:通过Launcher启动app
启动方式二:在某一个app里启动第二个app的Activity.
以上两种方式均可触发app进程的启动。但无论哪种方式,最终通过通过调用AMS的startActivity()来启动application的。
  

根据上图分析, 要启动一个Application,需要涉及五个进程,Launcher进程,SystemServer进程,Zygote进程,和要启动的目标Application进程,最后还有一个ServiceManager进程。通过Launcher进程是无法直接启动app的,因为启动是通过AMS或ATMS完成的。

所以第一步,Launcher必须要拿到AMS的Binder,而AMS的Binder(如上图左侧)在Launcher中的代理则是ActivityManagerProxy,它是Launcher从ServiceManager中查询获取而得到的,然后基于这个代理,向SystemServer进程中的AMS去请求startActivity().


这个过程是通过ActivityManagerProxy这个Binder远程调用了AMS的服务,让AMS去startActivity. 但是AMS在启动之前肯定要先判断一下这个Activity对应的Application进程是否已经存在。如果进程存在, 直接走上面的第五步,这一步的处理过程也是跨进程通信的,通过获取APP进程在AMS中的客户端代理即ApplicationThreadProxy, 通过这个代理Binder远程调用app进程的scheduleLauncherActivity()方法直接启动进程中的Activity,这个流程是基于APP进程已经存在了,所以走的是第5和6步分支。

但是现在要讨论的是APP进程不存在的时候,这个APP的启动流程,这种启动方式会覆盖所有app的启动流程。所以AMS当发现进程不存在时,它首先会走第2步,向Zygote进程发送创建进程的请求,这一步采用的是socket通信方式来操作的,zygote收到socket指令后,是通过调用fork()的方式来启动复制创建一个application进程的,这个就是第三步。一旦这个Application被创建,它不会立刻运行,因为它是由AMS来负责的,所以它会先将自身的Binder代理对象发给AMS,这个是第四步,它是利用ActivityManager在Application的Binder对象ActivityManagerProxy来远程调用其attach_application()方法来传递自身Binder。这样AMS也就保存了这个Application的Binder对象,
然后才是走第5步,在第5步中如上面的分析(app进程已经存在的情况下),利用Application在AMS的Binder代理即ApplicationThreadProxy进行启动,最后执行到第8步,调用Activity.onCreate方法。

http://www.lryc.cn/news/143628.html

相关文章:

  • Linux Day10 ---Mybash
  • Flask-Sockets和Flask-Login联合实现websocket的登录认证功能
  • 东盟全面覆盖?长城战略部署核心区域市场,首个百万粉丝国产品牌
  • 基于PHP的电脑商城系统
  • 无客户端网络准入方案,为集成电路企业终端管理开启省事更省心模式
  • 5G与4G的RRC协议之异同
  • 横扫“盲区”、“看透”缺陷,维视智造推出短波红外相机
  • cgo踩坑:交叉编译过程出现的问题could not determine kind of name for C.XXX
  • 自然语言处理(NLP)技术的例子
  • Python“牵手”义乌购商品列表数据,关键词搜索义乌购API接口数据,义乌购API接口申请指南
  • ip_vs 原理解析 (四)hook 后的开始 NF_INET_LOCAL_IN
  • 分布式之CAP理论与BASE理论
  • Java之初始化顺序实践
  • 静态库与动态链接库,第三方库集成到VS
  • 生态经济学领域里的R语言机器学(数据的收集与清洗、综合建模评价、数据的分析与可视化、数据的空间效应、因果推断等)
  • 【ROS】自定义消息方面的bug总结(1)
  • CTF-XXE(持续更新,欢迎分享更多相关知识点的题目)
  • Python工具箱系列(四十一)
  • Bigemap在路桥行业是怎么应用的?
  • 代码随想录算法训练营Day48 || ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
  • 高通面临难题,Oryon核心存在问题,高通8cx Gen 4芯片将推迟发布
  • 安卓手机如何使用邮箱客户端收发邮件
  • 对java中的List进行深拷贝,并进行删除测试
  • springboot服务注册到Eureka,端口总是默认8080,自己配置端口不生效
  • LeetCode第11~15题解
  • 如何编译打包OpenSSH 9.4并实现批量升级
  • AcWing 898. 数字三角形 (每日一题)
  • 深度学习中,batchsize的大小对训练结果有什么影响,如何正确使用
  • Squaretest 1.8.3 安装激活
  • P21~22 第六章 储能元件——电容存储电场能,电感存储磁场能