App启动过程

启动过程概述

  • Launcher 接收到点击事件,获取应用信息,向ActivityManagerService(AMS)发起启动应用的请求(例子中启动calculator计算器)
  • AMS请求Launcher Pause(Launcher保存状态进入后台)
  • Launcher Pause,并向AMS发送Pause完毕的请求
  • AMS向Zygote进程请求启动一个新进程(calculator)(Note:通过Socket的方式)
  • Zygote fork出新进程(calculator),在新进程中执行ActivityThread类的main方法
  • calculator想AMS请求attach到AMS
  • AMS请求calculator lauch
  • calculator调用onCreate,onResume方法
App启动流程图

代码调用分析

Launcher 接收到点击事件向AMS发起启动应用的请求

ActivityManagerProxy.java的startActivity 函数打印的调用栈:

07-29 07:06:11.691  6231  6231 D zhibinw : java.lang.RuntimeException: ActivityManagerProxy-startActivity
07-29 07:06:11.691  6231  6231 D zhibinw :  at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2409)
07-29 07:06:11.691  6231  6231 D zhibinw :  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1496)
07-29 07:06:11.691  6231  6231 D zhibinw :  at android.app.Activity.startActivityForResult(Activity.java:3788)
07-29 07:06:11.691  6231  6231 D zhibinw :  at android.app.Activity.startActivity(Activity.java:4055)
07-29 07:06:11.691  6231  6231 D zhibinw :  at com.android.launcher3.Launcher.startActivity(Launcher.java:3314)
07-29 07:06:11.691  6231  6231 D zhibinw :  at com.android.launcher3.Launcher.startActivitySafely(Launcher.java:3338)
07-29 07:06:11.691  6231  6231 D zhibinw :  at com.android.launcher3.Launcher.startAppShortcutOrInfoActivity(Launcher.java:3108)
07-29 07:06:11.691  6231  6231 D zhibinw :  at com.android.launcher3.Launcher.onClickAppShortcut(Launcher.java:3067)
07-29 07:06:11.691  6231  6231 D zhibinw :  at com.android.launcher3.Launcher.onClick(Launcher.java:2895)
07-29 07:06:11.691  6231  6231 D zhibinw :  at android.view.View.performClick(View.java:4781)
07-29 07:06:11.691  6231  6231 D zhibinw :  at android.view.View$PerformClick.run(View.java:19874)
07-29 07:06:11.691  6231  6231 D zhibinw :  at android.os.Handler.handleCallback(Handler.java:739)
07-29 07:06:11.691  6231  6231 D zhibinw :  at android.os.Handler.dispatchMessage(Handler.java:95)
07-29 07:06:11.691  6231  6231 D zhibinw :  at android.os.Looper.loop(Looper.java:135)
07-29 07:06:11.691  6231  6231 D zhibinw :  at android.app.ActivityThread.main(ActivityThread.java:5258)
07-29 07:06:11.691  6231  6231 D zhibinw :  at java.lang.reflect.Method.invoke(Native Method)
07-29 07:06:11.691  6231  6231 D zhibinw :  at java.lang.reflect.Method.invoke(Method.java:372)
07-29 07:06:11.691  6231  6231 D zhibinw :  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
07-29 07:06:11.691  6231  6231 D zhibinw :  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
  • Launcher进程启动的调用栈:
    ZygoteInit.main -> ActivityThread.main -> Looper.loop(进入消息循环)
  • 消息循环中收到系统分发过来的消息,回调onClick方法,调用startActivity方法
  • 通过ActivityManagerProxy代理对象将请求发送给AMS
AMS请求Launcher Pause

ApplicationThreadProxy 的 schedulePauseActivity 函数打印的调用栈:

07-29 07:06:11.922  4151  4183 D zhibinw : java.lang.RuntimeException: ApplicationThreadProxy-schedulePauseActivity
07-29 07:06:11.922  4151  4183 D zhibinw :  at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:699)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:842)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityStackSupervisor.pauseBackStacks(ActivityStackSupervisor.java:680)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:1638)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1477)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityStackSupervisor.resumeTopActivitiesLocked(ActivityStackSupervisor.java:2520)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:2125)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityStackSupervisor.startActivityUncheckedLocked(ActivityStackSupervisor.java:2258)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1560)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:994)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3415)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:3402)
07-29 07:06:11.922  4151  4183 D zhibinw :  at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:140)
07-29 07:06:11.922  4151  4183 D zhibinw :  at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2223)
07-29 07:06:11.922  4151  4183 D zhibinw :  at android.os.Binder.execTransact(Binder.java:446)

在一系列调用之后,AMS进程向Launcher发送pause的请求,同样通过IPC。
在onPause方法中查看调用栈:

07-29 07:06:12.019  6231  6231 D zhibinw :  at com.android.launcher3.Launcher.onPause(Launcher.java:1237)
07-29 07:06:12.019  6231  6231 D zhibinw :  at android.app.Activity.performPause(Activity.java:6144)
07-29 07:06:12.019  6231  6231 D zhibinw :  at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1310)
07-29 07:06:12.019  6231  6231 D zhibinw :  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3248)
07-29 07:06:12.019  6231  6231 D zhibinw :  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3221)
07-29 07:06:12.019  6231  6231 D zhibinw :  at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3195)
07-29 07:06:12.019  6231  6231 D zhibinw :  at android.app.ActivityThread.access$1000(ActivityThread.java:151)
07-29 07:06:12.019  6231  6231 D zhibinw :  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1314)
07-29 07:06:12.019  6231  6231 D zhibinw :  at android.os.Handler.dispatchMessage(Handler.java:102)
07-29 07:06:12.019  6231  6231 D zhibinw :  at android.os.Looper.loop(Looper.java:135)
07-29 07:06:12.019  6231  6231 D zhibinw :  at android.app.ActivityThread.main(ActivityThread.java:5258)
07-29 07:06:12.019  6231  6231 D zhibinw :  at java.lang.reflect.Method.invoke(Native Method)
07-29 07:06:12.019  6231  6231 D zhibinw :  at java.lang.reflect.Method.invoke(Method.java:372)
07-29 07:06:12.019  6231  6231 D zhibinw :  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
07-29 07:06:12.019  6231  6231 D zhibinw :  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

至此,Launcher的onPause结束。

Launcher 向AMS发送Pause完毕的请求
07-29 07:06:12.022  6231  6231 D zhibinw : java.lang.RuntimeException: ActivityManagerProxy-activityPaused
07-29 07:06:12.022  6231  6231 D zhibinw :  at android.app.ActivityManagerProxy.activityPaused(ActivityManagerNative.java:2920)
07-29 07:06:12.022  6231  6231 D zhibinw :  at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3206)
07-29 07:06:12.022  6231  6231 D zhibinw :  at android.app.ActivityThread.access$1000(ActivityThread.java:151)
07-29 07:06:12.022  6231  6231 D zhibinw :  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1314)
07-29 07:06:12.022  6231  6231 D zhibinw :  at android.os.Handler.dispatchMessage(Handler.java:102)
07-29 07:06:12.022  6231  6231 D zhibinw :  at android.os.Looper.loop(Looper.java:135)
AMS向Zygote请求启动一个新进程(calculator)

AMS尝试去启动calculator的界面,发现没有,所有想Zygote进程请求创建一个新的进程。Zygote存在的意义就是创建新的进程,AMS通过Socket和Zygote进行通信。

07-29 07:06:12.077  4151  5830 D zhibinw :  at android.os.Process.zygoteSendArgsAndGetResult(Process.java:579)
07-29 07:06:12.077  4151  5830 D zhibinw :  at android.os.Process.startViaZygote(Process.java:692)
07-29 07:06:12.077  4151  5830 D zhibinw :  at android.os.Process.start(Process.java:491)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3034)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:2902)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:2787)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked(ActivityStackSupervisor.java:1337)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:1926)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1477)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityStackSupervisor.resumeTopActivitiesLocked(ActivityStackSupervisor.java:2520)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1017)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:913)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:6374)
07-29 07:06:12.077  4151  5830 D zhibinw :  at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:513)
07-29 07:06:12.077  4151  5830 D zhibinw :  at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2223)
07-29 07:06:12.077  4151  5830 D zhibinw :  at android.os.Binder.execTransact(Binder.java:446)
Zygote fork出新进程(calculator),在新进程中执行 ActivityThread类的main方法
07-29 07:06:12.104  9272  9272 D zhibinw : ZygoteInit.invokeStaticMain
07-29 07:06:12.104  9272  9272 D zhibinw : java.lang.RuntimeException: android.app.ActivityThread
07-29 07:06:12.104  9272  9272 D zhibinw :  at com.android.internal.os.RuntimeInit.invokeStaticMain(RuntimeInit.java:232)
07-29 07:06:12.104  9272  9272 D zhibinw :  at com.android.internal.os.RuntimeInit.applicationInit(RuntimeInit.java:322)
07-29 07:06:12.104  9272  9272 D zhibinw :  at com.android.internal.os.RuntimeInit.zygoteInit(RuntimeInit.java:277)
07-29 07:06:12.104  9272  9272 D zhibinw :  at com.android.internal.os.ZygoteConnection.handleChildProc(ZygoteConnection.java:911)
07-29 07:06:12.104  9272  9272 D zhibinw :  at com.android.internal.os.ZygoteConnection.runOnce(ZygoteConnection.java:267)
07-29 07:06:12.104  9272  9272 D zhibinw :  at com.android.internal.os.ZygoteInit.runSelectLoop(ZygoteInit.java:789)
07-29 07:06:12.104  9272  9272 D zhibinw :  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)
alculator 向 AMS 请求 attach 到 AMS

新进程启动后的第一件事就是上报(attach)到 SystemServer(AMS) ,使得 SystemServer(AMS) 可以统一管理调度。

07-29 07:06:12.107  9272  9272 D zhibinw : ActivityManagerProxy-attachApplication
07-29 07:06:12.107  9272  9272 D zhibinw : java.lang.RuntimeException: ActivityManagerProxy-attachApplication
07-29 07:06:12.107  9272  9272 D zhibinw :  at android.app.ActivityManagerProxy.attachApplication(ActivityManagerNative.java:2874)
07-29 07:06:12.107  9272  9272 D zhibinw :  at android.app.ActivityThread.attach(ActivityThread.java:5095)
07-29 07:06:12.107  9272  9272 D zhibinw :  at android.app.ActivityThread.main(ActivityThread.java:5247)
07-29 07:06:12.107  9272  9272 D zhibinw :  at java.lang.reflect.Method.invoke(Native Method)
07-29 07:06:12.107  9272  9272 D zhibinw :  at java.lang.reflect.Method.invoke(Method.java:372)
07-29 07:06:12.107  9272  9272 D zhibinw :  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
07-29 07:06:12.107  9272  9272 D zhibinw :  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
07-29 07:06:12.134  4151  6177 D zhibinw : scheduleLaunchActivity
07-29 07:06:12.134  4151  6177 D zhibinw : java.lang.RuntimeException: ApplicationThreadProxy-scheduleLaunchActivity
07-29 07:06:12.134  4151  6177 D zhibinw :  at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:779)
07-29 07:06:12.134  4151  6177 D zhibinw :  at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1226)
07-29 07:06:12.134  4151  6177 D zhibinw :  at com.android.server.am.ActivityStackSupervisor.attachApplicationLocked(ActivityStackSupervisor.java:594)
07-29 07:06:12.134  4151  6177 D zhibinw :  at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:6084)
07-29 07:06:12.134  4151  6177 D zhibinw :  at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:6146)
07-29 07:06:12.134  4151  6177 D zhibinw :  at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:481)
07-29 07:06:12.134  4151  6177 D zhibinw :  at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2223)
07-29 07:06:12.134  4151  6177 D zhibinw :  at android.os.Binder.execTransact(Binder.java:446)
AMS请求calculator launch

AMS 调用 scheduleLaunchActivity 通过IPC 传递到 ActivityThread 的 scheduleLaunchActivity,在 ActivityThread 里面它用 Message 的方式发送自己主线程的 Handler 来异步处理

9272  9272 D zhibinw :  at com.android.calculator2.Calculator.onCreate(Calculator.java:158)
9272  9272 D zhibinw :  at android.app.Activity.performCreate(Activity.java:6033)
9272  9272 D zhibinw :  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
9272  9272 D zhibinw :  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
9272  9272 D zhibinw :  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
9272  9272 D zhibinw :  at android.app.ActivityThread.access$800(ActivityThread.java:151)
9272  9272 D zhibinw :  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
9272  9272 D zhibinw :  at android.os.Handler.dispatchMessage(Handler.java:102)
9272  9272 D zhibinw :  at android.os.Looper.loop(Looper.java:135)
9272  9272 D zhibinw :  at android.app.ActivityThread.main(ActivityThread.java:5258)
9272  9272 D zhibinw :  at java.lang.reflect.Method.invoke(Native Method)
9272  9272 D zhibinw :  at java.lang.reflect.Method.invoke(Method.java:372)
9272  9272 D zhibinw :  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
9272  9272 D zhibinw :  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
9272  9272 D zhibinw :  at com.android.calculator2.Calculator.onResume(Calculator.java:260)
9272  9272 D zhibinw :  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257)
9272  9272 D zhibinw :  at android.app.Activity.performResume(Activity.java:6119)
9272  9272 D zhibinw :  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2975)
9272  9272 D zhibinw :  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017)
9272  9272 D zhibinw :  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392)
9272  9272 D zhibinw :  at android.app.ActivityThread.access$800(ActivityThread.java:151)
9272  9272 D zhibinw :  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
9272  9272 D zhibinw :  at android.os.Handler.dispatchMessage(Handler.java:102)
9272  9272 D zhibinw :  at android.os.Looper.loop(Looper.java:135)
9272  9272 D zhibinw :  at android.app.ActivityThread.main(ActivityThread.java:5258)
9272  9272 D zhibinw :  at java.lang.reflect.Method.invoke(Native Method)
9272  9272 D zhibinw :  at java.lang.reflect.Method.invoke(Method.java:372)
9272  9272 D zhibinw :  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
9272  9272 D zhibinw :  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

参考

Android 应用程序启动过程分析

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

推荐阅读更多精彩内容