android性能优化学习笔记(加快应用程序启动速度:)


一:安卓中应用程序的启动方式有两种:

冷启动:后台没有该应用进程,系统会重新创建一个进程分配给该应用(所以会先创建和初始化Application类,再创建和初始化MainActivity,包括测量,布局,绘制等)

热启动:该应用的进程会保留在后台,在任务列表可以查看(back,home键按下后)(直接创建和初始化MainActivity,包括测量,布局,绘制等)

一个应用从新进程的创建到进程的销毁,只会初始化一次Application.

应用的启动时间:从点击图标到看到界面的第一帧。

二:

可以通过adb shell命令测量:adb shell am start -W [packageName]/[packageName.MainActivity]

这样可以得到三个时间:

this time:类totaltime,除非启动时开了一个透明的activity预先处理一些事再显示出主activity

total time:创建进程,application初始化,activity初始化到显示界面。

wait time:包括系统影响的耗时

三:

总的来说,冷启动过程如下:

点击app的启动图标时,安卓系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上,所以直到这里,应用的第一次启动才算完成,这时候我们看到的界面也就是所说的第一帧。

Application的构造器方法——>attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上

四:

减少冷启动时的耗时:

1:在Application的构造器方法、attachBaseContext()、onCreate()中不要进行耗时的初始化,一些数据的预取放在异步线程中,可采取Callable实现;

2:sp的初始化 放在异步线程中处理;

3:对于mainActivity,因为在获取道第一帧前,需要对contentView测量,布局,绘制;因此,尽量减少布局的层次,在生命周期的几个函数里避免做耗时操作。

总的来说,原则就是:避免一些耗时的操作在主线程中。


每一行代码都有它的故事