android项目如何启动不了了,Android-启动Activity流程(包括应用程序未启动)

一、流程

Activity.startActivity [这里中间会经过多个Activity流程]

->Activity.startActivityForResult

->Instrumentation.execStartActivity

->ActivityTaskManagerService.startActivity [这是通过ActivityTaskManager.getService()]

->ActivityTaskManagerService.startActivityAsUser

->ActivityStartController.obtainStarter [这是为了获取ActivityStarter]

->ActivityStarter.execute [setMayWait设置mRequest.mayWait为true]

->ActivityStarter.startActivityMayWait [初始化rInfo和aInfo]

->ActivityStarter.startActivity

->ActivityStarter.startActivity [初始化err和ActivityRecord]

->ActivityStarter.startActivity

->ActivityStarter.startActivityUnchecked [初始化TaskRecord]

->RootActivityContainer.resumeFocusedStacksTopActivities

->ActivityStack.resumeTopActivityUncheckedLocked

->ActivityStack.resumeTopActivityInnerLocked

->ActivityStack.startPausingLocked [开始暂停当前恢复的活动]

->PauseActivityItem.obtain

->ActivityTaskManagerService.getLifecycleManager

->ClientLifecycleManager.scheduleTransaction

->ClientLifecycleManager.scheduleTransaction

->ClientTransaction.getClient

->ClientTransaction.schedule

->IApplicationThread.scheduleTransaction

->ActivityThread.scheduleTransaction

->ClientTransactionHandler.scheduleTransaction

->ActivityThread.sendMessage [H.EXECUTE_TRANSACTION]

->TransactionExecutor.execute

->TransactionExecutor.executeCallbacks [这个流程的item是PauseActivityItem]

->TransactionExecutor.cycleToPath

->TransactionExecutor.performLifecycleSequence

->PauseActivityItem.execute

->ActivityThread.handlePauseActivity

->ActivityThread.performPauseActivity

->ActivityThread.performPauseActivityIfNeeded

->Instrumentation.callActivityOnPause

->Activity.performPause

->Activity.onPause

->PauseActivityItem.postExecute

->ActivityTaskManagerService.activityPaused

->ActivityStack.activityPausedLocked [ActivityStack对象是在ActivityRecord]

->ActivityStack.completePauseLocked

->RootActivityContainer.resumeFocusedStacksTopActivities

->ActivityStack.resumeTopActivityUncheckedLocked

->ActivityStack.resumeTopActivityInnerLocked

->ActivityStack.resumeTopActivityInnerLocked [暂停流程结束又回到了这个方法]

->ActivityStackSupervisor.startSpecificActivityLocked [分两种情况,没有应用进程和有]

->ActivityStackSupervisor.realStartActivityLocked [有应用程序进程]

->ActivityTaskManagerService.mH.sendMessage [没有应用程序进程]

这里说明下:sendMessage其实是发送了一个Function,即ActivityManagerInternal::startProcess。下面就是分析startProcess

->ActivityManagerInternal.startProcess [AMS.LocalService.startProcess]

->ActivityManagerService.LocalService.startProcess

->ActivityManagerService.startProcessLocked

->ProcessList.startProcessLocked

->ProcessList.startProcessLocked [三个参数]

->ProcessList.startProcessLocked [五个参数]

->ProcessList.startProcessLocked [十二个参数]

->ProcessList.startProcess

->Process.start [非zygote进程]

->ZygoteProcess.start

->ZygoteProcess.startViaZygote

->ZygoteProcess.openZygoteSocketIfNeeded [这是由下一个方法调用]

->ZygoteProcess.attemptConnectionToPrimaryZygote [尝试连接Zygote]

->ZygoteState.connect

->ZygoteProcess.zygoteSendArgsAndGetResult

->ZygoteProcess.attemptZygoteSendArgsAndGetResult

->zygoteState.mZygoteOutputWriter.write(msgStr) [localsocket通信]

->执行到这里,就已经发送了Socket给Zygote进程,下面分析Zygote进程启动

->app_main.cpp的main方法

->AndroidRuntime.start

->ZygoteInit.main [app启动Zygote进程]

->new ZygoteServer()

->zygoteServer.runSelectLoop(abiList) [循环监听AMS发来的消息]

->ZygoteServer.acceptCommandPeer [pollIndex == 0]

->ZygoteSocket.accept()

->ZygoteServer.createNewConnection

->new ZygoteConnection

->ZygoteConnection.processOneCommand [pollIndex < usapPoolEventFDIndex]

->Zygote.forkAndSpecialize [这里就是fork流程]

->Zygote.nativeForkAndSpecialize

->com_android_internal_os_Zygote.cpp#nativeForkAndSpecialize

->com_android_internal_os_Zygote.cpp#ForkAndSpecializeCommon

->fork 不再往底层分析 processOneCommand

->ZygoteConnection.handleChildProc [parsedArgs.mInvokeWith=null]

->ZygoteInit.zygoteInit [isZygote=false]

->RuntimeInit.redirectLogStreams()

->RuntimeInit.commonInit()

->ZygoteInit.nativeZygoteInit() [在AndroidRuntime里面注册]

->com_android_internal_os_ZygoteInit_nativeZygoteInit

->gCurRuntime->onZygoteInit #具体实现在AppRuntime即app_main里面

->ProcessState::self->startThreadPool #开启binder线程池

->RuntimeInit.applicationInit [回到ZygoteInit]

->RuntimeInit.findStaticMain

->new MethodAndArgsCaller [最终返回给runSelectLoop]

->MethodAndArgsCaller.run [在ZygoteInit.main取到runnable执行]

->Method.invoke [在MethodAndArgsCaller.run中]

->ActivityThread.main [传到MethodAndArgsCaller中]

->new ActivityThread

->ActivityThread.attach

->ActivityManagerService.attachApplication [传入IApplicationThread这个Binder]

->ActivityManagerService.attachApplicationLocked [处理attachApplicationLocked]

->ApplicationThread.bindApplication [绑定AMS这个binder]

->ActivityThread.sendMessage [发送BIND_APPLICATION]

->ActivityThread.handleBindApplication

->ActivityThread.getPackageInfoNoCheck [获取LoadedApk]

->ContextImpl.createAppContext

->反射创建Instrumentation

->LoadedApk.makeApplication

->Instrumentation.newApplication

->Application.attach

->Instrumentation.callApplicationOnCreate

->ActivityManagerService.attachApplicationLocked [回到attachApplicationLocked]

->AtmInternal.attachApplication [ActivityTaskManagerService]

->ActivityStackSupervisor.realStartActivityLocked [回到了启动Activity的流程]

->通过ClientTransaction启动Activity

二、参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值