Android 性能优化之工具和优化点总结

Android性能优化学习

最近公司主抓性能优化工做,借此春风也学习到了许多Android性能优化方面的知识。因为组内队友的给力,优化的成果也是比较喜人。同时也学习和实践了很多知识,特此记录。html

1.性能优化分析工具学习

在开始代码优化以前,先得学会使用性能分析工具。如下三个工具都是谷歌官方推出的,能够帮助咱们定位分析问题,从而优化咱们的APP。java

  • System Trace

  Systrace是一个收集和检测时间信息的工具, 它能显示CPU和时间被消耗在哪儿了, 每一个进程和线程都在其CPU时间片内作了
  什么事儿. 并且会指示哪一个地方出了问题, 以及给出Fix建议。给出的结果trace文件是以html形式打开的,直接用浏览器打开
  查看十分方便。打开方法:打开DDMS后,链接手机,点击手机上方一排按钮中的SysTrace按钮。android

  打开的效果以下图:
  正则表达式

  在代码中打点方式以下算法

  

  • Hierarchy Viewer

  Hierarchy Viewer提供了一个可视化的界面来观测布局的层级, 让咱们能够优化布局层级, 删除多余的没必要要的View
  层级, 提高布局速度。另外,开发者模式中调试GPU过分绘制选项也能够进行视图层级调试。在SDK-> tools目录下
  打开hierarchyviewer.bat便可。浏览器

  效果以下图:
  
性能优化

  • TraceView

  一个图形化的工具, 用来展现和分析方法的执行时间。也是一款性能优化的神器。能够经过像打log同样的方式去定位代码的执行时
  间,从而能够准肯定位是哪一段代码的执行消耗了太多时间。相比SysTrace,功能更强大,使用起来也更复杂。网络

   

2.布局优化

布局优化相对比较容易,优化能够先从布局来展开。使用Hierarchy Viewer和开发者模式中关于布局绘制的选项,能够查到一些问题而后进行修改。异步

  • 布局嵌套过深 有的时候为了赶进度,布局设计的不是很好。层级嵌套过深的话,深度遍历各个节点会很是消耗时间,这也是布局优化余地最大的一个点了。不少过深的层级是没必要要的。若是布局真的很复杂,不深度嵌套无法实现想要的效果。试试最新的约束布局Constraintlayout吧。没有使用过的话,下面这篇官方文档能够帮助你:
    Constraintlayout官方介绍文档工具

  • 使用合适的布局 三种常见的ViewGroup的绘制速度:FrameLayout > LinerLayout > RelativeLayout。固然,若是用RelativeLayout能够避免布局嵌套的话是值得的。能够根据这些去决定选用什么样的布局。

  • 列表控件优化 不管是ListView仍是RecycleView都有优化点,一个是convertView的复用,一个是ViewHolder的使用避免重复遍历节点。固然这些都是基础中的基础了。若是发现项目中的代码ListView或者RecycleView的使用不规范的话,赶忙进行修改吧。

  • 使用include标签 在布局文件中,<include>标签能够指定插入一段布局文件到当前布局。这样的话既提升了布局复用,也减小了咱们的代码书写。另外,<merge>标签能够和<include>的标签一块儿使用从而减小布局层级。

  • ViewStub延时加载 有些布局,好比网络出错的布局,不必在全部时候都加载出来。使用ViewStub能够实现按需加载。ViewStub自己没有宽高,加载起来几乎不消耗什么资源。当对他setVisibility(View.VISIBLE)的时候会调用它引用的真实布局填充到当前位置,从而实现了延时加载,节省了正常加载的时间。

  • 移除Activity默认背景 只要咱们不须要Activity的默认背景,就能够移除掉,以减小Activity启动时的渲染时间,提高启动效率。移动方法见下:

3.线程优化

线程的建立和销毁会带来比较大的性能开销。所以线程优化也颇有必要。查看项目中是否存在随意new thread,线程缺少管理的状况。使用AsyncTask或者线程池对线程进行管理,能够提高APP的性能。另外,我比较推荐使用Rxjava来实现异步操做,既方便又优雅。

推荐一篇Rxjava的入门文章

4.内存泄露

内存泄露会致使APP占用内存太高,影响效率,严重的话会致使OOM。所以若是项目存在内存泄露的话要优先解决。查找内存泄露能够用LeakCanary等工具,具体怎么解决,有哪些泄露点,之后有时间也写篇总结。

5.算法优化

毋庸置疑,使用合适的算法处理事务能够大幅提高APP的性能。固然算法不是个人强项,也只能给出一些大体的点:查询考虑二分查找节省时间,尽可能不要使用耗时的递归算法。必要的时候能够空间换时间来提升APP运行效率。

6.其余优化点

  • 异步处理耗时任务 在Activity、Fragemnt的onCreate等初始化方法中,若是执行了太耗时的操做(例如读取各类数据),会影响页面的加载速度,让用户以为APP太慢。这时候能够异步处理这些耗时任务,减少应用启动的时候的负担。

  • 替换矢量图 尽管矢量图有诸多优势,但矢量图的绘制是消耗性能的。在应用初始化加载等比较影响用户体验的地方,仍是建议使用Bitmap来代替矢量图,提升APP开启效率。

  • 正则表达式 经小伙伴用TraceView不断的打点发现,正则表达式很是消耗时间。所以尽管正则表达式很是优雅,涉及到性能问题的时候,能够改成其余判断方式来提升APP性能。

  • 浮点类型 在Java中浮点类型的运算大概比整型数据慢两倍,所以整型数据能解决的问题尽可能用整型。

  • 减小冗余log 开发的时候用于调试的log,在项目上线的时候没用的要及时删除。固然有用的log仍是要留下,以便之后分析问题。

  • 删除无用资源 没用用的资源会增大APK大小,既然没有用了,上线的时候固然要及时删除。

  • Lint代码检查 使用Lint等静态代码检查工具能够帮助咱们发现不少隐藏的问题。Lint检查出来的问题越少,说明代码越规范,越不容易出现各类问题,APP性能天然也会提高。

  • 滥用全局广播 全局广播也是十分消耗性能的一个点。对于应用内的通信,使用接口回调,EventBus等手段比起广播是更好地选择。动态注册广播的时候,也不要忘了广播的注销。

7.总结

能够看到除了工具的使用外,性能优化是很考验代码功底的。所以想要作好性能优化,强化基本功不可少。性能优化也是一件相对枯燥而难度大的工做。由于不少优化的努力可能立马看不到效果,或者说优化的成果在数据上难以体现。咱们在作性能优化的时候也遇到果瓶颈,找不到优化方向而感到泄气。可是坚持下来,利用好工具,从各个点去优化,总会有拨开云雾见青天的一天!

做者:业松连接:https://www.jianshu.com/p/31485a3cf5ca來源:简书简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。

相关文章
相关标签/搜索