又到周六了,鸿洋的不定期的周六放送又来了~~这次来谈谈性能优化吧。大家在工作中或多或少都会拿自家的应用和竞品app做比对,不可避免的需要做一些app性能优化的活。很多时候可能是策略上的调整,不过还是有非常多的通用的方式。

一般情况下,我们谈性能优化基本上会从以下几个方面:

  • App启动速度优化

  • UI流畅度优化

  • 内存优化

  • apk瘦身

  • 电量优化

还有些网络速度优化、以及特定类型app的一些针对性的优化,比如播放器起播速度等...

我们重点谈论上面5个方面。

性能优化正常的流程是,发现自己某方面与竞品差距比较大,比如UI渲染速度,需要通过某种方式去发现为什么比别人慢,往往需要利用一些工具,然后可以做一些针对性的调优(代码优化、实现方式改变等),当然了在调优的过程中会有一些通用性的调优方式可以帮助你。

所以本文从共性的角度来看,主要介绍的就是针对以上5个方面的检测工具以及调优方式了。

1App启动速度优化

对于App启动速度优化,一般情况下我们会利用主题去防止出现白屏;针对启动速度慢,需要尽可能减少Application的onCreate中所要做的事情,比如一些不重要的SDK延迟或者异步加载;多进程情况下一定要可以在onCreate中去区分进程做一些初始化工作;部分将要使用到的类异步加载;还有针对multidex专门做优化的(当然这个随着5.0以上的设备越来越多,影响倒是没有那么大了)。

下面针对各个方面推荐一些文章:

  • Android性能优化(一)之启动加速35%

http://www.jianshu.com/p/f5514b1a826c

  • Android冷启动白屏解析,带你一步步分析和解决问题

http://blog.csdn.net/guolin_blog/article/details/51019856

  • Android APP启动优化

http://wuxiaolong.me/2017/03/13/appStart/

  • App启动速度优化之耗时检测处理

http://www.jianshu.com/p/a0e242d57360

上面几篇文章基本上描述了应用的启动流程,如何优化白屏,以及一些SDK的懒加载等等...

  • 美团Android DEX自动拆包及动态加载简介

https://tech.meituan.com/mt-android-auto-split-dex.html

  • Android MultiDex初次启动APP优化

http://blog.csdn.net/synaric/article/details/53540760

  • 其实你不知道MultiDex到底有多坑

http://t.cn/RjjhD95

这3篇可以帮助你对multidex做一定的了解,以及提供了优化方案供参考。

当然了,在检测启动优化上,除了利用adb命令去检测总时间,还有就是去发现耗时的方法,可以利用TraceView,或者打开StrictMode,如果你喜欢使用Log,还可以去使用hugo,或者自己写一个类似的AOP日志框架。

关于TraceView的使用可以参考:

  • TraceView 简介及其案例实战

https://www.cnblogs.com/sunzn/p/3192231.html

  • 使用 TraceView 找到卡顿的元凶

http://blog.csdn.net/u011240877/article/details/54347396

  • Android App优化之提升你的App启动速度之实例挑战

http://www.jianshu.com/p/4f10c9a10ac9

StrictMode比较简单,就不描述了,hugo是Jake大神的一个开源库,主要是利用aspectJ,源码很少,也比较简单,不过使用起来还不错,直接看readme就够了,感兴趣可以看下~

  • https://github.com/JakeWharton/hugo

2UI流畅度优化

谈到UI流畅度,一般就是不要在主进程去做耗时的操作,提升UI的绘制速度(减少View的布局层级,避免过渡绘制等)...TraceView、Lint、Hugo、StrictMode等...

这里很容易想起Google在15年初google发布了Android性能优化典范,还好视频还被我找到了,文末有下载...

对于优化方案可参考:

  • Android性能优化(二)之布局优化面面观

http://www.jianshu.com/p/4f44a178c547

  • Android UI性能优化实战 识别绘制中的性能问题

http://blog.csdn.net/lmj623565791/article/details/45556391/

  • 性能优化之布局优化

http://www.trinea.cn/android/layout-performance/

  • Android性能调优

http://www.trinea.cn/android/android-performance-demo/

当然了对于UI卡顿,不可避免的要引入检测的方案:

  1. 一般有监听Looper的日志

  2. 利用Choreographer

可参考我之前编写的:

当然也相应的有一些开源工具:

  • https://github.com/markzhai/AndroidPerformanceMonitor [方式1]

  • https://github.com/wasabeef/Takt [方式2]

  • https://github.com/friendlyrobotnyc/TinyDancer [方式2]

3内存优化

内存优化那么主要就是去消除应用中的内存泄露、避免内存抖动;常用工具就是AS自带的内存检测,可以很好的发现内存抖动;leakcanary可以非常方便的帮助我们发现内存泄露;MAT可以做更多的内存分析。

当然了,你还可以了解一些内存相关的基础知识。

  • Android性能优化(三)之内存管理

http://www.jianshu.com/p/c4b283848970

  • Android性能优化第(二)篇---Memory Monitor检测内存泄露

http://www.jianshu.com/p/ef9081050f5c

  • 内存泄露实例分析 -- Android内存优化第四弹

http://www.jianshu.com/p/cbe2ee08ca02

  • Android最佳性能实践(一)——合理管理内存

http://blog.csdn.net/guolin_blog/article/details/42238627

  • Android最佳性能实践(二)——分析内存的使用情况

http://blog.csdn.net/guolin_blog/article/details/42238633

https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ

  • Android内存优化之OOM

http://hukai.me/android-performance-oom/

  • Android应用内存泄露分析、改善经验总结

https://zhuanlan.zhihu.com/p/20831913

  • 内存泄露从入门到精通三部曲之基础知识篇

http://dev.qq.com/topic/59152c9029d8be2a14b64dae

  • 内存泄露从入门到精通三部曲之排查方法篇

http://dev.qq.com/topic/591522d9142eee2b6b9735a2

4apk瘦身

关于Apk瘦身,主要由以下几个方式:

  1. 利用ProGuard压缩代码去除无用资源

  2. andresguard进一步压缩与混淆资源

  3. 第三方开源库的瘦身,仅保留自己需要的部分

  4. 极致的图片压缩与webp的使用

  5. 合理配置去除不必要的配置,仅保留中文配置等...

  6. so的优化与配置,只保留一类so

  7. 动态下发一些资源:字库、so、换肤包等;

以上仅有7比较麻烦,需要服务端的配合,此外对于动态下发So,可以参考tinker对So热修复部分代码。

其余都是常规方式,且1 ,5,6都比较简单,build.gradle最下配置即可,当然了也有一些参考文章:

  • App瘦身最佳实践

http://www.jianshu.com/p/8f14679809b3#

  • Android APP终极瘦身指南

http://t.cn/RGjNpam

  • Android性能优化(十)之App瘦身攻略

http://www.jianshu.com/p/99f3c09982d4

  • [Android技术专题]APK瘦身看这一篇文章就够了

http://www.jianshu.com/p/6be4f98162d7

  • 安装包立减1M--微信Android资源混淆打包工具

http://t.cn/RjjVe4f

  • 爱奇艺Android移动客户端app瘦身经验

http://t.cn/RjjfzrY

5电量优化

电量优化说实在的关注度较低,一般情况就是合理的使用一些传感器、谨慎的使用Wake Lock、减少后台的不要的操作等...检测可以利用battery-historian

  • Android性能优化(九)之不可忽视的电量

http://www.jianshu.com/p/5d83d8649c98

  • Android性能优化之电量篇

http://hukai.me/android-performance-battery/

http://blog.csdn.net/u012124438/article/details/74617649

  • Android App优化之电池省着用

http://www.jianshu.com/p/c55ef05c0047

  • https://github.com/google/battery-historian

好了,大家可以将每个方案的所采用的实际的优化策略记录下来,对每种方式提到的工具一定要自己去体验,用起来肯定不会有多么的困难,实操起来印象会更加深刻。

性能优化并不困难,重要的还是要去实际的去操作一把,基本上也是面试常见的问题了。

最后,好文非常多,本文希望仅起到抛砖引入的效果,感谢所有作者~

想起来了16年MDCC上明云凶做过一个性能优化的分享,所以每次谈到性能优化我都能想到当年演讲的ppt。

这里提供一下该ppt的下载以及Google的性能优化典范视频,链接:https://pan.baidu.com/s/1kVHyCUb,懒得复制的可以公众号内回复1118即可。

对了,腾讯有个非常强大的手机上的“集成调测环境”,就是手机上的软件,可以用于性能检测,叫GT。

http://gt.tencent.com/download.html

Android 性能优化的方面方面都在这儿的更多相关文章

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

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

  2. android 性能优化

    本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...

  3. Android性能优化典范第一季

    2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...

  4. [转]Android性能优化典范

    2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...

  5. [Android Pro] Android性能优化典范第一季

    reference to : http://www.cnblogs.com/hanyonglu/p/4244035.html#undefined 2015年伊始,Google发布了关于Android性 ...

  6. Android性能优化(一)

    Android性能优化典范 1.大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能. 从设计师的角度,他们希望App能够有更多的动画,图片等时尚元素来实现流畅的用户体验. 但是Android ...

  7. Android优化—— Google 发布 Android 性能优化典范

    阅读目录 0)Render Performance 1)Understanding Overdraw 2)Understanding VSYNC 3)Tool:Profile GPU Renderin ...

  8. Android性能优化典范(转)

    转载自oschina. 2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍 ...

  9. Android性能优化典范(二)

    Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...

随机推荐

  1. 配置不同站点不同版本PHP

    Apache 配置 1.常规手动部署apache方法(不会apache配置的请先移步看下Apache基本手工配置方法),解压fcgid,取其mod_fcgid.so至modules目录 2.打开htt ...

  2. 2018青岛网络赛G - Couleur 区间上的启发式合并

    题意:给出\(a[1...n]\),共\(n\)次操作,每次删除一个位置\(p_i\)(强制在线),此时区间会变为两个分离的区间,求每次操作的最大区间逆序对 首先要知道必要的工具,按权值建立的主席树可 ...

  3. ANR机制

    1.什么是ANR(Application Not Responding) 在Android中,应用程序的响应性是由ActivityManager和WindowManager系统服务监视的.当监测到以下 ...

  4. 《Algorithm算法》笔记:元素排序(2)——希尔排序

    <Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...

  5. WPF UpdateSourceTrigger属性

    TextBox中的变化并不是立即传递到源,而是在TextBox失去焦点后,源才更新.这种表现由绑定中的UpdateSourceTrigger属性来控制.它的默认值是Default,源会根据你绑定的属性 ...

  6. C 标准库 - string.h之memcpy使用

    memcpy Copy block of memory Copies the values of num bytes from the location pointed to by source di ...

  7. Flink初始

    flink初始 flink是什么 为什么使用flink flink的基础概念 flink剖析 实例 flink是什么 flink是一个用于有界和无界数据流进行有状态的计算框架. flink提供了不同级 ...

  8. 错误:‘lock_guard’ 在此作用域中尚未声明

    解决:修改报错文件,加入#include <boost/thread/lock_guard.hpp>

  9. String类的substring方法

    下列程序的输出是什么? class A { public static void main(String[] a) {     String v = “base”;      v.concat(“ba ...

  10. vim操作命令备忘

    vim操作命令备忘 查找/替换 :%s/keyword//gn //搜索匹配的关键词数量 :%s/keywords/target //替换关键词 待续……