安卓绿色联盟应用性能标准主要基于主观体验、资源消耗和应用质量三个方面进行制定。

1、主观体验

主观体验主要是对应用启动时间和界面帧率制定标准,要求应用在视觉上足够流畅。其中应用启动时间又分为冷启动时间和热启动时间。

安卓绿色联盟性能标准要求,应用冷启动时间需小于1000ms,热启动时间需小于500ms;普通应用帧率应大于55fps,游戏视频帧率应大于25fps。

2、资源消耗

资源消耗主要是要求应用不能占用过高的内存和CPU。

安卓绿色联盟性能标准要求应用前台内存占用应小于500M,后台内存占用应小于400M;在CPU占用方面要求应用在后台灭屏5分钟后,CPU占用不超过2%。

3、应用质量

应用质量主要是对应用过度绘制和内存泄露的情况作出要求,规定应用不能存在过度绘制和内存泄露。

安卓绿色联盟性能标准要求应用界面任意像素点不存在4x的绘制的情况, 3x绘制的区域不能超过界面面积的1/3,在Strict Mode中不允许有红框闪烁。

性能调试方法

在了解性能调试方法之前,我们可以先通过下图了解安卓应用性能与系统之间的关系。一个应用从应用绘制到最终显示在LCD上经历了一个漫长的路径,在任何一个阶段出现延时都会导致界面上的卡顿。

1、Strict Mode

Strict Mode意思为严格模式,是Android提供的一种运行时检测机制,一般用来检测在主线程发生的耗时动作,比如IO读写、数据库操作、复杂算法等。在手机设置开发者选项把Strict Mode打开,就可以在界面上把它打开了。

严格模式主要有2个策略,一个是线程策略,即ThreadPolicy,主要检测主线程中的一些耗时操作;另一个是虚拟机策略,即VmPolicy,主要检测一些对象的泄漏。

两大策略检测的内容和开启方法可以依据下图中的说明进行使用。

严格模式有三种惩罚模式:应用崩溃、弹窗警告和打印日志。在性能测试中,我们可以通过APPLogcat抓取Strict Mode的日志,同时利用代码启用Strict Mode,配合我们所需要的策略和惩罚,就可以及时定位应用的违规细节,并及时进行性能优化。

当我们碰到违规的行为时,该如何进行治理呢?建议将文件操作放到工作线程去完成,如果在主线程上提及操作,建议使用Apply和Commit去完成。如果存在对象未关闭的情况,可以通过对应的StackTrace进行关闭。

2、OverDraw DeBugger

Overdraw是指屏幕上的某个像素在同一帧的时间内被绘制了多次,这个工具使用色块来代表不同数量的过度绘制,我们可以使用这个工具来定位由过度绘制引起的用户界面卡顿问题。

在开发者选项中选择开启 Debug GPU Overdraw选项,即可在安卓设备上将过度绘制问题可视化。

左图为正常模式下显示的视图,右图为开启GPU Overdraw后显示的视图

3、Profile GPU Rendering

ProfileGPU Rendering 工具以滚动直方图的形式直观地显示渲染界面窗口帧所花费的相对时间(以每帧 16 毫秒的速度作为对比基准)。这个工具同样也是在安卓设备的开发者选项中开启。每个管线的高度表示时间,管线中各个彩色区段代表不同含义。

下表介绍了使用运行Android 6.0及更高版本的设备时分析器中不同竖条区段的含义。

4、Android Profiler

Android Profiler是一个Android Studio集成的应用性能分析器,可以实时查看CPU、Memory和Network的动态情况。以下重点介绍CPU Profiler:

CPU Profiler 可帮助您实时检查应用的 CPU 使用率和线程 Activity,并记录函数跟踪,方便大家优化和调试应用代码。

当打开 CPU Profiler 时,它将显示应用的 CPU 使用率和线程 Activity。

CPU Profiler可以选择不同的标签,并对应用线程进行跟踪。如:

(1)Flame Chart标签会提供一个倒置的调用图表,汇总相同的调用堆栈,收集调用顺序完全一致的函数,并在火焰图中用一个较长的横条表示它们。

(2)Top Down标签能够提供每个函数调用上所花费的CPU时间。Self表示函数调用在执行自己的代码上所花的时间;Children表示函数调用子方法所花费的时间;Total表示Self和Children时间的总和。

5、Systrace

Systrace是我们分析性能最常用的工具之一,它可以分析整机系统性能及动态场景的性能问题。

Systrace 允许您在系统级别收集和检查设备上运行的所有进程的计时信息。它将来自Android内核的数据(例如CPU调度程序,磁盘活动和应用程序线程)组合起来,以生成HTML报告。

上图左部是Systrace的界面,我们可以通过右边的代码抓取Systrace,观察进程的执行时间。在输入抓取命令时,时间参数一般选择5到10秒,因为时间过短可能会抓不到想要的数据,时间过长则可能抓取失败。

一般我们通过Chrome浏览器查看生成的trace文件,也可以通过DDMS图形界面去抓取Systrace。

拿到一个Systrace时主要考察哪些因素?首先看一下CPU的频率,找到对应的进程或者线程,查看相关信息;同时还要观察GPU的频率、Surface Flinger还有绘图的Buffer状态等。

当应用发生卡顿时,我们可以通过Systrace进行分析。在生成的trace文件中,找到主线程UI,每一帧都会标记一个带有F的圆形。当原型为绿色时,代表页面流畅,而黄色和红色则存在超时,我们可以点击去查看具体存在什么问题。

性能案例分析

案例1:界面滑动卡顿

从图中可以看到,这是一个手动滑动事件,当deliverInput事件发生后,第一帧就发生了卡顿。从systrace看UI thread执行draw的时间相当耗时导致丢帧卡顿,而且大部分时间都在做decodeBitmap,共耗时99.045ms。这时,我们打开applog发现,有StrictMode相关的错误提示,从中可以定位到耗时函数。

从上图我们看出有一个网络访问违规,大概可以推测应用在从网络上下载了一个数据流,数据流里可能包含了一些图形,通过decodeBitmap把它解析出来展示在UI界面中。正产情况下,我们应该把网络访问放在工作线程里面去处理,将数据下载完了之后再放到主线程中去展示,避免这种问题的发生。

案例2:Strict Mode错误提示

从上图Strict Mode的日志可以看出:StrictMode policy violation耗时2秒左右。通过最下行蓝色的log,可以知道应用是在某一个目录里面寻找一个文件,判断文件是否存在。

面对这种问题,我们应该把IO操作放到工作线程。正常情况下IO的发生非常快,但是在系统繁忙时,IO放在主线程会产生较大的问题,因为它要等别的程序读写完成之后,才会下发,产生超时。

案例3:GPU调用不当导致的卡顿问题

这是一个GPU的例子,上图主要问题是GPU使用了太长时间处理应用传过来的buffer,例子中Surfaceflinger 使用GPU 做了图像叠加,说明图层比较多。使用GPU做叠加主要会产生功耗和唤醒耗时的问题。大家在做界面设计的时候,尽量不要使用GPU进行叠加。在上面的例子中,GPU叠加之后,导致了大概15ms左右的延时,因为GPU操作完成以后还需要交给Surfaceflinger把图像显示到屏幕上。

案例4:CPU调用不当导致的界面滑动卡顿问题

可以通过上图的红色条块了解messageloop RunTask信息,红色条块上的蓝色bar,表示线程在CPU上的状态。蓝色表示这个线程处于等待CPU调度的状态,可见等待超过8ms的时间,是正常调度周期好几倍。导致这种情况发生的原因有两个:CPU负载过大或CPU调度出现了问题。在上图中我们可以看出,CPU0和CPU1使用率100%,但是CPU2和CPU3是offline的状态,说明系统出现问题,导致CPU2和CPU3未能唤醒,帮助完成系统任务。

性能优化建议

1、避免内存泄露

在应用开发过程中,首先要避免内存泄露的问题,内存泄露是一种比较严重的性能问题,在安卓绿色联盟应用性能标准中也要求应用不允许发生内存泄露。

下图是常见的内存泄露防范方法和内存泄露检测工具。

2、避免不良设计或程序算法导致CPU占有率持续偏高

  • 主要业务处理分散到不同线程,便于后续利用多核处理器的并行处理能力,避免一核累死,7核围观;
  • 使用top命令观察应用线程的CPU占有率,找出高负载的进程进行分析,并针对优化。

3、避免OnXXX 回调函数中进行耗时操作,避免主线程卡顿

Android系统中正常情况下所有onXXX类函数均运行在主线程中。

在上图中,我们可以看到两帧中间有一个因为接收广播处理导致的158ms的卡顿。在这些函数中,我们应该避免网络通信操作、文件读写操作、数据库数据改动的操作、图形处理、文本分析等操作,将这些工作尽可能的移到工作线程中去,从而避免主线程卡顿。

4、合理使用系统资源

合理使用系统资源主要指的是软资源。下图是对广播资源调用的一些建议。

关注安卓绿色联盟公号,回复关键词“23”,获取PPT

转载于:https://www.cnblogs.com/androidga/p/10407841.html

安卓应用性能调试和优化经验分享相关推荐

  1. 欢乐互娱庞池海:《龙之谷》项目性能优化经验分享

    欢乐互娱庞池海:<龙之谷>项目性能优化经验分享 在5月12日,UNITY 2017案例分享专场上,欢乐互娱技术引擎开发工程师娱庞池海分享了<龙之谷>项目性能优化经验.以下为分享 ...

  2. Unity MMORPG游戏优化经验分享

    今天由Unity技术支持工程师高岩,根据实际的技术支持工作经验积累,分享如何对Unity MMORPG游戏进行优化. 在优化Unity游戏时,我们一般从四个方面:CPU.GPU.内存.工程配置等入手, ...

  3. Unity3d-MMO游戏优化经验分享沙龙总结

    原文地址:MMO游戏优化经验分享沙龙总结 昨天去上海参加了UWA公司的张鑫和张强进行了一场关于MMO游戏开发和性能优化的沙龙,活动链接为:UWA优化日上海站|传统MMO手游性能该如何突围?.虽然第二场 ...

  4. 城市快速路拥堵治理及一体化交通组织优化经验分享

    10月27日,在由中国道路交通安全协会主办.北京易华录信息技术股份有限公司承办的"交通缓堵新技术及应用实践论坛"上,济南市公安局交警支队交通科学研究所副所长云廷进就<城市快速 ...

  5. Unity内存优化经验分享

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  6. 【东营seo诊断公司】SEO优化经验分享 如何成为一个合格的SEOer?

    [东营seo诊断公司]SEO优化经验分享 如何成为一个合格的SEOer? 在优化网站的关键词排名,也就是进行SEO工作时,很多时候都要求SEO优化人员对很多细节进行把控并且对很多数据进行分析.只有这样 ...

  7. Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理

    基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB级.万亿条数据记录的检索工作,这里向大家分享下Lucene底层原理研究和一些优化经验. 从两个方面介绍: 1. Lucene简介和索 ...

  8. Lucene底层原理和优化经验分享(2)-Lucene优化经验总结

    转自:https://blog.csdn.net/njpjsoftdev/article/details/54133548 系统优化遵从木桶原理:一只木桶能盛多少水,并不取决于最高的木板,而取决于最短 ...

  9. linux修改ip配置文件_协助调试Linux服务器经验分享

    achair教程网,原创教程,经验分享.有个微信群,与WordPress爱好者交流,加群方法:添加微信号368537,回复WordPress群. 大家好,我是achair,周末整个下午都在搞Linux ...

  10. mysql百万数据根据索引查询_mysql创建多列索引查询百万表数据的性能优化经验分享...

    最近发现最代码网站中的收到的评论,提到我的,心情被赞的查询异常缓慢,通过nginx日志发现响应时间快的在5s,慢的有13s,终于忍无可忍花时间来解决了. 执行explain之后的截图如下: 可以看到p ...

最新文章

  1. 少侠,找个千手观音来帮你营销可好?
  2. 用Python爬取b站弹幕,看大家还会接受《爱情公寓5》吗?
  3. TFLearn 在给定模型精度时候提前终止训练
  4. python各个解释器的用途-常用的五种Python解释器|老男孩网络Python学习课程
  5. 聊聊JvmGcMetrics的managementExtensionsPresent
  6. php网站实施说明书_PHP中$_SERVER使用说明
  7. 【5分钟系列】搭建基于docker环境搭建下springboot-mysql项目框架
  8. Java多线程(5)--线程通信wait和notify
  9. Linux Shell脚本专栏_自动发布Java项目(tomcat)_10
  10. Docker 命令详解(run篇)
  11. 【XML】XML实例模板
  12. 注意满足循环终止条件时counter是否仍在+1(记洛谷P1035WA的经历,Java语言描述)
  13. javascript判断是否手机设备+滑动事件
  14. 怎样才能减少汽车油耗呢?
  15. 基于ZStack构建物联网平台
  16. SPSS 相关分析(图文+数据集)【SPSS 023期】
  17. C程序设计--查找(二分法查找/折半查找)
  18. pix2pixHD总结
  19. 大学生职业生涯规划计划与路径_大学生职业生涯的规划路径
  20. Windows事件ID详细

热门文章

  1. 本地虚拟机中匿名ftp上传文件失败的问题
  2. php----显示中文乱码的问题
  3. javascript操作cookie实例
  4. 2个Python入门级的实战项目
  5. 自身经历解读:2021 校招算法岗, 劝退还是继续
  6. 【收藏】超全整理知识图谱相关学习资料,提供系统化的知识图谱学习路径
  7. 初学者 | 分词的那些事儿
  8. 机器学习基础算法14-波士顿房价预测-ElasticNet模型
  9. 面向对象编程——2.细致了解
  10. 阿里云线上案例分析:网格应用存活状态异常