【Android性能优化】归纳总结

Android如今已经成为当今世界用户率最高的手机系统,但是也有他特有的局限和缺点,开源带来的各种安全问题,使用寿命短的问题也一直困恼着我们

Android手机寿命大多在2年左右,使用时间越久手机反应会越慢,电磁会更容易发热,直至你忍受不了换新手机

那么,是什么导致Android手机使用寿命短暂的呢?

网络上有很多这方面的文章,我这里做一下总结归纳,以便于自己理解和方便后期翻阅,还是那句话,“好记性不如烂笔头”!

 

Android性能我分了几个部份来总结:

  • APP部份

我们的手机中会安装有各种各样的APP,有些APP在研发的时候由于开发者的经验,习惯等各种因素,运行久了就会变得越来越慢,甚至极大的增加你手机的耗电

所以,作为一个开发者有必要对性能这块深入了解,研发出来的APP更加安全,体验更流畅,耗电低,流量低。

APP部分是个人开发者研发APP时,需要注意以下几个方面

    一.  UI绘制

U界面布局是我们大多都会忽略的问题,在开发中往往是怎么方便怎么来,其实复杂的布局会大大降低APP的效率,反应速度,之所以会如此,我们先要了解android的渲染机制

android的界面绘制需要通过测量(measure),布局(layout),绘制(draw)后产生surface缓存数据,通过surfaceflinger把数据渲染到屏幕上,应用层负责刷新数据,通过进程间通信传送到系统层进行渲染。

这里我们需要了解一下FPS:表示每秒传递的帧数,理想情况下,在60 FPS不会感觉到卡顿,这就是说需要在最多16ms刷新一帧数据才能使渲染流畅,如果帧数据刷新过慢,比如24ms刷新一帧,那么我们就会感觉到画面不流畅卡顿等现象,比如常见的listview刷新。

所以,如果你的布局文件叠层太多,逻辑复杂,无法再16ms绘制完成,就会带来这种问题,必须要做优化。

绘制优化方法:

1,不要在主线程进行大数据访问,高消耗操作,比如访问网络,读写文件IO操作,将其放在子线程中处理,比如使用Thread,HandlerThread,AsyncTask,RxJava

2,Fragment布局可以换成merge,可以避免自己的帧布局跟系统的ContentFragmentLayout帧布局重叠超成重复计算

3,布局时尽量减少UI层次,减少不必要的嵌套,可以使用Heirarchy Viewer工具来检测,后面会详细讲解

4,提高显示速度,勇士ViewStub,当加载时才会占用,不加载时就是隐藏,仅占用位置

5,尽量多使用LinearLayout和RelativeLayout不要使用绝对布局AbsoluteLayout,在View层级相同的情况下,尽量使用LinearLayout,而不是RelativeLayout,因为前者只绘制一次,后者会绘制两次

6,LinearLayout尽量不要使用layout_weight属性,因为他会使LinearLayout绘制两次,在ListView和GridView尤其重要

7,删除控件中无用的属性,去除没必要背景颜色设置(background)

8,布局复用,比如listview中

9,自定义View优化:使用canvas.clipRect()来帮助系统识别可见区域,只有这个区域才绘制,避免过度绘制

10,避免UI过度绘制,同区域层叠太多,可以打开,开发者选项中-显示过度绘制区域功能来观察,后面我们会详细讲解

11,合理减少刷新次数

    二.  数据处理

数据处理是指那些运行时间长,消耗内存资源大的操作,比如访问网络,IO操作,Bitmap图像处理等

如果将这些操作放置在主线程中处理,那么会使得主线程阻塞,会导致APP反应慢,体验差,ANR异常的情况,所以我们要将这些放在子线程处理

一般是使用Handler和Thread处理,但是这种处理交互太麻烦,代码量也大,可读性也太差,这里介绍几种别的方式

1,使用HandlerThread,android内部封装的类,将Handler,Thread进行了合并

2,使用AsyncTask

3,使用RxJava框架,一种很方便的异步线程框架,能大大精简你的代码,优化你的代码结构

4,使用Glide框架进行图片加载

5,使用RxJava+Retrofit+OkHttp进行网络请求异步处理

6,使用Service服务处理复杂逻辑

    三.  内存泄漏

内存泄漏是有由于我们在编写代码的时候不注意,导致Java的垃圾回收机制无法及时回收到对应的无用对象,造成资源浪费,内存消耗达到一定值时产生OOM异常

总结归纳了一下,一般有以下几种情况的需要特别注意

1,单例对象引用Context,此处在Activity销毁时由于由于单例对象还持有Activity的引用,导致Activity无法销毁,解决办法是在单例对象中引用Context.getApplicationContext(),因为此Context是与整个应用生命周期相同的

2,内部类引用外部对象,我们知道一个类的内部类(匿名内部类)初始化时会默认持有他的外部类对象引用,此时外部类对象就会很难被回收,所以需要格外注意此种情况,解决办法可以改为静态内部类

3,Handler中引用外部对象,此种方式与内部类相似,解决办法在onDestory中removeCallbacksAndMessages(null),或者使用WakeReference弱引用

4,短时间内大量创建对象,造成内存抖动,浪费资源

5,静态变量和对象没有及时置空

6,列表中进行Bitmap图像处理

    四.  APP包大小

功能的增多会使得包的大小越来越大,应用安装包越大,下载门槛越高,特别是在移动网络情况下,用户下载时对包大小要求更高。减小安装包的大小能够让更多的用户愿意下载和体验你的APP,所以我们要想办法尽量减小安装包的大小

1,图片资源优化,只使用一套高分辨率的图片,不用再区分mdpi,hdpi,xhdpi,xxdpi

2,单色图片尽量使用.9图片

3,对要求不高的大图片的进行压缩处理

4,图片使用WebP(https://developers.google.com/speed/webp/)的格式(Facebook、腾讯、淘宝在用。)缺点:加载相比于PNG要慢很多。 但是配置比较高。工具:http://isparta.github.io/

5,代码优化,移除无用的依赖库

6,使用压缩的音视频文件,比如采用opus、mp3等格式,但是最好不要使用无损压缩的音乐格式

7,对TTF文字文件进行压缩,可以采用FontCreator工具只提取出你需要的文字。比如在做日期显示时,其实只需要数字字体,但是使用原有的字体库可能需要10MB大小,如果只是把你需要的字体提取出来生成的字体文件只有10KB

8,使用proGuard 代码混淆器工具,它包括压缩、优化、混淆等功能

9,7z极限压缩,具体请参考<微信的安接包压缩>

  • 系统定制部份优化

Android本身是开源,很多的厂家可以基于其做二次开发,如:华为,小米,OPPO,VIVO,三星。机器的硬件设备,价格,性能,外形都是吸引消费者的砝码,在系统层面上对整个系统做优化性能处理,可以更大提升品牌的竞争力

1,作为开发者上面讲述的APP的性能优化同样在系统这里也需要注意

2,减少开机启动的应用,提升开机启动速度

3,调整虚拟机堆大小参数,dalvik.vm.heapstartsize, dalvik.vm.heapgrowthlimit, dalvik.vm.heapsize分别为虚拟机初始堆大小,极限堆大小,使用大堆时的极限堆大小。这些参数与应用的启动速度相关,也会影响应用所能使用的虚拟地址空间大小,但是却与物理内存无关(这里大概提一下,有兴趣的可以去深入了解)

4,合理修改LowMemoryKiller的值,物理内存不足时,通过adj,minfree等参数对不同级别进程发起回收,保存在2个文件之中,分别是/sys/module/lowmemorykiller/parameters/adj与/sys/module/lowmemorykiller/parameters/minfree。adj保存着当前系统杀进程的等级,minfree则是保存着对应的阈值,修改阈值对系统可运行的进程数量和可用物理内存适量配置,更大提升系统运行效率

  • 功耗优化

移动设备中电池的重要性不言而喻,没有点什么也干不了,对于厂商来说低耗电一直是其需要突破的光卡并以此来提升品牌的实力,对于一款应用耗电量太大会直接导致被卸载,因此需要尽量减少耗电量

1,合理使用wake_lock锁,顾名思义就是休眠锁,持有此锁系统不会进入休眠状态,耗电量也就会增大,合理的使用wake_lock也就非常重要了

2,集中处理,有些不是很及时的操作可以放在充电时处理

3,计算优化,避开浮点运算等

4,数据网络传输时,尽量压缩数据后再传输,建议使用FlatBuffer序列化技术,这个比Json效率高很多陪

  • 工具使用

性能问题容易出现,不好分析,需要借助一些调试工具

1,开发者选项-GPU渲染模式分析

上图中绿色线代表16sm,要确保1s内60帧,你需要保证每一帧都在绿线之下

蓝色柱状图代表测量绘制时间,很高时表示你的视图重新绘制了,或者绘制比较复杂

红色柱状图代表GPU渲染时间,很高时罪魁祸首往往就是那些复杂的自定义View

橙色柱状图代表处理时间,CPU会告诉GPU渲染一帧的地方,这是一个线程阻塞调用,CPU会一直等待GPU接到命令的回复,如果柱状图很高,表示太多的视图需要GPU去渲染

总之,保持画面的流畅就需要让这些柱状保持在绿线之下

 

2,开发者选项-GPU过度绘制检测

原色:没有过度绘制,蓝色:1次过度绘制,绿色:2次过度绘制,粉色:3次过度绘制,红色:4次及以上过度绘制

3,Heirarchy View可以化布局调试工具

4,Memory Analyzer Tool(MAT)功能丰富的 Java Heap 分析工具

5,Battery Historian Google 提供的 Android 系统电量分析工具,是一款图形化数据分析工具

 

先总结到这里,后续有知识更新了继续补充,也欢迎大家留言补充,最后,与君共勉。。。

 

  Android源码 权限验证分析(一)

【Android日志分析】EventLog

【Android性能优化】启动速度优化

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值