Android之Activity启动过程
一、启动过程
1. 启动过程
2. 执行流程
- 发送startAcitivity请求到AMS。
- AMS查看应用进程是否启动。
- 未启动应用进程。
- AMS向Zygote进程发送启动进程请求(socket通信)。
- Zygote进程Fork应用进程。
- 应用进程已经启动,进程创建Activity过程。
- 未启动应用进程。
Zygote Fork应用进程:
- AMS里调用startProcessLocked()函数。在startProcessLocked()函数里做了两件事:
- 调用启动应用进程的函数,并返回应用进程信息,包括pid。调用Process.start()函数。
- 向AMS的Looper里发送一个延迟消息,延迟时间PROC_START_TIMEOUT = 10s,这个时间是进程启动时间限制,当前进程在规定时间内没有完成启动需要将应用的相关信息清除,包括:应用正在启动的组件。
- 在Process.start()函数里调用startViaZygote(processClass, )函数。
- 在startViaZygote()函数里做了两件事:
- 打开AMS与Zygote进程通信的Socket。
- 通过Socket向Zygote进程发送启动应用进程消息。
- 在Zygote进程调用runOnce()函数。
- 在runOnce()函数调用Zygote.forkAndSpecialize()函数创建子进程。
- Fork进程后返回父进程和子进程,当前pid != 0是返回到父进程runOnce()函数执行里。pid == 0是返回到子进程里的runOnce()函数。
- 通过Fork返回的pid进程不行处理,在子进程里调用handleChildPoc()函数。在父进程里调用handleParentPoc()函数。
- 在创建的应用进程(Zygote子进程)里调用ActivityThread.main()函数。
- 下面流程就是应用创建Application的过程。
应用进程创建Application过程:
- 应用进程执行ActivityThread类的main()函数,在main()函数中创建主线程Looper,调用ActivityThread.attach()发送进程创建完成请求,最后,运行Looper(Looper.loop())。
- 在ActivityThread.attach()函数里,获取AMS的Binder代理对象,通过AMS的Binder对象向AMS发送进程创建完成的请求,就是调用ActivityManagerService.attachApplication(mAppThread, )函数。在向AMS发送请求后,在ActivityThread.attach()函数里创建Instrumentation对象。
- 在AMS的ActivityManagerService.attachApplication(mAppThread, )函数里调用ActivityManagerService.attachApplicationLocked(thread, )函数。
- 在AMS.attachApplicationLocked(thread, )函数里,通过ApplicationThread的Binder代理对象thread,调用ApplicationThread.bindApplication()函数(此处AMS通过Binder与应用IPC通信)。
- 在ActivityThread.ApplicationThrad.bindApplication()函数里使用Handler,向UI线程Looper发送消息,调用sendMessage(H.B_APPLICATION, data)。
- 在ActivityThread.Handler里收到Message的Handler处理回调,调用ActivityThread.handleBindApplicaiton()函数。
- 在ActivityThread.handleBindApplication()函数里创建Application对象。
创建Activity过程:
-
在AMS里调用realStartActivityLocked(hr, app, true, true) 函数。参数hr是AndroidRecord对象,通过stack获取的,在AMS里有两个stack,分别是launchStack和mFocusedStack。
-
launchStack是存储桌面应用的信息。
-
mFocusedStack是存储应用Task的。
-
通过mFocusedStack获取Task里的Activity信息。stack.topRunningActivityLocked(null)函数获取ActivityRecord对象,即Activity信息。
-
-
在realStartActivityLocked(ActivityRecord r, )函数里,调用app.thread.scheduleLaunchActivity(new Intent(r.intent), )函数。注意:此处流程是28版本以下的,在28版本以上因为lifecycle,startActivity流程有所改变。
-
app是ProcessRecord,就是AMS通过Zygote进程fork的应用进程。
-
app.thread是应用进程的Binder代理对象,就是ActivityThread.ApplicationThread对象。AMS通过app.thread(应用Binder代理对象)与应用进程IPC通信,通过Binder代理对象app.thread.scheduleLaunchActivity(new Intent(r.intent), )函数。
-
-
在应用进程里ApplicationThread.scheduleLaunchActivity()函数向主线程Looper发送消息,sendMessage(H.LAUNCH_ACTIVITY)。
-
在ActivityThread.H(Handler Callback)里处理消息,调用handleLaunchActivity(r, null)函数,r是ActivityClientRecord对象,r.packageInfo通过getPackageInfoNoCheck()函数获取LoadedApk对象,在创建Activity对象里需要使用classload反射加载Activity类。
-
在handleLaunchActivity()函数里调用performLaunchActivity()函数。
-
在performLaunchActivity()函数里调用mInstrumentation.newActivity(cl, )函数。
-
mInstrumentation.newActivity(cl, )函数里通过反射创建Activity对象。
-
通过Activity对象调用attach()函数为将ContextImpl对象赋值给ContextWapper.mBase对象,mBase就是Activity的Context上下文对象。
-
通过makeApplication()函数获取应用进程创建后创建的Application对象。
-
通过mInstrumentation.callActivityOnCreate(activity, )函数调用Activity的回调函数onCreate()
-