其他

Android启动优化

2017-03-14  本文已影响0人  Alsan_L3

一、背景

随着App越做越大,市场,测试、产品、开发包括自己在内,明显感觉到App的启动太慢、黑屏或在欢迎页停太久,于是下定决心优化下App的启动速度,查了些资料,看了些别人的做法,总结出以下可取做法,现在分享给大家:

二、启动分析

1、启动分类:

冷启动:后台不存在该应用的任务进程或服务,用户点击Icon图标启动

暖启动:工作介于冷热启动之间。几种可能被认为是温启动的状态:

a、用户离开了app,然后重新启动它。这时进程还在继续运行,但是Activity被回收了,app需要重新创建activity。

b、系统将你的app回收了,然后用户重新启动app。进程和Activity都需要重新启动,但它们可以从onCreate方法保存的bundle中恢复。

热启动:当后台存在该应用的进程或者服务时,用户点击icon图标启动。如用户按了home键回到桌面,或者返回键没有杀进程,或者app本身做了进程重启的机制

2、启动组成时间:

Application启动经过attachBaseContext->onCreate方法

Activity启动经过onCreate->onStart->onResume方法

经过以上流程后,界面才显示出来,所以启动耗时原因就可以在上述步骤中找出

3、分析启动耗时原因:

a、测量启动时间:在Androd的Log系统时通过ActivityManager与Display这两个关键字可以查看到启动Activity所需要的时间,如果要看到数据加载的时间,则可以在代码中自定义,在数据加载完的回调方法中主动调用reportFullyDrawn()方法,则上报给系统,系统会反馈一个总的加载时间

b、计算启动时间——ADB

adb shell am start -W com.xys.preferencetest/.MainActivity

c、计算启动时间——Screen Record

adb shell screenrecord--bugreport /sdcard/test.mp4

d、method tracing

通过上述方法基本上可以定位到耗时原因,那下面就开始解决问题

4、在2中我们已经知道了启动app要经历哪些过程,那我们会在这些过程做哪些事情呢?

在Application中:attachBaseContext方法中一般是加载MultiDex.install(this)操作,关于这部分目前没办法优化,特别是在5.0以下的机器上,但是我们可以规避这问题,欢迎页我们可以另开一进程执行(在manifest中加android:process)或者对App进行插件化,onCreate方法中一般会初始化一些第三方平台的SDK以及一些全局变量的初始化,我们可以执行Application中的方法registerActivityLifecycleCallbacks,这个方法会监听所有Activity的创建和销毁, 我们可以在这里完成一些初始化工作

在Activity中:使用DelayLoader实现,getWindow().getDecorView().post(new Runnable(){

@Override

public void run({

//loading...

})

})

另外使用Theme改变用户感知。

参考资料:

https://segmentfault.com/a/1190000007406875

http://www.lightskystreet.com/2016/10/15/android-optimize-start/

https://juejin.im/entry/582adaad570c35006cdcb615

上一篇 下一篇

猜你喜欢

热点阅读