Application的初始化

从应用进程到系统进程

ActivityThread在创建的时候,会将自己的ApplicationThread绑定到AMS中。

  • ActivityThread.main()
    • ActivityThread.attach()
      • IActivityManager.attachApplication(mAppThread)
        • Binder.transact()

应用程序通过IActivityManager接口发起系统调用,调用attachApplication并传递IApplicationThread,执行流程从应用进程到了系统进程。

  • ActivityManagerService.onTransact()
    • ActivityManagerService.attachApplication(IApplicationThread thread)
      AMS作为IActivityService的接口的服务端实现,会响应客户端的请求,最终attachApplication(IApplicationThread thread)方法会得到执行,mAppThread将存在系统维护的ProcessRecord中。AMS在ProcessRecord中维护了所有进程运行时的信息,一旦发生应用进程的绑定请求,ProcessRecord.thread就被赋值成为应用进程的IApplicationThread实例,这样AMS就可以通过IApplicationThread实例向应用进程的实例发起调用

从系统进程到应用进程

AMS.attachApplication()的过程中,会传递一些信息给应用进程,以便应用程序的初始化,因此系统进程发起如下调用:

  • ActivityManagerService.attachApplication()
    • ActivityManagerService.attachApplicationLocked()
      • IApplicationThread.bindApplication(processName, appInfo …)
        • Binder.transact()

此时AMS将作为客户端,通过IApplicationThread接口向应用进程发起调用。

  1. AMS通过ProcessRecord来维护进程的运行状态信息,需要将应用进程绑定到ProcessRecord才能开始一个Application的构建。
  2. AMS维护的ProcessRecord包含了进程运行时的信息,如应用进程的名称、解析AndroidManifest.xml得到的数据结构ApplicationInfo等,其中传递给应用进程的数据都是Parcelable类型的实例。
    应用进程响应请求的调用关系如下:
  • ApplicationThread.onTransact()
    • ApplicationThread.bindApplication()
      • ActivityThread.H.handleBindApplication()
        • Application.onCreate()

bindApplication完成一些简单的数据封装后,通过Handler发送一个BIND_APPLICATION消息到ActivityThread,最终在ActivityThread.handleBindApplication()中被执行,app = data.info.makeApplication(data.restrictedBackupMode, null);通过AppBindData创建一个Application对象,然后调用Application.attach(context)来绑定Context,并调用Application.onCreate()函数。历经应用进程和系统进程之间的来回,才创建了一个应用程序。