当前位置: 首页 > news >正文

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 ):

在这里插入图片描述

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

在这里插入图片描述

1.2、startActivityUnchecked -> resumreFocusedStackTopActivityLocked

在这里插入图片描述

1.3、reasumeFocusedStackTopActivityLocked:

在这里插入图片描述
startProcessLocked中会,上图中Activity所在进程的app已经存在部分可以理解成热启动流程,而下面restarting部分则为冷启动部分
在这里插入图片描述

1.4、冷启动的后续部分

在这里插入图片描述

1.5

在这里插入图片描述

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

在这里插入图片描述
前面已经提到热启动流程跟冷启动流程最主要的区别就,热启动流程因为原有相关进程已经在后台,所以只需要resume相关activity就好

3、systrace分析:

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

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时间长的问题,请将上面各个时间节点拆分比较,和对比机对比检测出花费时间长的时间段。再细看时间长的原因
详细原因: 在这里插入图片描述
在这里插入图片描述

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

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

3.3.2、 定位差异部分:

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

http://www.lryc.cn/news/58257.html

相关文章:

  • IIR数字滤波器简介与实现
  • 3.5 函数的极值与最大值和最小值
  • 第五十八天打卡
  • 双一流大学计算机专业月薪拿2000?网友:我裂开
  • ChatGPT的“N宗罪”?|AI百态(上篇)
  • 48.现有移动端开源框架及其特点—MDL(mobile-deep-learning)
  • 4.9--计算机网络之TCP篇之TCP Keepalive 和 HTTP Keep-Alive --(复习+大总结)---沉淀ing
  • qt完善登录界面(2023-4-6)
  • 104.(cesium篇)cesium卫星轨道模拟
  • Linux shell编程
  • Rasa 3.x 学习系列-Rasa [3.5.4] -2023-04-05新版本发布
  • 进程和线程
  • ps 备忘清单_开发速查表分享
  • 【ROS】基于WIFI网络实现图像消息跨机实时传输
  • 一次性说清楚 JAVA的 ThreadPoolExecutor 、newFixedThreadPool 和newCachedThreadPool 等
  • Android双目三维重建:Android双目摄像头实现双目测距
  • 解决Avoid using non-primitive value as key, use string/number value instead.
  • 重构·改善既有代码的设计.03之重构手法(上)
  • 闭关修炼(0.0 pytorch基础学习)1
  • 个人-计算机操作系统第一章
  • Python-责任链模式
  • HIT 计统实验2 二进制炸弹(gdb破解版) 拆弹过程
  • echart 半环渐变仪表盘
  • 【springboot】自动加载分析
  • ChatGPT批量翻译-ChatGPT批量生成多国语言
  • Symble
  • 能在家里赚钱的工作有哪些?适合普通人的兼职项目
  • 创建SaaS产品帮助中心的关键步骤
  • 高频算法:Leetcode53 最大子数组和
  • 如何编写接口自动化测试框架、