站在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通信,然后发送不同消息处理。
.