android framework之Applicataion启动流程分析(三)

news2024/11/29 8:40:21

现在再回顾一下Application的启动流程,总的来说,虽然进程的发起是由ATMS服务发起的,但是进程的启动还是由AMS负责,所以需要调用AMS的startProcess()接口完成进程启动流程,AMS要处理的事情很多,它将事务交给得力助手ProcessList去完成,通过调用ProcessList的startProcessLocked()将进程的启动交给ProcessList对象去管理,它类似一个数组,里面存放着许多的ProcessRecord对象,每个ProcessRecord对象是一个application进程的抽象,保存着app进程的各种属性信息和动态数据,但是新进程的创建也不是在它手上直接创建的,而是由它内部的工具类Process调用ZygoteProcess的start()方法进行创建,这个方法的核心功能就是组织准备进程启动所需要的一切资源,打包成Argus参数消息,然后通过socket发送给ZygoteServer进程,ZygoteServer进程有一个runSelecpLoop()循环接收指令的处理,当它接收到进程启动的消息后,会将消息及其参数内容解析出来,然后调用ProcessOneCommand()接口进一步处理,包括fork()操作,fork成功后,需要关闭原Zygote的服务器socket, 以及初始化虚拟机,进入nativen层注册初始化binder等,这里面还会进入ZygoteConnection类中,通过反射的的方法拿到ActivityThread类中的main方法,成功执行main()函数,

这一篇文章可以来详细分析一下执行main函数的过程中又做了什么操作呢?大家可以结合下面这张图进行分析

ActivityThread.java->main();
  AndroidOS.install();
  Looper.prepareMainLoop();

  //重要,核心代码
  ActivityThread thread = new ActivityThread(); //
  //之前systemserve调用attach传入的是true,这里到应用进程传入false就行
  thread.attach(false, startSeq);
    -->//为什么要调用attach函数:在里面会调用AMS的attachApplicaation()接口
       final IActivityManager mgr = ActivityManager.getService();
       //问题:mAppThread是什么?final ApplicationThread mAppThread = new ApplicationThread();
              而ApplicationThread extends IApplicationThread.Stub. 所以mAppThread就是IBinder,
              是APP给服务端侧使用的IBinder.
       mgr.attachApplication(mAppThread, startSeq); //通过此接口将APP的IBinder传给AMS
        -->ActivityManagerService.java->attachApplication():
            -->attachApplicationLocked(thread); //此thread就是mAppThread.
                -->thread.bindApplication(); //thread就是APP的Ibinder, 现在这个是在AMS中,调用APP的IBinder,就是thread
                    -->ActivityThread.java: sendMessage(H.BIND_APPLICATION); //发送消息


                    ....会进入handleBindApplication()接收消息处理过程:
                        -->Application app; //构建application
                           app = data.info.makeApplication();
                              -->通过反射的方法new出来一个Application
                                 newApplication();
                                  -->Application app = getFactory().instantiateApplication(cl,className);
                                     app.attach(context);
                                      -->application.java->attach():
                                          -->attachBaseContext(context); //执行application的生命周期之前,先执行attachBaseContext这个接口


                        -->installContentProviders(); //启动安装provider组件,启动provider的生命周期,为app运行操作数据库做准备。
                            -->installProviders(); //安装provider,对其初始化
                           mInstrumentation.callApplicationOnCreate(app);
                            -->app.onCreate();//执行Application的onCreate生命周期,意味着application已经启动了。


                   ProcessRecord app; //这个就是代表着一个进程。ProcessRecord就等价于Application进程,这个进程在framework层的抽象就是ProcessRecord
                    -->ProcessRecord里面有一个IApplicationThread thread对象
                   app = mPidsSelfLocked.get(pid);
                   //将mAppThread存入ProcessRecord中的IApplicationThread对象中,就是IBinder。
                   app.makeActive(thread, mProcessState); //这个thread就是上面的mAppThread.
                    -->...
                       thread = _thread; //(_thread是参数,实参就是mAppThread,应用的IBinder, 这里的thread就是ProcessRecord内的IApplicationThread对象)
                   mProcessList.updateLruProcessLocked(); //把app对应的processRecord给它添加到ProcessList列表中。
                     -->mLruProcesses.add(pos, app); //这个ProcessList给AMS使用,AMS通过持有ProcessList间接访问ProcessRecord.
                  //最终层层调用到ActivityStackSupervisor
                  mAtmInternal.attachApplication(); //mAtmInternal是ActivityTaskManagerInternal
                    -->mRootWindowContainer.attachApplication(wpc);//RootWindowContainer.java的一个实 例 
                        -->RootWindowContainer::startActivityForAttachedApplicationIfNeeded();//开始activity的生命周期
                            -->mStackSupervisor.realStartActivityLocked(r,app,...); //执行activity生命周期流程。
                     

  Looper.loop();//一直循环,保障进程一直执行,如果退出,说明程序关闭

知识点:AMS->持有ProcessList列表:每个列表是ProcessRecord对象:每一个ProcessRecord对象内持有一个IApplicationThread对象,它就是IBinder,也就是说AMS要与某一个APP通信,通过这个路线:AMS->ProcessList->ProcessRecord->IAPPlicationThread拿到IBinder,然后调Application的服务,然后就是可以执行APP的生命周期流程。简化之就是AMS->...->IApplicationThread.


application启动时,会通过AMS的IBinder远程调用ApplicationThread的BindApplication(),在创建App的时候,先创建Application对象,然后再进行installProvider等后续的处理,处理的过程主要做两件事,一个是创建ProcessRecord并登录在ProcessList中,然后是开始执行ActivityStackSupervisor的realStartActivityLocked方法,开启activity生命周期流程的执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/967640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录训练营第四十三天|1049. 最后一块石头的重量 II、 494. 目标和、 474.一和零

1049. 最后一块石头的重量 II 力扣题目链接(opens new window) 题目难度:中等 有一堆石头,每块石头的重量都是正整数。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x &l…

小程序快速备案助手代备案小程序开发

小程序快速备案助手代备案小程序开发 用户注册与登录:用户可以通过手机号或其他方式进行注册和登录,以便进行备案相关操作。备案信息填写:用户可以填写小程序的备案信息,包括小程序名称、小程序服务类目、域名等。备案材料上传&a…

GA遗传算法

储备知识 GA算法主要解决数学模型中最优化的搜索算法,是进化算法中的一种,基因算法借鉴了自然界基因的遗传的主要现象,分别为遗传,变异,自然选择,杂交等。 GA算法参数 GA算法的参数如下所示。 种群规模…

c++ vs2019 cpp20规范的STL库的map与multimap源码分析

map就是一个红黑树。 标准平衡二叉树,要求左右子树的高度差不超过1 。红黑树只要求左右子树的高度差不超过一倍即可。兼顾了树平衡与效率。避免了AVL树的频繁调整树平衡。 b站 的“可雷曼土”大师,讲红黑树的理论讲的很透彻,再结合看代码&…

va_list使用及两个注意项(可能导致崩溃和少1个字符)

两个注意项: 1、linux平台上vsnprintf会破坏va_list变量,需要重新调用va_start,否则可能访问错位崩溃。 2、vsnprintf会留一个字节补0结束,但返回值不包含,所以必须判断返回值小于分配的空间。 具体代码分析&#xff1…

【包过滤防火墙——firewalld动态防火墙】的简单使用

文章目录 firewald与iptables区别firewalld九个区域firewalld配置方法firewalld参数和命令firewalld两种模式firewalld使用实验 firewalld不要与iptables混用 firewald与iptables区别 iptables 主要是基于接口,来设置规则,从而判断网络的安全性。firewa…

卡特兰数和算法

在组合数学中,卡特兰数是一系列自然数,出现在各种组合计数问题中,通常涉及递归定义的对象。它们以比利时数学家尤金查尔斯卡特兰(Eugne Charles Catalan)的名字命名。 卡特兰数序列是1, 1, 2, 5, 14, 42......&#xf…

AAC之处理码流分析工具(三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

websocket基础

下面就以代码来进行说明 1&#xff0c;先导入websocket依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.编写websocket相关bean管理配置 Config…

牛客网刷题

牛客网刷题-C&C 2023年9月3日15:58:392023年9月3日16:37:01 2023年9月3日15:58:39 2023年9月3日16:37:01 整型常量和实型常量的区别

一、了解[mysql]索引底层结构和算法

目录 一、索引1.索引的本质2.mysql的索引结构 二、存储引擎1.MyISAM2.InnoDB3.为什么建议InnoDB表要建立主键并且推荐int类型自增&#xff1f;4.innodb的主键索引和非主键索引&#xff08;二级索引&#xff09;区别5.联合索引 一、索引 1.索引的本质 索引:帮助mysql高效获取数…

01-为什么阿里巴巴强制要求使用包装类型定义属性?【Java面试题总结】

1.为什么阿里巴巴强制要求使用包装类型定义属性&#xff1f; 我认为主要有以下几个方面的原因&#xff1a; 默认值问题&#xff1a;使用基本数据类型定义属性时&#xff0c;如果没有给属性赋初始值&#xff0c;会使用默认值&#xff08;如 int 的默认值为 0&#xff09;&…

C++:初识类与this指针

文章目录 前言一、类类的定义和实例化类的访问限定符类的作用域计算类的大小 二、类的成员函数的this指针总结 个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》 前言 一、类 类的定义和实例化 注意类定义结束时后面分号( ; )不能省略。 类…

基于粒子群算法的考虑需求响应的风-光-柴-储容量优化配置

目录 文章摘要&#xff1a; 研究背景&#xff1a; 考虑柔性负荷的风、光、柴、储微电网模型&#xff1a; 储能配置模型&#xff1a; 粒子群算法&#xff1a; 运行结果&#xff1a; 1. 全年运行效果展示&#xff1a; 2. 典型日运行效果&#xff1a; Matlab代码数据分享…

博客系统自动化测试项目实战(测试系列9)

目录 前言&#xff1a; 1.博客前端页面测试用例图 2.测试用例的代码实现 2.1登录页面的测试 2.2博客列表页面的测试 2.3写博客测试 2.4博客详情页面的测试 2.5已发布博客的标题和时间的测试 2.6注销用户的测试 结束语&#xff1a; 前言&#xff1a; 之前小编给大家讲…

js实现点击查看全部/收起功能

在上一篇文章实现用js截取文本后&#xff0c;我的另一个需求也迎刃而解了。需求就是一段长文本需要溢出隐藏&#xff0c;然后点击全部时显示全部文本&#xff0c;点击收起又回到溢出隐藏的状态。实现的效果如下图&#xff1a; 实现的思路时点击全部时使用这条数据的原文本&…

04-过滤器和拦截器有什么区别?【Java面试题总结】

过滤器和拦截器有什么区别&#xff1f; 运行顺序不同&#xff1a;过滤器是在 Servlet 容器接收到请求之后&#xff0c;但在 Servlet被调用之前运行的&#xff1b;而拦截器则是在Servlet 被调用之后&#xff0c;但在响应被发送到客户端之前运行的。 过滤器Filter 依赖于 Servle…

【优先级队列】

文章目录 基于无序数组实现基于有序数组的实现基于堆的实现合并多个有序链表-力扣 23 题 基于无序数组实现 要点 入队保持顺序&#xff0c;在数组尾部插入即可出队前找到优先级最高的出队&#xff0c;相当于一次选择排序 基于有序数组的实现 要点 入队后排好序&#xff0c…

企业架构LNMP学习笔记8

1、 运维人员需要考虑安全性、稳定性。 安装&#xff1a; 解压进入到目录&#xff1a; shell > tar zxf php-7.2.12.tar.gz shell > cd php-7.2.12 安装依赖软件&#xff1a; yum -y install libxml2-devel libjpeg-devel libpng-devel freetype-devel curl-devel op…

企业应用系统 PHP项目支持管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 项目支持管理系统是一套完善的web设计系统 应用于企业项目管理&#xff0c;从企业内部的各个业务环境总体掌握&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php项目支撑管理系统2 二、功能介绍 (1)权限管理&#xff1…