重要函数调用关系
按函数的嵌套调用关系化简Activty启动流程:
【预备部分】:从某个Activty通过调用startActivity来启动另外一个Activity开始
当一个Activity想启动另一个Activity时,最常见的方式是:
context.startActivity
context.startActivity的实现是在ContextImpl.java中,但这只是一层封装,其最终会调用AMS的startActivity,而真正的启动过程是从AMS开始的。
ContextImpl.java::startActivity
Instrumentation.java::execStartActivity
ActivityManagerService.java::startActivity
要点:
- ContextImpl通过mMainThread找到一个桥梁实例Instrumentation(负责APP组件的创建和AMS与APP的之间的通信)
- Instrumentation通过ActivityManager打到AMS
- 调用AMS的startActivity函数
【Activity启动前半部分】:从请求启动Activity到请求启动应用进程
ActivityManagerService.java::startActivity(){
ActivityStarter.java::startActivityMayWait(){
ActivityStarter.java::startActivityLocked(){
ActivityStarter.java::startActivity(){
ActivityStarter.java::startActivityUnchecked(){
//P51:启动一个Activity
ActivityStack.java::startActivityLocked()
//P52:唤醒栈顶Activity
ActivityStackSupervisor.java::resumeFocusedStackTopActivityLocked(){
ActivityStack.java::resumeTopActivityUncheckedLocked(){
ActivityStack.java::resumeTopActivityInnerLocked(){
StackSupervisor.java::startSpecificActivityLocked(){
//91:如果app!=null
realStartActivityLocked()
//92:否则:启动一个应用
ActivityManagerService.java::startProcessLocked(){
//通知Zygote派生一个子进程
Process::start()
}}}}}
}
}}}}
要点:
- 以AMS的startActivity为入口
- ActivityStarter中作启动参数合法性、权限检测等
- 新建ActivityRecord/TaskRecord,并找到合适的ActivityStack放到其栈顶
- 尝试唤醒栈顶Activity
- 如果没有相应的应用进程,则启动进程(又回到了AMS)
【Activity启动后半部分】: 从应用进程的创建到Activity启动
ActivityManagerService.java::starttProcessLocked(){
//发信号给Zygote创建一个新进程,注意参数:启动后将调用ActivityThread.main
Process.start("android.app.ActivityThread",...)(){
ActivityThread.java::main(){
//开始附着应用到进程
ActivityThread.java::attach(false){
RuntimeInit.setApplicationObject(mAppThread.asBinder())
ActivityManagmentService.java::attachApplication(){
//P5.1:绑定Application
ActivityThread.java::ApplicationThread.bindApplication(){
sendMessage(H.BIND_APPLICATION, data) //发信号导致下面的函数被调用
ActivityThread.java::handleBindApplication(){
Process.setArgV0(data.processName);//设置进程名称
}
//P5.2:附着Application
ActivityStackSupervisor.java::attachApplicationLocked(){
//P6.1真正启动Activity
ActivityStackSupervisor.java::realStartActivityLocked(){
ActivityThread.java::ApplicationThread.scheduleLaunchActivity(){
sendMessage(H.LAUNCH_ACTIVITY, r) //发信号导致下面的函数被调用
ActivityThread.java::handleLaunchActivity(){
ActivityThread.java::performLaunchActivity(){
Instrumentation.java::newActivity(){
//真正导入Activity的class
ClassLoader.java::loadClass().newInstance()
}
Instrumentation.java::callActivityOnCreate(){
Activity.java::performCreate(){
//调用Activity子类的onCreate,
//也就是应用开发时Activity中重载的那个onCreate()
Activity.java::onCreate()
}}}}
ActivityThread.java::handleResumeActivity(){
ActivityThread.java::performResumeActivity(){
Activity.java::performResume(){
Instrumentation.java::callActivityOnResume(){
//调用Activity子类的onResume,
//也就是应用开发时Activity中重载的那个onResume()
Activity.java::onResume
}}}}
}}}
//P5.3:附着ActiveService
ActiveServices.java::attachApplicationLocked
//P5.4:更新OomAdj
ActivityManagmentService.java::updateOomAdjLocked
}}}}}
要点:
- 以AMS的starttProcessLocked为入口
- 发信号给Zygote创建新进程
- 新进程的入口函数是ActivityThread.main
- 通过ActivityThread将新进程和APK绑定(ActivityThread根据app的参数初始化Instrumentation等变量)
- 将新进程附着到ActivityStackSupervisor(可理解为与某个ActivityStack关联)
- 启动获得焦点的ActivityStack的栈顶Activity,onCreate()/onResume()函数将被调用
- 附着APK中的服务
- 更新OomAdj