android 启动速度优化

栏目: IOS · Android · 发布时间: 6年前

内容简介:app的启动速度在用户体验方面是一个重要的指标,当一个可替代行强的app启动异常缓慢时,必然会导致用户的流失。冷启动是指APP在手机启动后第一次运行,或者APP进程被kill掉后在再次启动。可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,APP需要初始化。在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的。因此本文重点谈论的是对冷启动相关的优化。

app的启动速度在用户体验方面是一个重要的指标,当一个可替代行强的app启动异常缓慢时,必然会导致用户的流失。

App启动方式 冷启动 热启动 温启动

冷启动(Cold start)

冷启动是指APP在手机启动后第一次运行,或者APP进程被kill掉后在再次启动。

可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,APP需要初始化。在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的。因此本文重点谈论的是对冷启动相关的优化。

温启动(Warm start)

App进程存在,当时Activity可能因为内存不足被回收。这时候启动App不需要重新创建进程,但是Activity的onCrate还是需要重新执行的。场景类似打开淘宝逛了一圈然后切到微信去聊天去了,过了半小时再次回到淘宝。这时候淘宝的进程存在,但是Activity可能被回收,这时候只需要重新加载Activity即可。

热启动(Hot start)

App进程存在,并且Activity对象仍然存在内存中没有被回收。可以重复避免对象初始化,布局解析绘制。

场景就类似你打开微信聊了一会天这时候出去看了下日历 在打开微信 微信这时候启动就属于热启动。

在最近任务给App加锁和启动方式有什么关系 某些厂商为了用户体验提供了给APP上锁的功能,目的就是让用户自己做主是上锁的APP不被杀,启动的时候不会处于冷启动方式,但是加锁也不是万能的,Low memory killer在内存极度吃紧的情况下也会杀死加锁APP,在此启动时也将以冷启动方式运行。

时间获取 我们可以使用adb命令启动应用,来获取当前应用的启动时间

adb shell am start -W [packageName]/[.MainActivity]
复制代码
android 启动速度优化

总共返回了三个结果,我们以 WaitTime 为准.

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操作、反序列化、网络操作等。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Iterative Methods for Sparse Linear Systems, Second Edition

Iterative Methods for Sparse Linear Systems, Second Edition

Yousef Saad / Society for Industrial and Applied Mathematics / 2003-04-30 / USD 102.00

Tremendous progress has been made in the scientific and engineering disciplines regarding the use of iterative methods for linear systems. The size and complexity of linear and nonlinear systems arisi......一起来看看 《Iterative Methods for Sparse Linear Systems, Second Edition》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具