Android端应用秒开优化体验

Android端应用秒开优化体验

2016-07-18 09:53html

前言html5

最近部门内抛出了一个问题,应用启动很慢、卡图标?主要表如今中低端机型中。究其这个问题,因为对性能优化比较感兴趣,借了个低端机和一个中端机来一看究竟,对同一应用分别测了下它在中低端机的启动时间,下面为启动耗时状况:浏览器

loading...

启动了三次,基本都在4s左右。性能优化

缘由jsp

究其缘由,主要因素是任务在界面绘制前过于集中化。性能

应用启动过程从用户点击launcher图标到看到第一帧这个过程当中,主要会通过如下这些过程:优化

main()->Application:attachBaseContext()->onCreate()->Activity:onCreate()->onStart()->onPostCreate()->onResume()->onPostResume()spa

而通常咱们的初始化任务主要都会集中化在Application:onCreate()方法中,这就使得初始化任务在第一帧绘制以前得完成,这就形成了卡图标、应用启动慢。那么把任务打散呢?分散在LaunchActivity中去分段初始化?仍是不行的,由于界面开始绘制是在onResume()方法开始后才开始绘制,因此,得从Activity的建立过程找办法。orm

main->Activity建立的这个过程会通过一系列framework层的操做,这些操做都是系统自动执行的,不易进行优化,不过能够在Activity建立这个过程先后来找一些蛛丝马迹,由于Activity的建立都会展转到ActivityThread:performLaunchActivity()这个方法中,在这个方法中能够知道这么几件事:htm

一、先经过Instrumentation:newActivity()来建立一个Activity实例

二、再判断Application实例是否已建立,已建立则直接返回,不然调用

Instrumentation:newApplication()来建立Application实例,在这个过程当中会依次执行attachBaseContext()和onCreate()方法

三、以后Activity:attach()方法会建立一个PhoneWindow对象,它就是界面,它有一个DecorView,调用setContentView()时会给配置DecorView,其中就会设置一个背景:

loading...

咱们的View也是add进DecorView中显示,它做为RootView确定是最早显示,因此能够给它设置个默认背景

四、最后依次调用Activity的onCreate、onStart等方法

措施

一、任务分级

二、任务并行

三、界面预显示

对于任务集中初始化化、耗时初始化缘由致使应用在中低端机启动过慢,而Activity界面绘制的时机致使简单的将任务分给Activity初始化也不起做用,咱们必须找一个切入点

界面的建立和界面的绘制,这两个过程第一个是Application的attachBaseConte和onCreate这两个方法影响的,第二个则是Application建立一直到界面绘制

因此,能够对任务进行分级的临界点能够这样分:

一、CoreSDK——Application的建立

二、HighPrioritySDK——Activity的建立

三、LowPrioritySDK——Activity界面完成绘制

四、AsyncSDK——Activity的建立

如图:

loading...

对任务这样分级后,测了一下,应用的启动即便在低端机上,也能秒开:

loading...

分级带来的问题

正常启动过程那确定是没问题的,不过有这么几种场景:

一、App切回后台,内存不足致使Application被回收,从最近任务列表中恢复界面时Application需从新建立

二、应用没挂起时,Push推送需从Notification跳入应用内某界面

三、应用没挂起时,浏览器外链需跳入应用内某界面

这些Case可能致使的问题是被跳入的界面使用到了未初始化的SDK,可能致使Crash或者数据异常,因此目标页面启动前必须确保SDK已经初始化,这个过程的缘由是没有唤起启动页来初始化SDK,能够经过hook newActivity解决。

 原网页已由QQ浏览器云转码

相关文章
相关标签/搜索