Android-性能

本文围绕Android应用性能展开,阐述好的性能需满足屏幕刷新快、尊重用户资源和平衡各要素,解释每帧16毫秒的原因。介绍基本性能测试方法,如真机测试、收集用户反馈等。还提及检查帧率、使用分析工具、遵循改进周期、保持响应及监控运行性能等优化要点。

性能

内容:

  1. 什么是好的性能?
  2. 为什么是一帧16毫秒?
  3. 基本的性能测试?
  4. 检查你的帧率
  5. 获取性能问题
  6. 保持你的APP程序的响应性
  7. 监控你的运行中程序的性能
  8. 学习更多

作为一个android开发者,你同时也是一个android用户,你知道当一个APP没有加载,花费长时间加载,每一次动画卡顿,随意奔溃,最重要的是耗尽电池或者使用完你的整个数据计划,面对这些情况,你的感受是怎样的。

用户会给那些快速响应用户输入,始终流畅的执行和尊重手机有限电池资源的APP更高的评价。

为了使一个可用的、感兴趣的、漂亮的APP脱颖而出,你应该使它尽可能的小、快、高效。考虑你的应用程序可能对设备的电池、内存和设备存储的影响,在互联网上获取和存储数据时要考虑到用户的数据计划。

就像你的应用可能存在的其他漏洞和设计问题一样,发现导致你的APP表现低于预期的原因可能很容易,也可能很难。以下两种方法结合使用会对你跟踪、修复、测试性能问题提供很大的帮助。

  1. 使用工具检测你的应用并获取性能数据测量。
  2. 使用系统的、迭代的方法,这样你就可以衡量应用更改所带来的改进。

虽然比android开发者基础课程的性能部分更全面,但本章及相关的实践只是让你走上成为性能专家轨道的起点。

什么是好的性能?

APP性能。发生在屏幕的事情是用户对你的APP大部分且最直接的感受。你的应用程序必须始终以足够快的速度绘制屏幕,以便用户看到平滑、流畅的运动、过渡和响应。为了达到这,你的APP每一帧刷新屏幕都必须在16毫秒或更短的时间内完成所有的工作。

尊重用户。当涉及到尊重用户的资源时,及时尽量减少移动数据和电池电量的使用。用户将会卸载耗尽电池的APP。

平衡。最大化性能的关键在于平衡。为了给用户最好的体验,你想要找到在APP复杂性、功能和可视化中的平衡点。

为什么每帧16毫秒?

人类眼睛和16毫秒每刷新

人脑不断的接收和处理视觉信息。例如,当静态图像以足够快的顺序显示时,人们感觉它们好像在运动一样,正如下图中的活页书。

一本活页书大约每秒移动10-12页,对于电影来说,每秒24-30张就足够了,但如果没有花哨的电影效果,仍然无法令人信服。理想的数字是每秒60张图片,因为大多数人认为这是高质量、流畅的动作。

这种质量被称为“帧率”或“每秒帧数”(FPS)。

电脑硬件和每秒60帧等于每帧16毫秒

当涉及运动的不一致时,人类的眼睛是非常敏锐的。例如,如果你的app是运行在平均每秒60帧的速度上,刚好只有一帧的显示时间比前一帧长很多,用户就会注意到平滑的中断,这通常被称为“挂起”、“延迟”、“停顿”或“中断”。

大多数现代移动设备以每秒60帧的速度刷新显示。这个数字由硬件设备决定,硬件定义了屏幕每秒可以更新多少次。

为了匹配硬件屏幕每秒60次的更新,系统软件尝试每16毫秒重新绘制你当前的APP页面。

就是这16毫秒,除了绘制UI,系统必须花时间来响应意图、处理输入时间等等。你的应用程序与Android上的其他子系统共享着16毫秒,所以16毫秒/帧是一个上限。

下图的表:

  1. 每一帧花费16毫秒或者更少。
  2. 如果你的APP花费更长时间且没有完成更新在16毫秒以内。
  3. 你的得到的被称为“掉帧”、“延迟帧”,用户视其为“结巴”。

作为APP开发者,你想要你的APP持续的用少于16毫秒每帧的速度来贯穿你用户的体验。

基本的性能测试

以下是应用程序最基本的性能测试。它不需要特殊的设置或工具,只需要你的应用、你自己和诚实的观察。

重要:为了拿到应用程序精准的数据,你必须在真机上进行测试,而不是在模拟器上。

  1. 在目标用户可能拥有的最低端的设备上安装应用。这是很重要的,例如,如果你开发了一款用于绘制农村地区清洁水井地图的应用,你的主要用户肯哪个没有最新的高端设备。
  2. 像普通用户一样使用你的应用。即使是最小的等地啊、结巴或者无反应也要详细记录。注意随着时间的推移,速度会越来越慢。
  3. 尝试通过快速和随机的点击来让你的应用奔溃,甚至以你不希望用户使用应用程序的方式进行交互。
  4. 把手机交给朋友,看着他们使用并做笔记。在开始之前,询问他们的期望,在使用过程中倾听他们的评论,和当他们做完了的时候,获取额外的反馈。你可能不仅会得到性能方面的反馈,还会得到UI效率方面的反馈。
  5. 如果想获得更多用户的反馈,可以运行一个可用性cafe视频中演示的小型可用性测试。

模拟器提示:为了得到精准的数据,你需要在真机上做大部分性能测试。然而,在物理设备上进行低带宽和无网络的测试是比较困难的。你可以通过使用模拟器和调整它们的设置来检查你的APP在低带宽和网络下表现的情况。请参阅使用扩展控件并从命令行启动模拟器(查找netdelay参数)。

如果这些手动测试没有发现任何性能问题,那么你已经有了一个很好的开始。

如果你收集了任何与性能有关的信息,那么性能就是应用的一个问题,你必须找出潜在的原因并修复它们。

检查你的帧率

你可以通过使用android设备上的GPU渲染工具来检查你的APP在16毫秒/帧限制下的渲染效果。必须打开Developer Options才能使用此工具。

  1. 进入设置-开发者选项。
  2. 向下滚动到Monitoring部分。
  3. 选择GPU渲染。
  4. 在对话框中选择“在屏幕上作为条”。马上你就会在屏幕上看到彩色条,类似于下图的截图
  5. 返回你的app。
  6. 一个竖条代表一帧渲染。竖条越高,框架渲染的时间就越长。
  7. 每个颜色代表了渲染屏幕的不同阶段。
  8. 如果竖条在绿色线条之上,它花费超过16毫秒来渲染。理想的,大部分的竖条都在绿线以下,但是当你第一次加载一个图像时,标准可能会大大提高。用户可能不会认为这是一个问题,因为他们可能需要等待一段时间才能加载图像。

下图是运行在android 6.0或更高版本的设备的条形图。

 

例如,如果绿色的输入部分线条过高,你的app花费许多时间来处理输入事件。阅读更多关于“使用GPU渲染分析”不同的状态意味着什么。关于如何使用该工具检查和提高应用程序的性能,请参阅GPU渲染教程,并参阅GPU渲染使用教程。

接近性能问题

使用性能分析工具

Android和android studio自带了许多性能分析工具来帮助你识别性能问题,并跟踪他们在代码中的位置。例如:

  1. 使用上面描述GPU渲染工具,测试屏幕渲染的速度有多快,以及在渲染管道中的什么地方你的应用程序可能做了太多工作。
  2. 通过使用布局检查器(工具-android-布局检查器)可视化你的APP的视图层级结构。寻找改善布局性能的方法。
  3. 使用电池统计和电池历史记录来记录电池的使用情况。在你的应用程序中使用BatteryManager类监控电池水平和充电状态。

有关全面的列表和文档,请参阅性能分析工具。

遵循性能改进生命周期

使用一个系统的、可交互的方法来发现和修复性能问题。这可以帮助你跟踪你正在测试的内容,你收集的数据,你执行的修复,以及你的应用在一段时间内的改进。性能跟调优的生命周期是一个可重复的三步调优应用程序性能的方法。

 

性能改进生命周期由三个重复的阶段组成:

  1.  收集信息。使用上面描述的处理性能问题的性能分析工具来捕获关于应用程序的数据。记录这些数据以便后面你可以将其与更改应用程序后捕获的数据进行比较。
  2.  深入探索。花点时间理解你收集到的数据对你的应用意味着什么。你可能需要通过多次迭代使用多个工具来收集信息,以确定问题所在。例如,你可能有个复杂的视图层级结构,但是它渲染很快,这个最大的问题是你的程序在UI线程上做的工作应该在后台线程上完成。
  3.  采取行动。评估解决问题的方法。采取行动可以采用不同的形式,你决定要做的依赖于你的情况和上下文。你也许更改代码和优化布局,或者后端服务器。你所更改的内容可能会受到诸如编码资源、预算和截止日期等约束的影响。
  4.  认证。检查和确认你的更改有预期的效果:
  1.   收集第二组数据。再次运行工具来测量你的更改所带来的影响。
  2.   和你的原始数据进行比较,确保你已经修复了正确的问题,并找出是否需要进行额外的性能改进。
  3. 做出不同的或额外的更改。

在你的目标设备上重复的处理该流程直到你的APP对所有用户的操作多做出平稳的响应,不会出现卡顿,也不会让用户等待。

有关性能改进周期的更多信息,请查看工具而不是规则和性能周期。

保持你的应用及时响应

编写的代码可能赢得世界上所有的性能竞赛,但仍然感觉缓慢、挂起、冻结很长时间,或者处理输入需要很长时间。发生在你的应用响应最糟糕的事情是“Application Not Response”(ANR)对话框,如下图所示。此时你的应用程序已经有相当长的一段时间没有响应,所以系统为用户提供退出APP的选项。当程序没有响应时,系统显示ANR对话框。

当监测到以下情形时会弹出ANR对话框:

  1. 你的APP对一个输入事件例如按键或屏幕点击没有在5秒内响应。如果你的APP在UI线程做了太多的事情,特别是在oncreate()方法中,就会弹出该对话框。

如果任何工作在应用程序可以继续之前不需要完成,将它移出UI线程,例如使用Loader或AsyncTask。向用户显示正在进行的进度,例如在UI中使用进度条。

     2.一个BroadcastReceiver没有在10秒内完成执行。

防止ANR的发生,只使用广播接收器的预定用途。广播接收器意味着在后台做少量、离散的工作,比如保存设置或注册通知。

在应用程序中设计响应非常重要,这样系统就不会向用户显示ANR弹框。使用例如Systrace和Traceview来确定应用程序响应的瓶颈。有关性能工具的介绍,请参阅实践。

监控正在运行APP的性能

Android studio有检测应用APP内存使用、CPU、网络性能的工具。高级分析工具显示CPU、内存和网络活动的实时数据更新。

使用android profiler工具:

  1. 在android studio中,窗口底部,点击android profiler。
  2. 运行你的程序并和它进行交互。监视器更新以反映应用程序对资源的使用情况。注意为了获取精准的数据,你应该在真机上做这些,而不是虚拟机设备上。

Android profiler窗口默认的视图如下所示,为每个profiler显示一组简化的数据。当你点击一个工具,它会打开显示更多的细节和更多的功能。

截图中的数字含义:

  1. 下拉菜单以选择设备。
  2. 下拉菜单,选择你想要配置的应用程序。
  3. 时间轴缩放控件。
  4. 跳转到实时数据的按钮,例如滚动后检查以前的数据。
  5. 显示活动生命周期的事件时间轴,所有的输入事件,屏幕旋转事件。这个时间轴可以帮助你把你在图表中看到的内容和代码区域联系起来。

事件时间轴显示三个监视器:

  1. 内存分析器向你展示了一个分配对象和垃圾收集事件的实时计数。它还允许你捕获堆转储并记录内存分配。
  2. CPU分析器显示了应用程序的实时CPU使用情况和系统范围内的CPU使用情况。
  3. 网络分析器显示了真实的网络活动。它显示发送和收到的数据,以及当前连接的数量。你还可以看到事件事件线和无线电状态vsWIFI。

阅读android profiler文档一了解更多有关使用监视器的信息,并进行性能实践检验。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值