APP启动流程分析

1、要分析的问题

1、与正常trace比对,确认过耗时在哪个步骤(am create/pause/stop/start/doframe)?
2、与正常trace比对,确认过耗时在哪个cpu state(Running/Runnable/Sleep/Uninterruptible Sleep)?

2、启动分析

所谓冷启动就是启动该应用时,后台没有该应用的进程,此时系统会为该应用创建新的进程,之后会bindApplication来创建程并初始化application, 然后通过反射执行ActivityThread中的main方法。
而热启动则是,当启动应用时,后台已经存在该应用的进程,比如启动该应用后,再按home 键反馈至主界面后,再打开该应用。此时会从已有的进程中来启动应用,这种方式不会重新走bindApplication的动作。

1、冷启动流程(Cold Launch Flow ):

APP启动流程分析_第1张图片

android.intent.action.MAIN:决定应用的入口Activity,也就是我们启动应用时首先显示哪一个Activity。
android.intent.category.LAUNCHER:表示activity应该被列入系统的启动器(launcher)(其本质也是一个APP)。
凡是声明了上面filter的activity,都会被launcher解析出来,对应图标排列在桌面。这样,用户就可以通过点击的方式启动Activity了。

当我们点击APP图标的时候,首先会调用launcher的onClick()方法,然后会通过添加intent.addflag(Intent.FLAG_ACTIVITY_NEW_TASK)通过调用Activity类的startActivity方法先pause前台的launcher,然后resume想启动想要启动的activity。其细节流程如下:

1.1、onclick -> startActivity

APP启动流程分析_第2张图片

1.2、startActivityUnchecked -> resumreFocusedStackTopActivityLocked

APP启动流程分析_第3张图片

1.3、reasumeFocusedStackTopActivityLocked:

APP启动流程分析_第4张图片
startProcessLocked中会,上图中Activity所在进程的app已经存在部分可以理解成热启动流程,而下面restarting部分则为冷启动部分
APP启动流程分析_第5张图片

1.4、冷启动的后续部分

APP启动流程分析_第6张图片

1.5

APP启动流程分析_第7张图片

2、热启动流程(Activity Resume Flow):

APP启动流程分析_第8张图片
前面已经提到热启动流程跟冷启动流程最主要的区别就,热启动流程因为原有相关进程已经在后台,所以只需要resume相关activity就好

3、systrace分析:

了解上面的code流程后,我们从systrace中再次看下对应的冷热启动的流程和时间序列,systrace的抓取和基本操作请参考
如果用monitor抓取,请勾选system_server、IRQ Events、CPU frequency CPU Idle、binder kernel driver、 binder global lock trace几项。
APP启动流程分析_第9张图片

3.1 冷启动对应systrace:

打开systrace之后,先按ctrl+F搜索inputreader,找到systremserver下的inputReader 进程,然后再其运行状态中找到AppLaunch_dispatchPtr:Up的时间点,也就是手指离开屏幕的时间点。 然后找到启动的app 的UI thread,check 其ActivityThreadMain->bindApplication->StartActivity->activityResume->Choreographer#doFrame ->draw → RenderThread(DrawFrame)。
利用systrace工具中的框选标记从AppLaunch_dispatchPtr:Up到RenderThread(DrawFrame)完成的时间,则为该app 冷启动画完第一帧的使用时间。若有launcher时间长的问题,请将上面各个时间节点拆分比较,和对比机对比检测出花费时间长的时间段。再细看时间长的原因
详细原因: APP启动流程分析_第10张图片
APP启动流程分析_第11张图片

3.2 如何分析launcher时间慢的问题
3.3.1 Launcher时间拆分:

先按照上面的冷热启动的介绍,将launcher的时间拆分:
在这里插入图片描述

3.3.2、 定位差异部分:

定位出某个花费时间长的时间段后,框选该时间段的进程运行状态,在下面的Thread Timeslices中可以查看该时间段的进程运行状态。找出时间差异大tag的cpu status :Running/Runnable/Sleeping/Uninterruptible sleep
APP启动流程分析_第12张图片
确认running/sleeping/runnable/uninterruptible sleep时间长之后,根据本文其它栏位中其对应的debug方法进一步确认。

你可能感兴趣的:(android,ide)