Android 性能优化【篇五:应用启动分析流程】
本篇主要围绕Android性能优化,应用启动类性能问题为主题,先结合MTK的文档阐述应用启动流程,然后结合MTK的分析思路,其他厂商的思路,和我之前有段时间研究过某音的TOP300分析思路的案例,进行说明。
一、APP启动流程
所谓冷启动就是启动该应用时,后台没有该应用的进程,此时系统会为该应用创建新的进程,之后会bindApplication来创建程并初始化application, 然后通过反射执行ActivityThread中的main方法。
而热启动则是,当启动应用时,后台已经存在该应用的进程,比如启动该应用后,再按home 键反馈至主界面后,再打开该应用。此时会从已有的进程中来启动应用,这种方式不会重新走bindApplication的动作。
参考链接:https://online.mediatek.com/apps/quickstart/QS00157#QSS03755
1、冷启动
当我们点击桌面APP图标的时候,首先会调用launcher的onClick()方法,然后在桌面应用程序内部会通过添加intent.addflag(Intent.FLAG_ACTIVITY_NEW_TASK),调用Activity类的startActivity方法先pause前台的launcher,然后resume想启动想要启动的activity,直到新的应用程序启动成功,过渡动画结束为止。参考如下流程图:(PS:从MTK官方网站提取)
我们在看看如果一个应用启动,抓出来的trace是怎么样的呢?
仔细对比一下两者的差异,下面用文字进行解读和说明:
流程一:Launcher响应点击事件
当某应用程序在对某个activity声明MAIN和LAUNCHER之后,那么桌面应用程序Launcher就会把他们解析出来,对应图标排列在桌面。这样,用户就可以通过点击的方式启动Activity了。
当用户在桌面应用程序launcher上面点击某个应用ICON,那么launcher应用程序就得响应onClick事件,如何响应呢?
参考如上泳图,launcher调用startActivityForResult,最终会走到AMS中,主要逻辑实现还得是调用startActivityUnchecked方法,去启动目标activity。
PS:这属于阶段一上半段流程
流程二:WMS启动过渡动画
如上流程图在Launcher向AMS发起startActivityForResult之后,就得通知WMS调用StartingWindowEnterAnimation方法启动窗口(Starting Window,俗称“白屏”或“预览屏”)进入屏幕的动画阶段:
- 背景:当用户点击 App 图标后,系统需要时间去 Zygote 进程 fork 出一个新的进程,并加载类、初始化 Application。这个过程通常需要几百毫秒甚至更久。
- 目的:为了不让用户觉得“点击没反应”或者看到黑屏,WMS(Window Manager Service)会立即根据 App 的主题(Theme)创建一个临时的、轻量级的窗口。这个窗口通常只包含状态栏、导航栏和 App 的 Logo 或背景色。
- 动作:圈红的部分表示 WMS 正在将这个临时窗口以动画的形式(通常是淡入或缩放)显示在屏幕上。这就是你在点击图标后,App 界面出来之前看到的那个瞬间画面。
当流程走到红框这一步时,WMS 已经完成了“准备”工作,并且正在屏幕上播放启动窗口的进入动画。这是 Step 1(响应时间)用户体验的关键组成部分——让用户感觉到系统已经迅速响应了点击操作。
