文档章节

Android端应用秒开优化体验

猴亮屏
 猴亮屏
发布于 2016/07/27 09:57
字数 986
阅读 21
收藏 0
点赞 0
评论 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浏览器云转码

© 著作权归作者所有

共有 人打赏支持
猴亮屏

猴亮屏

粉丝 29
博文 502
码字总数 52840
作品 2
北京
Android工程师
Android P Beta 2 及终版 API 强势来袭!

在四周前的 Google I/O 开发者大会上,我们发布了Android P 的首个 Beta 版,将人工智能 (AI) 定位为操作系统的核心,并侧重于提供智能且简洁的体验。 今天,我们隆重推出 Android P Beta 2...

谷歌开发者 ⋅ 06/07 ⋅ 0

如何实现安卓手机“天上飞”?需要像GPU Turbo这样的“天梯”

在安卓手机产业中,一直流传着一个传说:发布会上展示出的一切参数配置,在新机拿到手后都要打个七折,使用一年之后,还要再打个五折。 这一说法虽然有些玄学的味道,但也非常贴近现实情况。...

脑极体 ⋅ 06/06 ⋅ 0

绕过安卓的唯一机会,可能是利用EMUI中沉睡的AI藏宝图

前看到一个挺有意思的问题,是说在拍照、续航、芯片等领域,苹果相继被其他品牌追赶甚至超越,那么支撑大家买苹果手机的动力何在呢? 下面有个回复是这么说的:可能是因为iOS吧… 好像有点道...

脑极体 ⋅ 04/21 ⋅ 0

AndroidThings之基础一 基本概念

转载自:https://blog.csdn.net/weixin41636248/article/details/79069994 Android Things是什么 一句话说,AndroidThings就是让开发者可以使用Android开发工具开发嵌入式设备。 If you can...

qq_28831197 ⋅ 05/09 ⋅ 0

Android P Beta!您想要知道的所有更新内容都在这里

I/O 大会的第一天,我们公布了下一个版本的 Android,也就是 Android P 的 beta 版本。Android P 将 AI 定位为操作系统的核心,并侧重于提供智能且简洁的体验。让我们一起来了解下这个版本带...

谷歌开发者 ⋅ 05/10 ⋅ 0

挖掘安卓宝藏,EMUI会让手机进入“量心定制”时代吗?

如果把移动终端的发展历程看做一部戏剧,那么Android和iOS两种操作系统生态之间的竞争一定是最精彩的一折。 从市场占有率来看,2017年Android手机在全球售出的手机中占据了85.9%份额,其中自...

脑极体 ⋅ 04/17 ⋅ 0

Android P 应用兼容常见错误及建议

从 2018 年 3 月初我们发布 Android P 开发者预览版以来,很多开发者都对当前常见应用在 Android P 上做了一些兼容性测试,我们在这里总结了一些常见的问题,以及它们发生的原因和建议的修改...

谷歌开发者 ⋅ 04/25 ⋅ 0

Android 必知必会 - Android Splash 页秒开之细节处理

原文在CSDN,但其移动端访问较差,为方便在地铁上使用掘金学习的小伙伴,特重新发布。 背景 今天在掘金上阅读了两篇 Android Splash 页秒开的文章,就上手试了试,效果确实不错,不过在使用过...

cafeting ⋅ 2016/08/16 ⋅ 0

Cf手游穿越火线:枪战王者氪金严重?加入吃鸡模式变得不伦不类

我从穿越火线:枪战王者手游刚出来的时候就开始玩了,算是一个老玩家了。但是最近这游戏的一些改变让我越来越无语,不吐不快。 之前因为学业的原因一段时间没有玩,上个月去玩,发现已经被R...

lemon5814 ⋅ 04/19 ⋅ 0

Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)

前言 在 开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性、流畅性、稳定性等,是提高用户留存率的关键 本文全面讲解性能优化中的所有知识,献上一份 性能优化的详细攻...

Carson_Ho ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

Nginx + uwsgi @ubuntu

uwsgi 安装 sudo apt-get install python3-pip # 注意 ubuntu python3默认没有安装pippython3 -m pip install uwsgi 代码(test.py) def application(env, start_response): start_res......

袁祾 ⋅ 昨天 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 昨天 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 昨天 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部