当前位置:网站首页>浅谈性能优化:APP的启动流程分析与优化
浅谈性能优化:APP的启动流程分析与优化
2022-08-02 03:27:00 【Android技术栈】
前言
今天来讲APP性能优化的第一步,也是用户接触最直接的一步: 冷启动优化; 主要从以下几个问题来入手
什么是冷启动?什么是热启动?
冷启动的过程中,系统都做了什么
pre-main过程该如何优化?
T3过程该如何优化?
什么是冷启动?什么是热启动?
冷启动: 在APP点击启动前,他的进程不在系统中,需要系统新创建一个进程分配给它,并进行启动的情况; 冷启动是一次完整的启动过程
相对的 热启动: 按下home键的时候,app还存在一段时间,这时点击app马上就能恢复到原状态; 这种启动我们称为热启动
APP的启动时间,是指从用户点击APP开始,到用户看到第一个界面之间的时间;总的来说,APP启动主要包括三个阶段:
1.T1: main()函数执行前:pre-main
2.T2: main()函数执行后至didFinishLaunch:behind-main
3.T3: didFinishLaunch至首屏渲染完成
冷启动的过程中,系统都做了什么?
dyld是App的启动器,启动的大部分事情都由dyld完成,iOS的启动大致分为几个部分:
内核将App的执行文件加载到随机地址空间(加载到随机地址主要是因为ASLR技术)
内核将dyld的执行文件加载到随机地址空间
内核执行dyld文件
dyld启动App
- dyld加载所有App所依赖的dylibs(动态库)
- 执行rebasing/binding修复地址
- Objc Setup
- initialize
- dyld调用App中的main(),将主动权交还给App
手机内核只负责将App的执行文件和dyld加载到内存中,然后所有的启动工作都交给了dyld
冷启动的优化工作主要都是在上面的第四步里做文章,第四步的具体工作可以看下面这张图
总结起来,pre-main()执行了如下操作
加载可执行文件(App的.o文件集合)
加载动态链接库,进行rebase指针调整和bind符号绑定
Objc运行时的初始处理,包括Objc相关类注册、category注册、selector唯一性检查等
初始化调用,包括了执行+load()方法、attribute((constructor))修饰的函数的调用、创建C++静态全局变量。
APP的启动优化
一个应用的性能如何,冷启动是个重要的衡量指标; 毕竟用户第一次使用应用时,多久能进入页面(包括首页、启动页、广告页等),是用户的第一感官
对于一般应用,有启动页和广告页,对启动速度的要求相对于来说降低了一些,毕竟,进来就是启动页,只是时间停留时间长短问题(当然,不是说对时间不敏感,你要是在启动页停留个3,5s,谁也受不了;不过,话说,谷歌统计的所有应用的平均时间竟然是4000多ms,这还是挺吃惊的)
我所做的是个系统工具类,没有启动页,直接就是干到首页。又因为是系统应用,要有和桌面有一体化的感觉,所以,对启动速度要求极高;同时,又由于要适配全机型(Android5.0 -Android 12.0),前期没有做版本区分,所以,挑战来说更大。无论怎么说吧,经过一轮又一轮的优化,低端机达到了550ms以内,高端机更是在300ms以内;整体启动速度提供65%左右
其实,现在写冷启动的并不多,为啥呢? 有一些是公司并不在意,个人也就不在意,还有就是业务有启动页,可能并不明显。最后也有一部分原因来讲就是应用层去优化有限,更多的是业务逻辑的优化,感觉写不出创意来,我这篇文章也是先简单讲下冷启动的流程,看下那些我们可以去做,以及一些通用通吃的方案,一些结合业务做的优化(图片的加载优化、耗时业务的巧妙处理),期望大家看到后引起更多的思考和更多的交流学习
App启动进程图述
在这个进程启动图中,只是节选了我们正常冷启动的四个进程间的唤起与创建,详细的描述了App进程的调用图,是为了让大家对流程优化有更清晰的认知。 有图可以知道,View的绘制是在生命周期的onResume之后
View加载优化
有时候ViewDidLoad里面会进行很多耗时操作,用户还是会感觉到卡顿; 关于这点,目前的比较好的方案是首先给用户提供一个空壳,或者一个页面大概内容的图片,然后在ViewDidLoad方法里面进行数据加载和解析渲染等一系列操作
这样一来,用户已经看到界面了,就不会觉得启动慢了,相当于把启动时间转嫁给数据请求时间去背锅了。如果再配合上之前数据的缓存,那么这个启动的效果就会比较可观了
五、总结
启动优化需要针对不同的业务做出不同的优化方式
总的来说,**优化方向可以分为布局优化,减少解析xml和绘制的时间;逻辑优化,将必要且耗时的操作异步加载,将非必要的采用延时加载,另外,将操作优先级高的可以优先加载;**由于篇幅的原因,这些内容我们下节在讲
启动速度优化是一个大工程,后续还需要针对具体场景继续深度挖掘
以上就是今天的所有内容,相信大家看完之后都会有着自己的收获,但是盲目的学习并不能让你的技术稳定的增长
我自荐一套 [《完整的Android学习资料,以及一些视频课讲解》
现在私信发送 “笔记” 或 “进阶” 即可 免费获取
最后我想说:
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们
技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面
Android 架构师之路还很漫长,与君共勉
边栏推荐
猜你喜欢
SQL注入(7)
PHP deserialization vulnerability
清理c盘爆满告急,C盘清理
After Alibaba Cloud sets up domain name resolution redirection, I cannot use Chrome to access it
mysql 原生语句点滴学习记录
CTF-Neting Cup Past Topics
考(重点理解哪些属于其他货币资金)、其他货币资金的内容、其他货币资金的账务处理(银行汇票存款、银行本票存款、信用卡存款、信用证保证金存款、存出投资款、外埠存款)
文件包含漏洞
The shooting range that web penetration must play - DVWA shooting range 1 (centos8.2+phpstudy installation environment)
ES6 array extension methods map, filter, reduce, fill and array traversal for…in for…of arr.forEach
随机推荐
laravel-admin 线上访问项目,一直重定向到登录页面
Warzone: 3 (Exogen) vulnhub walkthrough
laravel 查询数据库获取结果如何判断是否为空?
Masashi: 1 vulnhub walkthrough
真·杂项:资本论阅读笔记(随缘更新)
敏感信息泄露
成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
web安全之目录遍历
Solve the problem that the 5+APP real machine test cannot access the background (same local area network)
【泰山众筹】模式为什么一直都这么火热?是有原因的
ES6 three-dot operator, array method, string extension method
会计凭证概述、原始凭证、原始凭证的种类、原始凭证的基本内容、原始凭证的填制要求、原始凭证的审核
英语每日打卡
file contains vulnerabilities
加密数字货币前传:从大卫·乔姆到中本聪
重点考:从债劵的角度来看交易性金融资产
xxe of CTF
SQL注入(6)
动力:2 vulnhub预排
Scrapy crawler encounters redirection 301/302 problem solution