美文网首页
Android 启动流程

Android 启动流程

作者: Herlo | 来源:发表于2022-02-28 19:10 被阅读0次

    Android打开电源到启动相关APP流程

    image.png

    appMain.cpp方法中会初始化一个AndroidRuntime
    然后调用runtime.start("com.android.internal.os.ZygoteInit")
    在start方法中会创建虚拟机,注册jni,调用callStaticVoidMethod方法启动ZygoteInit.main方法,预加载一些内容,在此方法中会调用forkSystemServer方法fork一个SystemServer进程,然后创建ZygoteServer (Socket)然后调用socket的runselectLoop方法开始等待AMS的消息。


    image.png

    SystemServer启动流程


    image.png

    1、创建SystemServiceManager
    2、10.0之前直接启动AMS服务,10.0之后多了一个ActivityTask
    ManagerService服务
    通过反射创建ActivityTaskManagerService.Lifecycle.class ,在lifecycle的构造方法里创建ActivityTaskManagerService 然后调用lifecycle的onStart方法 ,在start方法里调用publishBinderService方法将ATM添加到ServiceManager里
    在创建activityTaskManagerService时创建一个ClienLifeCycleManager 生命周期管理类
    接下来通过同样的方式创建AMS
    然后调用ATM.initialize方法
    在这个方法调用了createStackSupervisor方法创建ActivityStackSuperVisor对象,此对象是我们的栈管理对象。
    在调用setRecentTask方法,设置当前任务栈,就是看当前有哪些应用在运行的栈。
    Ams调用setSystemProcess方法将AMS保存到systemServiceManager中。
    AMS.systemReady方法会去启动luncher桌面应用

    WMS:


    image.png

    Activity启动流程
    Activity.startActivity->startActivityForUser>instrumention.execuStartActivity -> ATM->判断进程是否存在:
    存在->realStartActivityLocked 首先获取clientLifeCycleManager,获取一个clientTransaction去执行生命周期的onCreate和onResume方法


    image.png

    不存在->mService .startProcessAsync 用socket通知zygote去fork新的进程。在AMS里调用startProcess方法去调用Process里面的ZygoteProcess的start方法,然后创建localSocket去通知zygote进程创建新的进程,Activity通过Attach application将把他的ApplicationThread给到AMS,然后Ams拿到ApplcationThread后就可以通过他进入到App进程,去处理它的生命周期。

    相关文章

      网友评论

          本文标题:Android 启动流程

          本文链接:https://www.haomeiwen.com/subject/xflplrtx.html