Android进程启动流程(App启动)

理解Android进程创建流程
理解Android进程启动之全过程

站在GITYUAN大神的肩膀上学习,用一张神图表示进程基本的启动流程.

Android进程启动流程(App启动)_第1张图片
93730-5121eb1d162d109e.png

上图还需对照源码进行查看,简述一下启动流程


在 Android系统全貌描述到了Zygote孵化了第一个进程是system_server进程,而且孵化第一个App进程是Launcher,也就是桌面App。


当点击 桌面App的时候,发起进程就是 Launcher所在的进程,启动远程进程,利用 Binder发送消息给 system_server进程


system_server进程中启动了N多服务,例如 ActiivityManagerService,WindowManagerService等。启动进程的操作会先调用 AMS.startProcessLocked方法,内部调用 Process.start(android.app.ActivityThread);而后通过 socket通信告知 Zygote进程fork子进程,即app进程。进程创建后将 ActivityThread加载进去,执行 ActivityThread.main()方法。


app进程中, main方法会实例化 ActivityThread,同时创建 ApplicationThread,Looper,Hander对象,调用 attach方法进行 Binder通信, looper启动循环。 attach方法内部获取 ActivityManagerProxy对象,其实现了 IActivityManager接口,作为客户端调用 attachApplication(mAppThread)方法,将 thread信息告知 AMS


system_server进程中, AMS中会调用 ActivityManagerNative.onTransact方法,真正的逻辑在服务端 AMS.attachApplication方法中,内部调用 AMS.attachApplicationLocked方法,方法的参数是 IApplicationThread,在此处是 ApplicationThreadProxy对象,用于跟前面通过 Process.start()所创建的进程中 ApplicationThread对象进行通信。
attachApplicationLocked方法会处理 Provider, Activity, Service, Broadcast相应流程,调用 ApplicationThreadProxy.bindApplication方法,通过 Binder通信,传递给 ApplicationThreadNative.onTransact方法。

app进程中,真正的逻辑在ActivityThread.bindApplication方法中。bindApplication方法的主要功能是依次向主线程发送消息H.SET_CORE_SETTINGS 和H.BIND_APPLICATION。后续创建Application,Context等。Activity的回调也会是通过Binder通信,然后发送不同消息处理。
.

你可能感兴趣的:(Android进程启动流程(App启动))