Android之Activity启动过程

一、启动过程

  1. 启动过程

 

 

 

  2. 执行流程

 

  1. 发送startAcitivity请求到AMS。
  2. AMS查看应用进程是否启动。
    1. 未启动应用进程。
      1. AMS向Zygote进程发送启动进程请求(socket通信)。
      2. Zygote进程Fork应用进程。
    2. 应用进程已经启动,进程创建Activity过程。

 

Zygote Fork应用进程:

  1. AMS里调用startProcessLocked()函数。在startProcessLocked()函数里做了两件事:
    1. 调用启动应用进程的函数,并返回应用进程信息,包括pid。调用Process.start()函数。
    2. 向AMS的Looper里发送一个延迟消息,延迟时间PROC_START_TIMEOUT = 10s,这个时间是进程启动时间限制,当前进程在规定时间内没有完成启动需要将应用的相关信息清除,包括:应用正在启动的组件。
  2. 在Process.start()函数里调用startViaZygote(processClass, )函数。
  3. 在startViaZygote()函数里做了两件事:
    1. 打开AMS与Zygote进程通信的Socket。
    2. 通过Socket向Zygote进程发送启动应用进程消息。
  4. 在Zygote进程调用runOnce()函数。
  5. 在runOnce()函数调用Zygote.forkAndSpecialize()函数创建子进程。
  6. Fork进程后返回父进程和子进程,当前pid != 0是返回到父进程runOnce()函数执行里。pid == 0是返回到子进程里的runOnce()函数。
  7. 通过Fork返回的pid进程不行处理,在子进程里调用handleChildPoc()函数。在父进程里调用handleParentPoc()函数。
  8. 在创建的应用进程(Zygote子进程)里调用ActivityThread.main()函数。
  9. 下面流程就是应用创建Application的过程。

 

应用进程创建Application过程:

  1. 应用进程执行ActivityThread类的main()函数,在main()函数中创建主线程Looper,调用ActivityThread.attach()发送进程创建完成请求,最后,运行Looper(Looper.loop())。
  2. 在ActivityThread.attach()函数里,获取AMS的Binder代理对象,通过AMS的Binder对象向AMS发送进程创建完成的请求,就是调用ActivityManagerService.attachApplication(mAppThread, )函数。在向AMS发送请求后,在ActivityThread.attach()函数里创建Instrumentation对象。
  3. 在AMS的ActivityManagerService.attachApplication(mAppThread, )函数里调用ActivityManagerService.attachApplicationLocked(thread, )函数。
  4. 在AMS.attachApplicationLocked(thread, )函数里,通过ApplicationThread的Binder代理对象thread,调用ApplicationThread.bindApplication()函数(此处AMS通过Binder与应用IPC通信)。
  5. 在ActivityThread.ApplicationThrad.bindApplication()函数里使用Handler,向UI线程Looper发送消息,调用sendMessage(H.B_APPLICATION, data)。
  6. 在ActivityThread.Handler里收到Message的Handler处理回调,调用ActivityThread.handleBindApplicaiton()函数。
  7. 在ActivityThread.handleBindApplication()函数里创建Application对象。

创建Activity过程:

  1. 在AMS里调用realStartActivityLocked(hr, app, true, true) 函数。参数hr是AndroidRecord对象,通过stack获取的,在AMS里有两个stack,分别是launchStack和mFocusedStack。
    1. launchStack是存储桌面应用的信息。
    2. mFocusedStack是存储应用Task的。
    3. 通过mFocusedStack获取Task里的Activity信息。stack.topRunningActivityLocked(null)函数获取ActivityRecord对象,即Activity信息。
  2. 在realStartActivityLocked(ActivityRecord r, )函数里,调用app.thread.scheduleLaunchActivity(new Intent(r.intent), )函数。注意:此处流程是28版本以下的,在28版本以上因为lifecycle,startActivity流程有所改变。
    1. app是ProcessRecord,就是AMS通过Zygote进程fork的应用进程。
    2. app.thread是应用进程的Binder代理对象,就是ActivityThread.ApplicationThread对象。AMS通过app.thread(应用Binder代理对象)与应用进程IPC通信,通过Binder代理对象app.thread.scheduleLaunchActivity(new Intent(r.intent), )函数。
  3. 在应用进程里ApplicationThread.scheduleLaunchActivity()函数向主线程Looper发送消息,sendMessage(H.LAUNCH_ACTIVITY)。
  4. 在ActivityThread.H(Handler Callback)里处理消息,调用handleLaunchActivity(r, null)函数,r是ActivityClientRecord对象,r.packageInfo通过getPackageInfoNoCheck()函数获取LoadedApk对象,在创建Activity对象里需要使用classload反射加载Activity类。
  5. 在handleLaunchActivity()函数里调用performLaunchActivity()函数。
  6. 在performLaunchActivity()函数里调用mInstrumentation.newActivity(cl, )函数。
    1. mInstrumentation.newActivity(cl, )函数里通过反射创建Activity对象。
    2. 通过Activity对象调用attach()函数为将ContextImpl对象赋值给ContextWapper.mBase对象,mBase就是Activity的Context上下文对象。
    3. 通过makeApplication()函数获取应用进程创建后创建的Application对象。
    4. 通过mInstrumentation.callActivityOnCreate(activity, )函数调用Activity的回调函数onCreate()
posted @ 2021-09-11 18:32  naray  阅读(839)  评论(0编辑  收藏  举报