Android启动优化

一、背景

随着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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,691评论 25 709
  • 1.什么是Activity?问的不太多,说点有深度的 四大组件之一,一般的,一个用户交互界面对应一个activit...
    JoonyLee阅读 11,044评论 2 51
  • 【触发背景】面对海量APP的今天,APP用户量和活跃度成为评价一款APP是否成功的重要因素。用户下载APP后,AP...
    siyu8023阅读 13,558评论 1 14
  • 南方的姑娘北方汉子上帝先给我们指定了一个故乡出生在南方的你我成长在了北方我们都说对方是异乡 我们所在的地方是故乡离...
    田裡和樹阅读 1,625评论 0 2
  • 将当前对时间显示出来NSDate -> NSSTringNSDate *date = [NSDate date];...
    SlimMan阅读 4,363评论 1 2

友情链接更多精彩内容