启动时间是App使用者的第一体验,很多大厂都通过A/B实验论证启动速度的优化可以带来用户留存的显著收益,尤其是体量大的用户,启动时间缩短一点,留存增长一点,那就带来了非常大的收益。因此,启动性能优化一直是各大厂体验技术团队的重点投入。
为什么启动性能优化这么重要?
因为没有哪个开发团队一开始就可以直接把产品做到极致,中间总会遇到一些BUG,所以在产品上线前就需要不断的测试和优化,避免上线过程中出现一些白屏、闪屏、加载漫长、卡顿等情况BUG的出现,在开发者眼里通过用户体验,留存住用户才是王道。
性能优化始终穿插在 App 整个研发生命周期中,尤其是从 1 到 100的阶段,这个阶段增长开始平缓,性能优化就是突破增长瓶颈,提升日活天花板的主要方式。
像近几年的面试问的也越来越深入,比如以下问题:
- 在之前的项目中做过哪些性能优化,取得过哪些收益?
- 对于App启动时间这块,有什么心得?如何从线程、系统层面出发优化启动速度?
- JUC闭锁与AQS技术在启动架构设计中如何应用?
- IO优化是怎么做的,高频IO操作使用 SharedPreferences为什么会很卡,你有更好的解决方案吗?
- 流畅性这块,你们 App 的关注的指标是?这块有什么经验?你觉得造成页面卡顿最主要的原因是?有什么通用性的优化方案?
- ……
但大多数开发者更多的还是在做业务开发,对于性能优化基本停留在"听说过"或者"简单使用工具"的阶段,其中不乏一些工作多年的 Android 工程师。
当然如果想要精进,不仅要知道如何利用工具做性能优化,还要对底层原理充分了解,对架构设计有一定经验,例如你从任务管理角度做启动优化,就需要精通图论与框架设计,如果你对IO进行优化,就必须精通MMAP原理与框架封装的常用技术等…
这样才能够说得上是精通性能优化。
精通意味着:
- 首先在大厂面试环节,性能优化基本是必问项,你可以展示出个人实力;
- 一旦你进入大厂,对性能优化了解越多,你能够做的事情就越多,产出也会越多,而且可以持续不断去做。
在一些面试中,也会看到一些朋友写“精通性能优化”,但是让其描述,往往就是一些自己编写的业务,一些去除页面多余嵌套、使用线程池、ViewStub 这些非常浅的方案。
其实更多的,面试官还是希望能够听到,线上复杂环境,低端机/弱网等因素下,用户触发的一系列的体验问题。
想要搞清楚这些,那么必须对各种底层原理有着深度的了解,对各种 case非常丰富的经验;很多朋友经常遇到措手不及的问题,大多是因为对出现问题的情况和处理思路模糊不清,导致此原因就是因为没有彻底搞懂底层原理。
比如下面这张 Android启动流程图,不少人都看过,但少有人沉下心去仔仔细细研究过。
对于上图来说,你能找到合理的优化位置吗?
作为过来人,发现很多学习者和实践者都在 Android 性能优化上面临着很多的困扰,比如:
- 工作场景中遇到“性能优化”难题,往往只能靠盲猜和感觉,用临时性的补救措施去掩盖,看似解决了问题,但下次同样的问题又会发作,原因则是缺乏方法论、架构思维的指引以及工具支持;
- 能力修炼中,缺乏互联网项目这一实践环境,对“性能优化”只能通过理论知识进行想象,无法认识其在工作实战中的真实面目和实操过程;
- 职场晋升中,只管功能开发,不了解组件设计原理,缺少深入地思考与总结,无法完成高并发、高性能系统设计这类高阶工作,难以在工作中大展拳脚,而有挑战的工作往往留给有准备的人。
总之,一旦遇到性能问题,很少人能够由点及面逆向分析,最终找到瓶颈点和优化方法,可见性能优化需要对知识进行综合的掌握与灵活的运用,属于安卓知识领域的的深水区,也是衡量一个研发能力高低的标准之一。
为了帮助到大家更好的全面清晰的掌握好性能优化,准备了相关的学习路线以及核心笔记(还该底层逻辑):https://qr18.cn/FVlo89
大家可以进行参考学习:
性能优化核心笔记:https://qr18.cn/FVlo89
启动优化
内存优化
UI优化
网络优化
Bitmap优化与图片压缩优化:https://qr18.cn/FVlo89
多线程并发优化与数据传输效率优化
体积包优化
《Android 性能监控框架》:https://qr18.cn/FVlo89
《Android Framework学习手册》:https://qr18.cn/AQpN4J
- 开机Init 进程
- 开机启动 Zygote 进程
- 开机启动 SystemServer 进程
- Binder 驱动
- AMS 的启动过程
- PMS 的启动过程
- Launcher 的启动过程
- Android 四大组件
- Android 系统服务 - Input 事件的分发过程
- Android 底层渲染 - 屏幕刷新机制源码分析
- Android 源码分析实战