app的启动速度在用户体验方面是一个重要的指标,当一个可替代行强的app启动异常缓慢时,必然会致使用户的流失。java
冷启动(Cold start)shell
冷启动是指APP在手机启动后第一次运行,或者APP进程被kill掉后在再次启动。bash
可见冷启动的必要条件是该APP进程不存在,这就意味着系统须要建立进程,APP须要初始化。在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的。所以本文重点谈论的是对冷启动相关的优化。微信
温启动(Warm start)网络
App进程存在,当时Activity可能由于内存不足被回收。这时候启动App不须要从新建立进程,可是Activity的onCrate仍是须要从新执行的。场景相似打开淘宝逛了一圈而后切到微信去聊天去了,过了半小时再次回到淘宝。这时候淘宝的进程存在,可是Activity可能被回收,这时候只须要从新加载Activity便可。多线程
热启动(Hot start)app
App进程存在,而且Activity对象仍然存在内存中没有被回收。能够重复避免对象初始化,布局解析绘制。ide
场景就相似你打开微信聊了一会天这时候出去看了下日历 在打开微信 微信这时候启动就属于热启动。工具
在最近任务给App加锁和启动方式有什么关系 某些厂商为了用户体验提供了给APP上锁的功能,目的就是让用户本身作主是上锁的APP不被杀,启动的时候不会处于冷启动方式,可是加锁也不是万能的,Low memory killer在内存极度吃紧的状况下也会杀死加锁APP,在此启动时也将以冷启动方式运行。布局
时间获取 咱们可使用adb命令启动应用,来获取当前应用的启动时间
adb shell am start -W [packageName]/[.MainActivity]
复制代码
ThisTime:通常和TotalTime时间同样,除非在应用启动时开了一个透明的Activity预先处理一些事再显示出主Activity,这样将比TotalTime小。
TotalTime:应用的启动时间,包括建立进程+Application初始化+Activity初始化到界面显示。
WaitTime:通常比TotalTime大点,包括系统影响的耗时。
系统建立应用程序进程,应用程序进程就会执行如下操做:
1.建立应用程序对象
2.启动主线程
3.建立主要Activity
4.绘制视图(View)
5.布局屏幕
6.执行初始化绘制
因此优化启动速度本质上是优化上诉过程,减小这些过程的耗时。
视觉优化
打开一个应用总会有短暂的黑(白)屏的状况,致使体验上有卡顿的问题,可设置第一个activity为透明或者为其设置一个背景达到视觉上的优化, 以下
application onCreate 优化
1.第三方SDK初始化的处理
Application是程序的主入口,不少三方SDK示例程序中都要求本身在Application OnCreate时作初始化操做。这就是增长Application OnCreate时间的主要元凶,因此须要尽可能避免在Application onCreate时同步作初始化操做。比较好的解决方案就是对三方SDK就行懒加载,不在Application OnCreate()时初始化,在真正用到的时候再去加载。
下面实例对比下ImageLoader在采用懒加载后启动速度优化。
通常咱们在使用imageLoader时都会在Application onCreate()时在主线程加载:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoaderConfiguration.Builder config =
new ImageLoaderConfiguration.Builder(this);
ImageLoader.getInstance().init(config.build());
}
}
复制代码
懒加载ImageLoader的工具类示例:
public class ImageUtil {
private static boolean sInit;
private synchronized static void ensureInit() {
if (sInit) {
return;
}
ImageLoaderConfiguration.Builder config =
new ImageLoaderConfiguration.Builder(SecurityCoreApplication.getInstance());
....
// Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(config.build());
sInit = true;
}
public static void display(String uri, ImageView imageView, boolean cacheOnDisk) {
imageView.setImageResource(R.drawable.icon_app_default);
ensureInit();
ImageLoader loader = ImageLoader.getInstance();
if (cacheOnDisk) {
loader.displayImage(uri, imageView);
} else {
loader.displayImage(uri, imageView, OPTIONS_NO_CACHE_DISK);
}
}
}
复制代码
须要避免Application OnCreate
在主线程作大量耗时操做,例如和IO相关的逻辑,这样都会影响到应用启动速度。若是必需要作须要放到子线程中。
多线程避免执行没必要要的操做
若是应用设置了独立进程,则在Application onCreate 中须要判断当前进程,有针对的初始化当前进程须要的功能。
Activity onCreate优化
减小LaunchActivity的View层级,减小View测量绘制时间;使用ViewStub,将无必要的View(如开机广告)延迟加载
主线程避免I/O操做、反序列化、网络操做等。