文档章节

Android端应用秒开优化体验

猴亮屏
 猴亮屏
发布于 2016/07/27 09:57
字数 986
阅读 21
收藏 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%...

共有 人打赏支持
猴亮屏

猴亮屏

粉丝 33
博文 518
码字总数 58250
作品 2
北京
Android工程师
[译] 如何优化您的 Android 应用(Go 版)

原文地址:How to optimize your app for Android (Go edition) 原文作者:Raj Ajrawat 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:androidxiao 洞察力可帮助您创...

Android_开发者
06/25
0
0
转:一套代码iOS、Android两端运行,Google Flutter意味着什么?

原文:https://www.toutiao.com/a6569388465538990600/?ttfrom=weixin&utmcampaign=clientshare×tamp=1529580533&app=newsarticle&utmsource=weixin&iid=35476649324&utmmedium=toutiao......

鸿蒙无上至尊
06/22
0
0
Android 9 Pie 现已面向全球正式发布!

作者:Dave Burke, 工程部副总裁 经历一年多的开发和数月以来早期用户的反复测试,最新 Android 平台 —— Android 9 Pie 终于正式面向全球发布! Android 9 利用人工智能技术,让您的手机更...

Android_开发者
08/07
0
0
Android P Beta 2 及终版 API 强势来袭!

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

谷歌开发者
06/07
0
0
一套代码iOS、Android两端运行,Google Flutter意味着什么?

作者 | 屠敏 一套代码可支持 Android 和 iOS 双端运行,你 Get 了吗? 它就是 Flutter。其目标是为了解决移动中的两个重要问题:一是实现原生应用的性能和与平台的集成,二是提供一个多平台,...

终端研发部
06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java大数据转换16进制转10进制

public static void main(String[] args) {String hex = "0xdbf3accc683297cf0000";BigInteger amount = new BigInteger(hex.substring(2), 16);System.out.println(amount);......

任梁荣
昨天
1
0
OSChina 周六乱弹 —— 目测我们程序员丁克的几率不大

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @真Skr小机灵鬼儿:8.13分享Jocelyn Pook/Russian Red的单曲《Loving Strangers》 《Loving Strangers》- Jocelyn Pook/Russian Red 手机党少...

小小编辑
昨天
9
3
TypeScript基础入门 - 函数 - 剩余参数

转载 TypeScript基础入门 - 函数 - 剩余参数 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.1 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
昨天
1
0
OpenCV边缘检测算子原理总结及实现

1. 拉普拉斯算子 原理:是一种基于图像导数运算的高通线性滤波器。它通过二阶导数来度量图像函数的曲率。 拉普拉斯算子是最简单的各向同性微分算子,它具有旋转不变性。一个二维图像函数的拉...

漫步当下
昨天
0
0
Spring源码阅读——1

开始读Spring源码吧,看再多的技术博客,不如自己看一下~~~~~ Spring源码目前在github中,新版本基于gradle构建。所以阅读源码需要先安装github和gradle。 spring中git地址 1、安装git(略)...

叶枫啦啦
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部