Android性能优化总结

前言

在Android进阶之路上, 性能优化是一个绕不开的问题。这部分内容非常考验程序员的内功和项目经验,必须要对Android各功能模块原理和Android系统有个比较全面的了解才能做好这个工作。

本人在前段时间的工作中做过一些优化,现在把这部分内容做个简单的总结,分享给大家。由于时间关系,先简单总结一下,至于各部分的细节,后面再写吧。

我的优化工作主要包含了以下部分:UI优化内存优化apk优化网络优化、多线程、数据存储优化

性能优化.png

一、UI优化

关于UI优化,其实主要是UI卡顿的优化。卡顿本质:Android系统大概每隔16ms会做一次屏幕刷新,如果一次UI渲染不能在这个时间范围内完成,那么将会出现丢帧的现象,从而产生卡顿。

面试官:说说Android的UI刷新机制?
Android 屏幕刷新机制
Android进阶——性能优化之布局渲染原理和底层机制机详解及卡顿根源探究(四)

如果面试问了UI卡顿相关的问题,虽然会要求你说一些导致卡顿的原因(过度绘制、布局嵌套太深等),但这只是表象,有经验的面试官可能更多的是想听你讲一下Android屏幕渲染机制,所以这里简单说一下屏幕渲染,更详细的内容可以参考上面几篇文章。

Android屏幕刷新机制简介

首先屏幕系统主要包括CPU、GPU、屏幕显示器三个部分,CPU(中央处理器)主要负责数据计算,GPU(图像处理器)负责图片渲染,屏幕显示器负责最后的显示。Android中的UI绘制逻辑大概是:CPU负责View树的遍历(measure、layout、draw),然后把计算好的数据交给GPU,告诉GPU在屏幕什么位置如何绘制图形,GPU对数据渲染,渲染好后放到buffer里存起来,交给显示器,显示器负责把buffer里面的数据显示到屏幕上。

注意:我们常说的 Android 每隔 16ms 刷新一次屏幕其实是指:底层以固定的频率,比如每 16ms 将 buffer 里的屏幕数据显示出来。但是这不代表就一定会去执行onDraw()方法,onDraw()方法必须要主动触发才会执行,如果没有的话,当下一次刷新信号来临的时候,显示器就拿着buffer里面旧的数据去显示,而不是说去执行View树的重绘。

1.1 View过度绘制

View过度绘制,是指某些像素在同一帧时间内被绘制多次,从而使CPU或GPU负载过重。这个问题很常见,在布局的ViewGroup嵌套中,稍不注意就出现这种问题,检测的话可以打开守旧开发者选项-->Show GPU Overdraw查看。如果出现红色的尽量优化一下,一般不是太深的话不会卡顿的。

1.2 布局嵌套层级太深,无法在16ms内完成渲染

Android的渲染机制还是比较复杂的,但是应用层来说,主要是measure -->layout--->draw流程。UI绘制实际上是遍历View树,View树层级越深,测量布局耗费的时间就越长,那留给draw的时间就可能不够,自然就会出现丢帧卡顿。

建议:
1、尽可能用扁平化的布局ConstraintLayout;
了解使用 ConstraintLayout 的性能优势
2、合理利用includemerge来减少布局层次

1.3 刷新不合理

建议:减少刷新次数、缩小刷新区域;

1.4 频繁触发measure、layout、draw

浪费CPU、GPU

1.5 主线程做了稍微耗时的操作

比如说读取一下SharedPreference、json反序列化,读取一下文件这些,如果累加时间多了也会丢帧。

1.6 GC频繁

短期内大量垃圾对象的创建、回收会导致频繁gc,主要是循环里面创建对象会导致这种现象,还有一种情况,在自定义view的onDraw()方法创建大量对象,如果onDraw()调用频率很快,和循环没什么区别,在里面创建很多对象,就会发生短时间内大量对象创建并释放,于是频繁GC就发生了,内存抖动了,卡了。

Android性能优化-检测App卡顿

二、内存优化

内存优化主要是:内存泄漏、内存抖动、OOM问题。

2.1 内存泄漏

android上的内存泄漏主要是堆内存的泄漏,最常见的就是Activity泄漏。
原因:

  • jvm角度而言,主要是堆内存泄漏,分配出去堆内存没有及时回收导致;
  • 代码角度而言,不再使用的对象被其它对象所引用,导致它无法及时回收。

案例:

  • 非静态内部类、匿名内部类 Handler、Thread、AsyncTask
  • 单例模式传入Activity对象
  • 观察者模式注册之后,退出页面时没有及时取消观察
  • 资源性对象未关闭,Cursor、File等
  • WebView泄漏,放在单独进程
  • Bitmap没有及时回收,最好放在池子

分析工具
Android Studio Profile 、LeakCanary

解决思路
了解对象的gc引用链,在恰当的时机断开引用关系就可以让对象正常回收。

2.2 内存抖动

短时间内大量对象创建并释放,主要是循环里面创建大量对象,会导致频繁GC,然后内存抖动了。

2.3 OOM问题

APP启动进程之后会分配一定的内存空间,每个手机大小不同,如果程序运营期间申请的内存没有及时释放,堆积的越来越多,最好超出这个阀值就会oom,常见的有加载大图,内存泄漏导致。

常见的有:

  • 加载大图,长图;需要对bitmap压缩之后再显示,可以参考一下二次采样;
  • 资源对象使用完了没有及时回收,内存堆积也会oom;
  • 内存泄漏最严重的结果就是oom

Android避免OOM(内存优化)
深入探索 Android 内存优化(炼狱级别)

apk优化

  • res资源优化
    1、只用一套高清的图片;
    2、使用svg图片节省空间,用于小图标;
    3、使用webP图片;
    4、如果有大量的drawable.xml设置view背景,考虑用代码封装Drawable实现
    5、用Lint工具删除无用资源

  • 代码优化
    1、使用proGuard 代码混淆工具;
    2、避免引入重复的三方库;
    3、so文件只用必须的版本

Android性能优化之APK瘦身详解(瘦身73%)
深入探索 Android 包体积优化(匠心制作一)

网络优化

  • 连接复用:节省连接建立时间,如开启 keep-alive。

  • 合并请求

  • 减少传输数据的大小:对于post请求,body可以做gzip压缩的,header也可以做数据压缩。返回数据的body也可以做gzip压缩,

  • 异常拦截优化:请求失败、解析异常

  • 断点续传、分片传输、失败重连、Protocol Buffer

总结

app性能优化是一个持续总结、提升的过程;做的事情很多,但是效果不一定很明显,但你仍然需要在项目中重视此类问题。后面会持续更新

参考:

https://wetest.qq.com/lab/view/390.html
https://blog.csdn.net/huangxiaoguo1/article/details/80434456
https://segmentfault.com/a/1190000015219959
https://www.jianshu.com/p/d71b51a0e29f

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容