Activity的启动流程
Application的初始化
从应用进程到系统进程
ActivityThread在创建的时候,会将自己的ApplicationThread绑定到AMS中。
- ActivityThread.main()
- ActivityThread.attach()
- IActivityManager.attachApplication(mAppThread)
- Binder.transact()
- IActivityManager.attachApplication(mAppThread)
- ActivityThread.attach()
应用程序通过IActivityManager接口发起系统调用,调用attachApplication并传递IApplicationThread,执行流程从应用进程到了系统进程。
- ActivityManagerService.onTransact()
- ActivityManagerService.attachApplication(IApplicationThread thread)
AMS作为IActivityService的接口的服务端实现,会响应客户端的请求,最终attachApplication(IApplicationThread thread)方法会得到执行,mAppThread将存在系统维护的ProcessRecord中。AMS在ProcessRecord中维护了所有进程运行时的信息,一旦发生应用进程的绑定请求,ProcessRecord.thread就被赋值成为应用进程的IApplicationThread实例,这样AMS就可以通过IApplicationThread实例向应用进程的实例发起调用
- ActivityManagerService.attachApplication(IApplicationThread thread)
从系统进程到应用进程
在AMS.attachApplication()的过程中,会传递一些信息给应用进程,以便应用程序的初始化,因此系统进程发起如下调用:
- ActivityManagerService.attachApplication()
- ActivityManagerService.attachApplicationLocked()
- IApplicationThread.bindApplication(processName, appInfo …)
- Binder.transact()
- IApplicationThread.bindApplication(processName, appInfo …)
- ActivityManagerService.attachApplicationLocked()
此时AMS将作为客户端,通过IApplicationThread接口向应用进程发起调用。
- AMS通过
ProcessRecord来维护进程的运行状态信息,需要将应用进程绑定到ProcessRecord才能开始一个Application的构建。 - AMS维护的
ProcessRecord包含了进程运行时的信息,如应用进程的名称、解析AndroidManifest.xml得到的数据结构ApplicationInfo等,其中传递给应用进程的数据都是Parcelable类型的实例。
应用进程响应请求的调用关系如下:
- ApplicationThread.onTransact()
- ApplicationThread.bindApplication()
- ActivityThread.H.handleBindApplication()
- Application.onCreate()
- ActivityThread.H.handleBindApplication()
- ApplicationThread.bindApplication()
在bindApplication完成一些简单的数据封装后,通过Handler发送一个BIND_APPLICATION消息到ActivityThread,最终在ActivityThread.handleBindApplication()中被执行,app = data.info.makeApplication(data.restrictedBackupMode, null);通过AppBindData创建一个Application对象,然后调用Application.attach(context)来绑定Context,并调用Application.onCreate()函数。历经应用进程和系统进程之间的来回,才创建了一个应用程序。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 BravestSnail's Blog!