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

二、参考

Android10.0应用进程创建过程以及Zygote的fork流程-[Android取经之路]
在Android 10.0中Activity的启动流程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349