android 启动优化(一)

来源:互联网 发布:ubuntu lrzsz 编辑:程序博客网 时间:2024/06/05 17:21

前言:用户总是期待APP可以快速启动,相反,可能会使用户失望,甚至卸载。

一、 3种启动状态。

1.冷启动(code start)
2 .微温启动(lukewarm start ,字面翻译就是微温的。)
3.温启动(warm start)

所谓的冷启动是指开机启动或者APP被kill过,而其他两种启动通常是指APP从后台(background)被系统调到了前台(foreground)。建议在做启动速度优化的时候,最好是基于冷启动,做好冷启动优化,其他两种启动相对应也会提高。

二、冷启动(cold start)

在冷启动前,系统需要完成三项工作:
1.加载和启动应用。
2.在启动应用以后,展示一个空白的启动窗口。
3. 创建APP进程。

在创建完APP进程以后,系统可以完成以下工作:
1.创建application对象。
2.启动主线程(main thread)。
3.创建mainActivity.
4.加载控件(infate views)
5.在屏幕布局。
6.在屏幕绘制。

在第六步完成以后,系统会替换掉现在应用背后的空白启动窗口,展示mainActivity的布局。在这个过程以后,用户开始真正的使用APP。

通常问题都是出现在application创建和activity创建中。
application creation: 在启动应用的过程中,空白启动窗口一直都是存在的,直到系统完成了第一屏幕绘制。
Activity creation : 在系统创建activity的过程,经历了一下三个阶段:
1.初始化一些值,比如activity需要的context等等。
2.调用activity的构造函数。
3.调用activity的回调函数,比如oncreate、onstart等等。
尤其是oncreate对应用的启动影响最大:通常在oncreate会做一些布局文件inflate和布局所依赖的数据(比如网络请求)。

三、温启动(warm start)

温启动相对于冷启动,是一种低开销的启动方式。在温启动中,系统做的是把当前用户的activity重新展示在前台,如果是当前应用还存活在内存(memory)中,系统就可以避免activity的创建、布局加载、渲染的过程。
然而,如果系统为了优化内存,开始回调了ontrimMemory(),在这时候,可能就会重新创建activity、加载布局、渲染。
温启动和热启动一样,首先会展示空白加载框。直到activity渲染完成。

四、微温启动(lukeware start).

字面解释很难解释清楚,主要是以下场景可能会出现这种启动方式。比如;
1.用户通过back返回键,退出了应用,当时这时候,后台进程还在,但是必须通过调动oncreate创建activity。

五、监控启动时间。

在 Android 4.4 (API level 19) 以后,logcat可以直接打印出应用的启动时间。例如:

ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms

同时,也可以通过adb命令来查看启动时间。

adb [-d|-e|-s <serialNumber>] shell am start -S -Wcom.example.app/.MainActivity-c android.intent.category.LAUNCHER-a android.intent.action.MAIN

大概的返回结果如下:

Starting: IntentActivity: com.example.app/.MainActivityThisTime: 2044TotalTime: 2044WaitTime: 2054Complete

The -c and -a arguments are optional and let you specify and for the intent.

如果存在异步的加载情况,比如一个控件既要展示文字还需要展示网络加载的图片,对于用户的真实感知应该是不仅是文字绘制完成,而且图片也要加载完成才算是真正的应用启动,这时候需要告诉系统什么时候应用启动完成,这样系统通过相减才能算出合理的启动耗时,方式是:

 reportFullyDrawn() 

以图片加载为例,可以是网络加载回调success的时候,调用 reportFullyDrawn() 。

原创粉丝点击