文档章节

Android端应用秒开优化体验

猴亮屏
 猴亮屏
发布于 2016/07/27 09:57
字数 986
阅读 26
收藏 0

Android端应用秒开优化体验

2016-07-18 09:53

前言

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

loading...

启动了三次,基本都在4s左右。

原因

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

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

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

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

main->Activity创建的这个过程会经过一系列framework层的操作,这些操作都是系统自动执行的,不易进行优化,不过可以在Activity创建这个过程前后来找一些蛛丝马迹,因为Activity的创建都会辗转到ActivityThread:performLaunchActivity()这个方法中,在这个方法中可以知道这么几件事:

1、先通过Instrumentation:newActivity()来创建一个Activity实例

2、再判断Application实例是否已创建,已创建则直接返回,否则调用

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

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

loading...

我们的View也是add进DecorView中显示,它作为RootView肯定是最先显示,所以可以给它设置个默认背景

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

措施

1、任务分级

2、任务并行

3、界面预显示

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

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

所以,可以对任务进行分级的临界点可以这样分:

1、CoreSDK——Application的创建

2、HighPrioritySDK——Activity的创建

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

4、AsyncSDK——Activity的创建

如图:

loading...

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

loading...

分级带来的问题

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

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

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

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

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

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

本文转载自:http://qbview.url.cn/getResourceInfo?appid=31&url=http%3A%2F%2Fzhengxiaoyong.me%2F2016%2F07%2F18%...

共有 人打赏支持
上一篇: wkwebview与h5交互
下一篇: swift玩转cookie
猴亮屏

猴亮屏

粉丝 36
博文 530
码字总数 57346
作品 4
北京
Android工程师
私信 提问
迈绝伦团队工作汇总

项目负责人:余志恒 up_java后台:无 mz_java后台:早上到下午2点在新建县中心礼品派发现场与装修工交流及指导安装、集成网络电话功能 bwk后台:无 项目负责人:季景胜 up_Android:无 upzg...

风化的骆驼
2017/01/17
1
0
你的 Android 不好用,都是因为这几点原因

Android早已是全球最大、用户最多的移动操作系统,不过它离全球最好用还差得很远。 大家随手就能举出些曾经历过的糟心体验,如手机卡顿!电量不禁用!广告弹窗老是出现!不过很少有人会追根寻...

oschina
2014/11/04
8.6K
51
迈绝伦团队工作汇总

项目负责人:余志恒 up_java后台:无 mz_java后台:推送功能完善完成 bwk后台:无 项目负责人:季景胜 up_Android:无 upzg_Android:无 mzqk_Android:抢客优化积分商品列表界面、兑换信息完...

风化的骆驼
2017/01/05
1
0
迈绝伦团队工作汇总

项目负责人:余志恒 up_java后台:暂无更新 mz_java后台:修改了非会员商家建材只能发布不能上架,分享领取秒币并返利功能完成 bwk后台:暂无更新 项目负责人:季景胜 up_Android:暂无更新 ...

风化的骆驼
2016/12/20
0
0
迈绝伦团队工作汇总

项目负责人:余志恒 up_java后台:无 mz_java后台:伦比商城接口完成 bwk后台:无 项目负责人:季景胜 up_Android:无 upzg_Android:无 mzqk_Android:完成极光推送语音部分,增加秒币与积分...

风化的骆驼
2016/12/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
59分钟前
1
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
今天
3
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxCool
今天
3
0
携程Apollo统一配置中心的搭建和使用(java)

一.Apollo配置中心介绍 1、What is Apollo 1.1 Apollo简介 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到...

morpheusWB
今天
2
0
远程获得的有趣的linux命令

使用这些工具从远程了解天气、阅读资料等。 我们即将结束为期 24 天的 Linux 命令行玩具日历。希望你有一直在看,如果没有,请回到开始,从头看过来。你会发现 Linux 终端有很多游戏、消遣和...

Linux就该这么学
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部