安卓应用性能调试和优化经验分享

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

一、主观体验数据库

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

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

二、资源消耗网络

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

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

三、应用质量工具

应用质量主要是对应用过分绘制和内存泄露的状况做出要求,规定应用不能存在过分绘制和内存泄露。oop

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

性能调试方法

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

一、Strict Mode

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

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

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

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

当咱们碰到违规的行为时,该如何进行治理呢?建议将文件操做放到工做线程去完成,若是在主线程上说起操做,建议使用Apply和Commit去完成。若是存在对象未关闭的状况,能够经过对应的StackTrace进行关闭。

二、OverDraw DeBugger

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

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

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

三、Profile GPU Rendering

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

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

四、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时间的总和。

五、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未能唤醒,帮助完成系统任务。

性能优化建议

一、避免内存泄露

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

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

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

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

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

Android系统中正常状况下全部onXXX类函数均运行在主线程中。

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

四、合理使用系统资源

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

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

相关文章
相关标签/搜索