其他分享
首页 > 其他分享> > Android-AMS(二)-APP启动流程分析

Android-AMS(二)-APP启动流程分析

作者:互联网

APP的启动过程很复杂,代码错综交横,这里分析了大概流程,例如知道了AMS与主线程的关系,主线程main方法中就是APP的入口,Binder通信机制和handler消息机制在这个过程中的重要作用,Application的创建时机以及Application为什么是单例,为什么有几个进程就创建几个Application…等等 。

一. 系统创建ActivityThread流程分析:createSystemContext(),由SystemServer的run()调用。代码如下:

 

  通过调用systemMain()会创建一个ActivityThread.这个ActivityThread是给systemServer进程使用的。代码如下:

 

 

   在attach()中主要是做了4件事情:(这里是SystemServer进程)

    1>.创建Instrumentation对象

    2>.createAppContext()创建SystemServer进程的Context

    3>.通过makeApplication创建SystemServer的Application

    4>.调用Application的onCreate()          代码如下:

 

   通过上面的代码我们可以找到getSystemContext()和makeApplication()  先看看是如何创建SystemServer的Context对象的,跟踪getSystemContext()   代码如下:

 

   这里,调用了createSystemContext(),继续跟:

 

   可以看到创建SystemServer进程的Context的过程,主要是做了以下2件事情:

      1>.创建LoadedApk对象

      2>.创建Context对象,并设置Resources   

  首次执行getSystemContext会创建LoadedApk和ContextImpl对象,后面获取的Context都是利用这里创建的LoadedApk对象创建出新的Context.

  我们再看看makeApplication(),代码如下:

 

 分析到这里。我们可以得出SystemServer进程创建Context的整个过程。我已经将整个流程整理成xmind文档了,如下图。App的启动流程大致与此相同,在细节上或有所差别。我们借助这个脉络分析App的启动流程。请接着往下看:

 

二:APP启动流程分析。

  当Zygote收到请求:创建一个新的APP进程,之后,会调用ActivityThread的main()方法,代码如下:

 

 可以看到在这里主要做了两件事情:

  1>.创建并执行主线程的Looper循环

  2>.创建ActivityThread对象,并调用attach(),这里与SystemServer进程不同的是APP的attch的参数是false SystemServer进程的是true.  attrch为false时,代码如下:

 

 在attachApplication()中,会找到attachApplicationLocked(),跟踪该方法。会看到如下代码区域:

 

 这里的bindApplication又会通过Binder调用ActivityThread的bindApplication().代码如下:

 

   这里看到主要做了两件事情:

    1>.创建AppBindData

    2>.通过调用sendMessage()发送Handler消息来调用handBindApplication()。跟到该方法。我们可以看App的Application的创建过程和执行。代码如下:

 

   由上可知应用的Application在创建时的一些动作:

    1>.获取到LoadedApk对象   一个应用对应一个LoadedApk

    2>.创建应用所需的Context对象。

    3>.创建Instrumentation对象。

    4>.创建应用的Application

    5>.通过调用Instrumentation的callApplicationOnCreate()调用Application的onCreate().

 我们梳理一下Android APP启动流程:

  如下图所示,系统从Launcher出发,SystemServer进程在收到Launcher进程的启动一个APP的请求后。会先去请求Zygote进程创建一个新的应用进程,此时还是一个空进程。然后Zygote进程就会调用ActivityThread去初始化这个进程,包括Instrumentation,ApplicationThread,AppBindData等对象,创建完以后才会去真正创建APP的根Activity,并调用他的生命周期。

 

这里主要分析的是上图的第三步的过程。Zygote在收到请求以后,ActivityThread和AMS之间是如何协同工作的,或者说第三步主要做了一些什么。我已经整理成xmind文档,如下图所示:

 

 

标签:调用,创建,APP,Application,进程,Android,AMS,SystemServer
来源: https://www.cnblogs.com/gwm-Android/p/16168984.html