这是我参与「第四届青训营 」笔记创作活动的第5天
01 本堂课重点内容:
- 为什么做性能优化?
- 何为性能优化?
- 最佳性能工具选型
- 如何做性能优化?
02 详细知识点介绍:
2.1 性能优化是什么?
2.1.1 性能优化的主要目标是什么
- 快:最快显示效率、最快网络速率、最快UI响应
- 稳:最佳用户体验,减少强打断
- 省:最低存储、最低功耗、最低流量消耗、最低计算资源
2.1.2 广义的性能优化分类
流畅度、资源、稳定性、系统级
2.1.3 流畅性优化基础介绍
Google 定义:界面呈现是指从应用生成帧并将其显示在屏幕上的动作。要确保用户能够流畅地与应用互动,应用呈现每帧的时间不应超过 16ms,以达到每秒 60 帧的呈现速度(为什么是 60fps?)。 如果应用存在界面呈现缓慢的问题,系统会不得不跳过一些帧,这会导致用户感觉应用不流畅,我们将这种情况称为卡顿。
2.1.4 资源优化基础介绍
- 最大化资源调度:最大资源调度分为两个方向,第一个方向将一些有限资源尽量向最影响体验的方向靠拢,满足用户快的需求;第二个方向,深度剖析系统资源使用,需要从系统层与用户角度榨取更多的可用资源,满足用户多的需求,最终实现最大化资源调度。
- 最小化资源使用:指需要对持续性的指标影响降到最低,满足省的需求,本质的原则就是保证业务基本面的前提下,通过降级或者优化等手段,将占用的资源做到最小。
2.1.5 稳定性优化基础介绍
当性能劣化累积到一定程度,就变成了稳定性问题,直接强制打断应用的使用体验。
2.1.6 系统级优化基础介绍
如何充分利用应用程序和系统程序,综合提升应用的性能表现。有哪些可以挖掘的点。
2.2 最佳工具选型
2.2.1 性能监控工具的价值
App的性能问题包括崩溃、网络请求错误或超时、响应速度慢、列表滚动卡顿、流量大、耗电等等。而导致App性能低下的原因有很多,除去设备硬件和软件的外部因素,其中大部分是开发者错误地使用线程、锁、系统函数、编程范式、数据结构等导致的。即便是最有经验的程序员,也很难在开发时就能避免所有导致性能低下的“坑”,因此解决性能问题的关键是在于能不能尽早地发现和定位这些“坑”。
2.2.2 Gpu呈现模式
下图是放大的 GPU 渲染模式分析图形。
2.2.3 Layertool
抖音自研工具,快速识别图层及过度绘制、绘制区域过大等问题,提升整体渲染效率.
2.2.4 CPU Profiler
当您打开 CPU 性能分析器时,它会立即开始显示应用的 CPU 使用率和线程活动。如下图所示,CPU 性能分析器的默认视图包括以下时间轴:
-
事件时间轴:显示应用中的 activity 在其生命周期内不断转换经历各种不同状态的过程,并指示用户与设备的交互,包括屏幕旋转事件。如需了解如何在搭载 Android 7.1(API 级别 25)及更低版本的设备上启用事件时间轴,请参阅启用高级性能分析功能。
-
CPU 时间轴:显示应用的实时 CPU 使用率(以占总可用 CPU 时间的百分比表示)以及应用当前使用的线程总数。此时间轴还会显示其他进程(如系统进程或其他应用)的 CPU 使用率,以便您可以将其与您应用的 CPU 使用率进行对比。您可以通过沿时间轴的横轴方向移动鼠标来检查历史 CPU 使用率数据。
-
线程活动时间轴:列出属于应用进程的每个线程,并使用下面列出的颜色在时间轴上指示它们的活动。记录轨迹后,您可以从此时间轴上选择一个线程,以在轨迹窗格中检查其数据。
- 绿色:表示线程处于活动状态或准备使用 CPU。也就是说,线程处于正在运行或可运行状态。
- 黄色:表示线程处于活动状态,但它正在等待一项 I/O 操作(如磁盘或网络 I/O),然后才能完成它的工作。
- 灰色:表示线程正在休眠且没有消耗任何 CPU 时间。 当线程需要访问尚不可用的资源时,就会出现这种情况。在这种情况下,要么线程主动进入休眠状态,要么内核将线程置于休眠状态,直到所需的资源可用。
-
CPU 性能分析器还会报告 Android Studio 和 Android 平台添加到应用进程的线程的 CPU 使用率,这些线程包括 JDWP、Profile Saver、Studio:VMStats、Studio:Perfa 和 Studio:Heartbeat 等(不过,它们在线程活动时间轴上显示的确切名称可能有所不同)。Android Studio 报告此数据是为了方便您确定线程活动和 CPU 使用率什么时候是由应用的代码实际引发的。
2.2.5 Traceview
以下各部分进一步介绍了 Traceview 的输出窗格。
时间轴窗格
- 下图显示了时间轴窗格的特写。每个线程的执行情况都显示在各自的行中,并且越往右使用的时间越长。每个方法都以不同的颜色显示。第一行下面的细线显示所选方法的子级(从进入到退出)。
分析窗格
如下图所示,剖析窗格列出了跟踪日志期间执行的各个方法以及执行这些方法所用的时间。调用另一个方法的方法称为父级,父级调用的方法称为其子级。当您通过点击某个方法以选择该方法时,它会在两个单独的节点下同时显示其父级和子级。
- 对于分析窗格中的每个顶级节点,表中的 Calls + Rec, Calls/Total 列(下图中未显示)会报告对相应方法的调用次数和递归调用的次数。而对于父方法和子方法,此列会显示被调用方法为顶级节点中方法的子级或父级的调用次数。
2.3 系统级优化
下图为近年来Android平台对性能优化影响比较大的feature
- 2014年,zram ksm内存提升进入Android主分支。
- 2015年,提出了新虚拟机art,同时HMP大小核调度,出现8核处理器,对传统的调度器新的挑战。
- 2016年,引入了sdcardFS对外置存储有提升,cpuset前后台应用context,帮助大小核使用。
- 2017年,引入了vulkan,从而替代opengl图形库,同时binder重构,binder并发性能导到大幅提升。
- 2018年,引入EAS大小核调度器解决功耗和性能平衡的痛点。
- 2019年,引入分代的并行拷贝GC被引入,提升了GC性能。
03 实践练习例子:
使用相关工具对自己的软件进行性能分析。
04 课后个人总结:
本节课对Android性能优化及工具有了一个基础性的了解,了解了什么是性能优化以及为什么我们为什么要做性能优化,并熟悉了相关性能优化工具。
05 引用参考:
部分图片与知识点来源于: