一、布局优化
- ui渲染机制:Android系统通过VSYNC信号触发对UI的渲染,重绘,时间间隔是16ms,如果系统每次渲染的时间都保持在16ms之内,我们看到的UI效果就是流畅的,否则就会出现卡顿。
- 避免过度绘制:可以通过开发者选项中的Enable GPU Overdraw来判断是否有过度绘制的UI,如图,尽量减少红色区域
- 优化布局层级:Android系统对View的测量,布局和绘制时,都是通过View的数量的遍历来操作的,如果View的高度太高,就会严重影响测量,布局和绘制的速度。
- 避免嵌套过多的无用布局,嵌套布局会增加View树的高度。
- 使用复用布局,将使用频率大的布局抽取出来单独成一个布局,以后使用只要include进去就行
- 使用 实现布局延迟加载,试过这个标签的布局,初始化的时候该布局不会显示,只有在代码中使用findViewById找到view然后Visiable后才会显示,或者使用inflate填充让该布局显示
- 使用HierarchyViewer优化布局,使用之后可快速找到冗余的布局,如果手机上无法使用HierarchyViewer,可以下载View Server,通过这个程序可以让普通手机能使用HierarchyViewer,下载地址:[www.github.com/romainguy/ViewServer]
二、内存优化
- 我们通常说的内存优化一般是优化RAM,他包含寄存器,堆,栈,静态存储区域,常量池,当定义了一个变量,java虚拟机就会在栈中分配内存空间,当该变量作用域结束后,这部分内存就会马上被用作新的空间进行分配,如果使用new 的方式创建一个变量,那么就会在堆中为这个对象分配内存空间,即使该对象的作用域结束,这部分内存也不会立即被回收,而是等待系统GC回收,平时所说的内存分析就是Heap堆内存的状态,获取堆内存大小的代码如下:`ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);int heapSize = manager.getLargeMemoryClass();
- 内存回收,Java创建了GC系统来自动进行资源的管理,大大降低程序开发人员的对内存管理的繁琐工作。但是缺点是,JVM虽然能够自动GC,但是,如果有些内存不能及时GC,就会导致内存泄露
- Bitmap优化:使用适当分辨率大小的图片,在适当的时候显示合适大小的图片,比如,在看图片列表的时候只显示缩略图thumbnails,而点击查看大图的时候再显示原图,在对图像要求不高的地方,降低图片的精度。同时,一旦使用完bitmap后,要及时调用bitmap.recycle()释放内存,最后,还可以通过内存缓存和硬盘缓存更好的处理bitmap
代码优化:
a.对常量使用static修饰,
b.使用静态方法可以提高15%左右访问速度
c.减少不必要的成员变量,如果一个变量可以定义为局部变量,就不要定义为成员变量,
e.尽量不要使用枚举,少用迭代器,
f.对Cursor、receiver、Sensor、File等对象,要注意他们的创建回收和注册,
g.避免使用IOC框架,IOC框架一般用反射来进行实现,大量反射会降低性能,
h.使用RenderScript、OpenGL来进行非复杂的绘图操作,
i.使用surfaceView代替View进行大量频繁的绘图操作,
j.尽量使用视图缓存,而不是每次都执行inflate()方法解析视图Android Lint工具是AS集成的一个Android代码提示工具,他可以对你的布局,代码提供非常强大的帮助,平时养成使用lint的习惯
- 使用AS自带的Memory Monitor工具分析内存,如图蓝色部分代表free内存,深色部分可以判断内存的使用状态,比如内存持续增高时,可能发生内存泄露,内存突然减少时,发生GC等
使用可视化性能调查工具,TraceView优化APP性能,生成Traceview日志有两种方法,一个是利用Debug类帮助生成日志,另一个是使用Android Device Monitor工具辅助生成日志。
(1)使用debug类的方法开启TraceView监听,可以在生命周期的Oncreate()中通过Debug.startMethodTracing()方法来开启监听,在Ondestory()中通过Debug.stopMethodTracing()停止监听,
(2)通过Android Device Monitor生成TraceView日志,打开AS的Android Device Monitor工具,选择要调试的进程,点击工具栏中的start method prifiling按钮,点击后,选择监听模式
停止监听后界面会自动显示监听到的结果,如下图
上面部分的黑色条纹的是时间轴区域,不同的色块,代表不同的执行方法,色块的长度代表方法执行的时间
下部分Name框以内的为Profile区域,主要显示了对应色块所处时间段内的性能分析
每个时间都包含两列,一个是实际的时间,一个是占的百分比,分析的时候,通常从Incl Cpu Time和Calls +RecurCalls开始进行分析,对占用时间长的方法进行重点分析,如果占用时间长,Calls+RecurCalls次数少,那么就是值得分析的对象了Mat工具也是一个分析内存的很不错的助力,具体使用以后再做详细介绍