性能优化包括很多方面,比如:启动优化、布局优化、内存优化、卡顿优化、网络优化、数据库优化、内存泄漏优化、包体积优化等等。我们想要进行性能优化就要了解基本的原理,这篇文章针对启动这一方面来谈一谈相关的原理知识。
一、冷启动、温启动、热启动
首先了解下启动的这三个概念,也是最常见的:
1、冷启动。
冷启动指的是该应用程序在此之前没有被创建,发生在应用程序首次启动或者自上次被终止后的再次启动。简单的说就是app进程还没有,需要创建app的进程并启动app。
比如开机后,点击屏幕的app图标启动应用。
冷启动的过程主要分为两步:
1)系统任务。加载并启动应用程序;显示应用程序的空白启动窗口;创建APP进程
2)APP进程任务。启动主线程;创建Activity;加载布局;屏幕布局;绘制屏幕
其实这不就是APP的启动流程嘛?所以冷启动是会完整走完一个启动流程的,从系统到进程。
2、温启动。
温启动指的是App进程存在,但Activity可能因为内存不足被回收,这时候启动App不需要重新创建进程,只需要执行APP进程中的一些任务,比如创建Activity。
比如返回Home后,又继续使用其他的APP,时间久了或者打开的应用多了,之前应用的Activity有可能被回收了,但是进程还在。
所以温启动过程相当于执行了冷启动的第二过程,也就是APP进程任务,需要重新启动线程,Activity等。
3、热启动。
热启动就是指App进程存在,并且Activity对象仍然存在内存中没有被回收。
比如app被切到后台,再次启动app的过程。
所以热启动的开销最少,这个过程只会把Activity从后台展示到前台,无需初始化,布局绘制等工作。
二、了解到APP的基本概念,那么我们如何检测分析出启动中出现的问题呢?
友盟+U-apm性能检测工具
接入友盟U-APM后即可拥有实时、可靠、全面的应用崩溃、ANR、自定义异常等捕获能力, 以及卡顿检测、启动分析、内存分析、网络分析等性能监测能力,支持多方面智能告警监测。u-apm启动分析功能包含启动耗时、慢启动情况、启动崩溃数据。帮助开发者把控启动状态。
三、APP启动环节有哪些可优化的点
三种启动方式中,冷启动经历的时间最长,也是走完了最完整的启动流程,所以我们再次分析下冷启动的启动流程,看看有哪些可以优化的点:
Launcher startActivity
AMS startActivity
Zygote fork 进程
ActivityThread main()
ActivityThread attach
handleBindApplication
attachBaseContext
Application attach
installContentProviders
Application onCreate
Looper.loop
Activity onCreate,onResume
纵观整个流程,其实我们能动的地方不多,无非就是Application的attach,onCreate方法,Activity的onCreate,onResume方法,这些方法也就是我们的优化点。
最后再和大家回顾下今天说到的启动优化方案:
消除启动时的白屏/黑屏。windowBackground。
第三方库懒加载/异步加载。线程池,启动器。
预创建Activity。对象预创建。
预加载数据。
Multidex预加载优化。5.0以下多dex情况。
Webview启动优化。预创建,缓存池,静态资源。
避免布局嵌套。多层嵌套。
为了方便记忆,我再整理成以下三类,分别是Application、Activity、UI:
Application 三方库,Multidex。
Activity 预创建类,预加载数据。
UI方面 windowBackground,布局嵌套,webview。
综上所述,要进行启动性能优化,就要对启动相关原理知识有所了解,之后借助友盟u-apm应用性能检测工具,帮助我们开发者进行启动方面的分析检测,再制定出针对性的优化方案,使APP质量更上一层楼。