Android性能优化学习

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

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

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

  • System Trace

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

打开的效果如下图:
  

在代码中打点方式如下

  • 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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Android 性能优化之工具和优化点总结的更多相关文章

  1. 【Java/Android性能优3】Android性能调优工具TraceView使用介绍

    本文转自:http://blog.csdn.net/innost/article/details/9008691 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是 ...

  2. 【Java/Android性能优2】Android性能调优工具TraceView介绍

    本文参考:http://www.trinea.cn/android/android-traceview/ Android自带的TraceView堪比java的性能调优工具visualvm线程视图,可以 ...

  3. Android性能检测--traceview工具各个参数的意思

    Android性能检测 traceview的使用方法 1. 把android-sdk-windows\tools路径加到Path当中 2. 编写测试代码: package com.wwj.tracev ...

  4. Android性能分析Systrace工具

    一.概述 保证系统流畅度,也就是保证系统能连续不间断地提供每秒60帧的运行状态.当出现掉帧时(也可称为Jank),需要知道当前整个系统所处的状态,systrace便是最佳的选择,它能手机检测Andro ...

  5. Android性能測试 一些适用于Android Studio的代码审查和性能測试工具

    导言: Android应用在CPU占用,内存消耗方面的性能指标是影响产品质量的重要因素,因为QQ管家,360手机助手等应用都提供直观的内存消耗,流量监控功能,致使用户比以往更加关注软件的性能,并以此进 ...

  6. Linux/Android 性能优化工具 perf

    /***************************************************************************** * Linux/Android 性能优化工 ...

  7. Android 性能优化 五 性能分析工具dumpsys的使用

    Android提供的dumpsys工具能够用于查看感兴趣的系统服务信息与状态,手机连接电脑后能够直接命令行运行adb shell dumpsys 查看全部支持的Service可是这样输出的太多,能够通 ...

  8. (转)Android性能优化——工具篇

    Android性能优化是Android开发中经常遇见的一个问题,接下来将对Android性能优化方面的知识点做一个简单的梳理和总结,将从工具和代码两方面进行梳理.所谓工欲善其事必先利其器,本文首先来看 ...

  9. 【腾讯Bugly干货分享】Android性能优化典范——第6季

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d91208d80e49771f0a07c 导语 这里是Android性能优 ...

随机推荐

  1. 浅谈Java的主要学习要点_上海尚学堂java培训课程思维导图

    Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算机.移动电话和互联网,同时拥 ...

  2. 导出excel表格,前端和后台导出

    问题:项目框架中导出不知道有什么限制,数据稍微大点导出不了,向上面请求解决,结果一圈推下来又推回来了,所以决定自己写,参考了网上很多大神的博客,开始试了前端导出,想着比较简单,但是乱码问题始终解决不了 ...

  3. [Swift]LeetCode476. 数字的补数 | Number Complement

    Given a positive integer, output its complement number. The complement strategy is to flip the bits ...

  4. Json数组转换字符串、字符串转换原数组......

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. mac缺少librt问题记录

    在mac下编译一个程序的时候遇到错误 ld: library not found for -lrt librt.so主要是glibc对real-time部分的支持.所以一般含有#include< ...

  6. 『字典树 trie』

    字典树 (trie) 字典树,又名\(trie\)树,是一种用于实现字符串快速检索的树形数据结构.核心思想为利用若干字符串的公共前缀来节约储存空间以及实现快速检索. \(trie\)树可以在\(O(( ...

  7. 实现无缝兼容ajax/websocket网页应用和服务

    为了让用户体验更好,页面前端往往是通过ajax来进行数据处理:由于浏览器的设计原因每个域名下的连接有限,这样导致了同时进行ajax数据请求效率无法得到有效地提升,为了提高效率和传统HTTP协议上的限制 ...

  8. 【Python3爬虫】12306爬虫

    此次要实现的目标是登录12306网站和查看火车票信息. 具体步骤 一.登录 登录功能是通过使用selenium实现的,用到了超级鹰来识别验证码.没有超级鹰账号的先注册一个账号,充值一点题分,然后把下载 ...

  9. AR增强现实开发介绍

    AR增强现实开发介绍 ---理论篇 ​ AR增强现实开发最近做一些AR增强现实的内容,一些普及性的内容,与大家分享. 一: 什么是AR增强现实技术: 是一种将真实世界信息和虚拟世界信息“无缝”集成的新 ...

  10. centos7忘记root密码

    开机时狂点方向键下(Windows还原习惯了),或者狂点别的键.目的为了不让它进入系统. 方向键移动光标定位在第一行,按e编辑它. 在新界面找到linux16开头的行.→光标到  ro    改成rw ...