android应用性能优化,Android性能优化实战解析
前言
在Android的高级化道路上,性能优化是不可避免的问题。 这部分内容对程序员的工作和项目经验都是非常考验的,只有对安卓各功能模块的原理和安卓系统有比较全面的了解才能做好这项工作。
我在这期间的工作中做了一些优化,现在把这一部分简单总结一下,分享给大家。 因为时间的关系,先简单总结一下,关于各部分的详细情况,以后再写吧。
我的优化工作主要包括以下部分。 UI优化、内存优化、apk优化、网络优化、多线程、数据存储优化
性能优化. png
一. UI优化
关于UI的优化,其实主要是UI卡顿的优化。 卡顿的本质:安卓系统大约每16ms刷新一次屏幕。 如果一次UI渲染在此时间范围内未完成,则会发生帧丢失现象并发生纸箱。
在面试中,如果你问了关于UI卡顿的问题,你会被要求说明卡顿的原因(过度绘制、布局嵌套太深等),但这只是一个表象,有经验的面试官可能很多人想问安卓的屏幕渲染机制更详细的内容请参照上述文章。
安卓屏幕更新机制综述
首先,屏幕系统主要包括CPU、GPU、屏幕显示器三个部分,CPU (中央处理器)主要负责数据计算,GPU (图像处理器)负责图像绘制,屏幕显示器负责最后的显示。 Android的UI绘制逻辑,大概是由CPU负责扫描视图树(measure、layout、draw ),将计算出的数据传递给GPU,告诉GPU如何在画面的何处绘制图形,GPU将数据
注:常见的Android每16ms刷新一次屏幕实际上是指基础每隔一定的频率(例如16ms )显示一次缓冲区屏幕数据。 但是,这并不一定意味着要执行onDraw (方法。 onDraw )方法必须主动触发才能执行。 否则,下次刷新信号到来时,显示器将显示buffer中的旧数据,而不是执行视图树的重新绘制。
1.1视图过度绘制
“View覆盖”绘画意味着在同一帧时间内多次绘制某个像素,导致CPU或GPU负载过大。 这个问题很常见。 在布局的视图组嵌套中,稍微不注意就会发生这样的问题。 如果检查的话,可以打开守旧开发人员选项--Show GPU Overdraw进行查看。 出现红色的话尽量优化,一般不太深的话就不会卡顿。
1.2布局嵌套级别太深,无法在16ms内完成渲染
虽然Android的渲染机制还很复杂,但对APP应用层来说主要是measure----layout----draw进程。 UI绘制实际上遍历View树。 View树的层次越深,测量布局所需的时间就越长,draw上的时间就越短,框架纸箱就可能自然出现。
建议:
1、尽量按照扁平化的布局进行约束布局
了解使用约束布局的性能优势
2、合理利用include、merge减少布局层次
1.3刷新不合理
建议:减少刷新次数,缩小刷新区域;
1.4经常触发测量、布局和绘制
浪费CPU、GPU
1.5主线程进行了需要一点时间的操作
累积时间越长,例如,SharedPreference、json反序列化和文件读取就会丢失帧。
1.6 GC频繁
短期内创建、回收大量垃圾对象会频繁发生gc。 主要在循环中创建对象时会发生这种现象。 自定义view ondraw ) )方法还可以创建和释放大量对象。 onDraw ) )的调用频率快则与循环相同。 在冒着生命危险的米中创建和释放许多对象时,会在短时间内产生大量对象。 那里频繁发生gc。 存储器
二.内存优化
内存优化主要是内存泄漏、内存抖动和OOM问题。
2.1内存泄漏
android中的内存泄漏主要是堆内存泄漏,最常见的是活动泄漏。
原因:
从jvm的角度看,这主要是因为堆内存泄漏,没有立即回收分配的堆内存。
从代码的角度看,不再使用的对象被其他对象引用,不能立即重用。
案例:
非静态内部类、匿名内部类Handler、Thread、async任务
单实例模式传递给活动对象
观察者模式登录后,结束页面时没有取消观察
资源对象未关闭、Cursor、File等
WebView泄漏,置于其他进程
Bitmap不会马上回收,所以最好放在干净的头发上
分析工具
安卓studio配置文件,LeakCanary
解决想法
了解对象的gc参考链,并在适当的时间断开参考关系即可
以让对象正常回收。2.2 内存抖动
短时间内大量对象创建并释放,主要是循环里面创建大量对象,会导致频繁GC,然后内存抖动了。
2.3 OOM问题
APP启动进程之后会分配一定的内存空间,每个手机大小不同,如果程序运营期间申请的内存没有及时释放,堆积的越来越多,最好超出这个阀值就会oom,常见的有加载大图,内存泄漏导致。
常见的有:
加载大图,长图;需要对bitmap压缩之后再显示,可以参考一下二次采样;
资源对象使用完了没有及时回收,内存堆积也会oom;
内存泄漏最严重的结果就是oom
apk优化
res资源优化
1、只用一套高清的图片;
2、使用svg图片节省空间,用于小图标;
3、使用webP图片;
4、如果有大量的drawable.xml设置view背景,考虑用代码封装Drawable实现
5、用Lint工具删除无用资源
代码优化
1、使用proGuard 代码混淆工具;
2、避免引入重复的三方库;
3、so文件只用必须的版本
网络优化
连接复用:节省连接建立时间,如开启 keep-alive。
合并请求
减少传输数据的大小:对于post请求,body可以做gzip压缩的,header也可以做数据压缩。返回数据的body也可以做gzip压缩,
异常拦截优化:请求失败、解析异常
断点续传、分片传输、失败重连、Protocol Buffer
总结
app性能优化是一个持续总结、提升的过程;做的事情很多,但是效果不一定很明显,但你仍然需要在项目中重视此类问题。后面会持续更新
参考: