android framework之Applicataion启动流程分析

这篇具有很好参考价值的文章主要介绍了android framework之Applicataion启动流程分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

android framework之Applicataion启动流程分析,Android系统,android,framework,AMS

  • 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方法。

  • Application进程启动流程代码分析

android framework之Applicataion启动流程分析,Android系统,android,framework,AMS

 现在来分析App进程的启动流程,这边分两块,一个是Application的启动流程,一个是Activity的启动,Application的启动是通过Zygote fork()创建启动的,所以它的启动只有一次,但是Activity的启动可以是多次,而且有不同的启动方式,比如通过Launcher启动,通过进程内的ActivityA->AcitityB,或由其它另外一个进程来启动这个进程的Activity,等等。因此我们这边分析的是最全的覆盖最大的Activity启动方法,其它启动方式基本类似,按此作为参考。

Application进程的启动:

进程的启动来自AMS或ATMS代码,由它们触发,但是先抛开Activity前面的启动代码,所以我们从上图中右边的第2步开始进行源码分析,如上图所示Application进程的启动流程是由ATMS发起,在启动activity过程中会经历一个类ActivityStackSupervisor.java,在这个类中会真正的去启动activity, 会先进入startSpecialActivity()这个函数如下所示:

ActivityStackSupervisor.java->startSpecialActivity():
  -->//这里面会进行app进程存在与否的判断
     if(wpc != null && wpc.hasThread() )
        //进程存在时,直接启动activity
        -->realStartActivityLocked(); //这个与文章中最前面那张图就对上了。
     ...
     //下面是进程不存在时,需要创建。
     //mService是ActivityTaskServiceManager.java对象
     mService.startProcessAsync();//为app启动一个进程。
       //ActivityManagerInternal是AMS里的一个内部类:它内部包含了AMS的绝大多数服务的函数 
       -->Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess,...);
          mH.sendMessage(m);


这边过一下ActivityManagerInternal::startProcess这个函数:
  -->它是用于启动进程的,启动进程是通过socket,向zygote发送启动进程所需要的一些关键参数,
     startProcessLocked();
      //app进程相关的核心类有两个:一个是ProcessRecord类,一个是ProcessList进程的核心类,
      //在下面进一步描述:AMS通过持有进程的ProcessList列表,通过它来管理(start)进程
      -->mProcessList.startProcessLocked();
          -->判断处理进程启动前的各种参数和内容
             ...
             ProcessList.java->startProcessLocked();
              -->ProcessList.java->startProcessLocked(app, ApplicationInfo,);//重载的另一个函数
                  -->ProcessList.java->startProcessLocked();//又是重载 的另一个函数,中间会经历很多个重载的函数
                      ->...
                        final Process.ProcessStartResult startResult = startProcess();
                          -->if(usesWebviewZygote())
                                startWebView();
                             else if(usesAppZygote()) 
                                appZygote.getProcess().start(); //隔离进程的启动
                             else
                                //Process:只是一个工具类(很多静态函数),协助ProcessList或ProcessRecord去管理进程
                                return Process.start(); //正常app的启动。
                                   //ZYGOTE_PROCESS是ZygoteProcess类对象,也是工具类帮助zygote启动app进程
                                   -->return ZYGOTE_PROCESS.start(); //还是属于SystemServer进程
                                        -->ZygoteProcess.java:startViaZygote();
                                            -->//封装一系列参数
                                               ....
                                               argsForZygote.add(添加参数)
                                               zygoteSendArgsAndGetResult();
                                                -->attempZygoteSendArgsAndGetResult();
                                                    -->BufferedWriter usapWriter = new BufferedWrite();
                                                       usapWrite.write(msgStr);  
                                                       usapWrite.flush();//通过socket发给zygote.zygote进程可以接收到并执行。
  • Zygote进程接收到Socket消息处理

分析到这边,可以切换到zygote进程代码,继续分析,大致看一下Zygote进程是如何接收与处理消息的,代码如下:

ZygoteInit.main():
 -->...
    runSelectLoop();
      -->while(true) //死循环
          -->Zygoteconnection  connection = peers.get(); 
             Runnable command = connection.processOneCommand();//进行进程的处理,创建新进程
              -->args = Zygote.readArgumentList(mSocketReader);//获取socket命令参数
                 ZygoteArguments parsedArgs = new ZygoteArguments();
                 ...各种参数解析中...
                 pid = zygote.forkAndSpecialize();//Fork子进程,得到一个新的pid.
                   -->nativeForkAndSpecialize(); //调用native层接口去fork
  • 关于两个重要的数据结构

(1)ProcessRecord数据结构(代表进程运行的各类属性参数):

rocessRecord数据结构(代表进程运行的各类属性参数):
第一类数据:描述身份的数据,描述进程在AMS中的一个存在形式。
内部包括ApplicationInfo, 进程uid, userId, ProcessName, pid,
IApplicationThread(APP存放在AMS中的客户端IBinder对象)等等信息。
IApplicationThread很重要,AMS通过它给apk进程发送异步消息(管理四大组件的消息),
只有这个对象不为空时,才代码apk进程可以使用。

第二类数据:描述进程状态的数据
第三类数据:内存及和运行耗时,CPU时长,交互时长等相关的数据
第四类数据:crash和anr相关的数据。
所以它包含了APP进程的所有信息,通过它可以全方位监控并记录app的运行情况 。

上面说的ProcessRecord是代表着一个进程的所有数据信息,那AMS需要管理系统运行的所有
APP的进程,尤其是正在运行的app进程,这就需要使用一个List容器来进行管理 ,这个数据结构就是ProcessList类,

(2)ProcessList

lass ProcessList{
  ...
  private final int[] mOomAdj = new int[]{  //这里边存放着进程配置的相关优先级
    ...
  }

  ...
  //正在运行的应用ProcessRecord数组,根据最近使用的方式进行排序
  final ArrayList<ProcessRecord> mLruProcesses = new ArrayList<ProcessRecord>();
  //正在运行的isolated(隔离的)进程
  final SparseArray<ProcessRecord> mIsolatedProcesses = new SparseArray<>();
}

所以AMS通过ProcessList来持有系统上运行的所有app的ProcessRecord,但是进程也有优先级文章来源地址https://www.toymoban.com/news/detail-678717.html

到了这里,关于android framework之Applicataion启动流程分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Android13的系统启动流程分析(三)之FirstStageMain阶段

    Android13系统启动阶段大致分为FirstStageMain阶段和SecondStageMain,此章主要讲FirstStageMain阶段 (若分析有误敬请指教) 本章讲解的方向和你将收获的知识: 用户空间进程的调用流程 当进程挂掉后该如何处理 何时挂载上的基本文件系统和文件系统小知识 FirstStageMain阶段会挂载上什

    2024年02月10日
    浏览(35)
  • 基于Android13的系统启动流程分析(四)之SecondStageMain阶段

    Android13系统启动阶段大致分为FirstStageMain阶段和SecondStageMain,此章主要讲SecondStageMain阶段 (若分析有误敬请指教) 在基于Android13的系统启动流程分析(三)之FirstStageMain阶段已经讲解过android系统启动的基本介绍了,这里不再单独介绍了 我们先看是怎么进入该阶段的,仍然是

    2023年04月24日
    浏览(36)
  • 基于Android13的系统启动流程分析(一)之SeLinux权限介绍

    学习Android系统启动流程之前先学习一下SeLinux权限系统,步入正题 本章讲解的方向和你将收获的知识: 什么是SeLinux系统,SeLinux的简介和介绍 SeLinux系统的主要作用和存在的意义,是基于哪个版本开始推行该方案的 如果遇到了SeLinux权限问题该如何解决,有几种解决方案 SeLi

    2024年02月04日
    浏览(76)
  • Android framework学习指南之Launcher启动过程原理分析

    Launcher是一个用来显示系统中已经安装的应用程序的应用程序,Launcher 在启动过程中会请求PackageManagerService 返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序,它的作

    2024年02月03日
    浏览(36)
  • Android SystemServer 启动流程分析

    和你一起终身学 习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、SystemServer 启动的服务有哪些 二、SystemServer启动总体流程概述 三、SystemServer 如何启动,是谁启动的? 四、 SystemServer 启动入门 main 方法 五、SystemServer Run 方法初始与启动 六、

    2024年02月13日
    浏览(31)
  • 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程

    第一篇 深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动 第二篇 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程 上一篇文章深入探索了 Android Framework 的输入系统 IMS 的构成与启动,对 IMS 的重要成员有了初步的理解,然后通过源码对 IMS 的整个启动流程进行

    2024年01月20日
    浏览(35)
  • Android系统启动流程概览

    Boot Rom —— Bootloader —— Linux Kernel —— init进程 —— Zygote进程(dalvik/ art)—— systemServer —— Apps init 进程是Linux系统中,用户空间启动的第一个进程。 创建并挂载一些文件目录 启动属性服务 解析 init.rc 配置文件,启动 Zygote 进程 挂载 seLinux 文件目录,创建seLinux,加载

    2024年02月06日
    浏览(32)
  • Android系统启动流程 源码解析

    本文链接:https://blog.csdn.net/feather_wch/article/details/132518105 有道云脑图:https://note.youdao.com/s/GZ9d8vzO 1、整体流程 Boot Room BootLoader idle kthread init init ServiceManager zygote zygote SystemServer app 1、kernel/common/init/main.c 2、andorid.mk-android.bp编译 3、init是用户空间鼻祖 属于C、C++ Framework 1.1 启动源

    2024年02月11日
    浏览(31)
  • 笔记:Android 9系统启动流程

    当电源键按下时,引导芯片代码(汇编指令)会从预定的地方(固化在ROM)开始执行,将引导程序 BootLoader 加载到 RAM中,然后执行 BootLoader 是在 Android 操作系统开始前的一个小程序,主要作用是把系统OS拉起来并运行 位置: bootablebootloader 当 Linux系统被 BootLoader 程序拉起,

    2024年02月14日
    浏览(24)
  • Android T 远程动画显示流程其二——系统侧动画启动流程

    接着上篇文章分析 Android T 远程动画显示流程其一 下面,我们以从桌面点击一个应用启动的场景来分析远程动画的流程,窗口添加的流程见Android T WMS窗口相关流程 这里我们从AppTransitionController.handleAppTransitionReady方法开始跟踪代码流程 代码路径:framework/services/core/java/com/and

    2024年03月28日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包