Android性能优化

1、布局优化

2、内存优化

3、使用各种工具进行分析、优化

1.1、Android UI渲染机制:

人眼所能感觉的流畅画面,需要画面的帧数达到40帧每秒到60帧每秒。在Android中,系统通过VSYNC信号触发对UI的渲染、重绘,其时间间隔是16ms。这个16ms其实就是1000ms中显示60帧画面的单位时间,即1000/60。如果不能再16ms秒内完成绘制,那么就会造成丢帧现象,即当前该重绘的帧被未完成的逻辑阻塞,例如一次绘制任务耗时20ms,那么在16ms系统发出的VSYNC信号就无法绘制,该帧就被丢弃,等待下次信号才开始绘制,导致16*2ms内都显示同一帧画面,这就是画面卡顿的原因。

1.2、避免Overdraw

Overdraw,过度绘制会浪费很多的CPU、GPU资源

        Android系统提供了这样一个检测工具,打开“开发者选项”,打开调试GPU过度绘制。可以通过界面的颜色来判断overdraw的次数。

通过这个工具可以查看当前区域中的绘制次数,从而尽量优化绘图层次,尽量增大蓝色区域,减少红色区域。

1.3、优化布局层级

        在Android中,系统对View进行测量、布局和绘制时,都是通过对View数的遍历进行操作的。如果一个View树的高度太高,就会严重影响测量、布局和绘制的速度,因此优化布局的第一个方法就是降低View树的高度,google也在其api文档中建议View树的高度不宜超过10层。

1.4、避免嵌套过多无用布局

        嵌套的布局会让View树的高度变得越来越高,因此在布局时,需要根据自身布局的特点来选择不同的Layout组件,从而避免通过某一种Layout组件来实现功能时的局限性,从而造成嵌套过多的情况发生。

2.1、什么是内存

       由于Android应用的沙箱机制,每个应用所分配的内存大小是有限度的,内存太低就会触发LMK——Low Memory Killer机制。那么到底什么是内存?通常情况下我们所说的内存是指手机的RAM,它包括以下几个部分。

        寄存器:速度最快的存储场所,因为寄存器位于处理器内部,在程序中无法控制;

        栈:存放基本类型的数据和对下的引用,但对象本身不存放在栈中,而是存放在堆中;

        堆:堆内存用来存放new创建的对象和数组。在堆中分配的内存,由java虚拟器的自动垃圾回收器来管理;

        静态存储区域:静态存储区域就是指固定的位置存放应用程序运行时一直存在的数据,Java在内存中专门划分了一个静态存储区域来管理一些特殊的数据变量,如静态的数据变量;

        常量池:JVM虚拟机必须为每个被装载的类型维护一个常量池子。常量池就是该类型所用到常量的一个有序集合,包括直接常量(基本类型,String)和对其他类型、字段和符合引用。

        在这些概念中最容易搞错的就是堆和栈的区分。当定义一个变量,Java虚拟机就会在栈中为该变量分配内存空间,当该变量的作用域结束后,这部分内存空间会马上被用作新的空间进行分配。如果使用new的方式创建一个变量,那么就会在堆中为这个对象分配内存空间,即使该对象的作用域结束,这部分内存也不会立即被回收,而是等待系统GC进行回收。堆的大小随着手机的不断发展而不断变大。在程序中,可以使用以下代码获得堆的大小,所谓的内存分析,正是分析Heap中的内存状态。

        ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

        int heapSize = manager.getLargeMemoryClass();

2.2、内存优化实例:

        2.2.1:Bitmap优化

        Bitmap是造成内存占用过高甚至是OOM的最大威胁。

        优化技巧:使用适当分辨率和大小的图片;及时回收内存;使用图片缓存,通过内存缓存和磁盘缓存,更好的使用Bitmap。

        2.2.2:代码优化

        任何Java类,都将占用大约500字节的内存空间。创建一个类的实例会消耗约15字节的内存。从代码的实现方式上,可以对内存进行优化。

        对常量使用static修饰符。

        使用静态方法,静态方法比普通方法提高15%左右的访问速度。

        减少不必要的成员变量,如果一个变量可以定义为局部变量,则建议你不要定义为成员变量。

        减少不必要的对象,使用基础类型会比使用对象更加节省资源,同时更应该避免频繁创建短作用域的变量。

        尽量不要使用枚举、少用迭代器。

        对Cursor、Receiver、Sensor、File等对象,要非常注意对它们的创建、回收与注册、解注册。

        避免使用反射,虽然Java反射的效率已经进行了很好的优化,但是大量反射依然会带来性能下降。

        使用RenderScript、OpenGL来进行非常复杂的绘图操作。

        使用SurfaceView来替代View进行大量、频繁的绘图操操作。

        尽量使用视图缓存,而不是每次都执行inflate()方法解析视图。

        

2.3、内存分析工具:

        Android Studio 的Memory Monitor工具

        TraceView工具

        MAT工具

        Dumpsys命令分析系统状态

        adb shell dumpsys activity

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值