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

上图还需对照源码进行查看,简述一下启动流程:
<p>
在Android系统全貌描述到了Zygote孵化了第一个进程是system_server进程,而且孵化第一个App进程是Launcher,也就是桌面App。
<p>
当点击桌面App的时候,发起进程就是Launcher所在的进程,启动远程进程,利用Binder发送消息给system_server进程;
<p>
在system_server进程中启动了N多服务,例如ActiivityManagerService,WindowManagerService等。启动进程的操作会先调用AMS.startProcessLocked方法,内部调用 Process.start(android.app.ActivityThread);而后通过socket通信告知Zygote进程fork子进程,即app进程。进程创建后将ActivityThread加载进去,执行ActivityThread.main()方法。
<p>
在app进程中,main方法会实例化ActivityThread,同时创建ApplicationThread,Looper,Hander对象,调用attach方法进行Binder通信,looper启动循环。attach方法内部获取ActivityManagerProxy对象,其实现了IActivityManager接口,作为客户端调用attachApplication(mAppThread)方法,将thread信息告知AMS。
<p>
在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系统中进程的启动流程,从Zygote孵化system_server到App进程的创建,再到ActivityManagerService如何通过Binder通信启动App进程。在App进程中,ActivityThread的main方法启动,创建Application、Looper和Handler,与system_server进行Binder通信,完成应用的初始化和服务绑定。整个过程中涉及的组件和服务如ActivityManagerService、ApplicationThreadProxy和AMS的交互过程也进行了深入阐述。
2569

被折叠的 条评论
为什么被折叠?



