Android app性能优化
用Hierarchy Viewer知道是哪一个子View耗时比较多,找到此View的code,那么如何定位到具体某个方法里呢?当然需要traceview工具。Traceview工具十分强大,可以轻松把每个方法占用CPU时间计算出来,找到占用时间最长的方法,然后分析此方法即可。
Lint工具会给出Layout优化提示(既包括图片资源、layout文件,也有定义的String常量和Color常量以及Layout写法不规范),告诉你哪些资源没有被引用,Manifest文件的错误等;我主要用lint来找到哪些资源文件没有被引用到(给APK瘦身),以及部分代码不规范的地方。
布局优化
布局标签:标签,将布局公共部分提取出来;例如网易新闻一条新闻的标题栏和评论界面的标题栏。标签,同include,可引入布局,但是默认情况引入的布局不会占用资源,在解析当前Layout时节省计算、内存资源。当需要加载此View的时候,需要动态inflate起来。标签,解决Layout嵌套过多的问题,通过工具hierarchy viewer可直观的现实出来。
减少inflate次数:inflate是比较耗费资源的,当内存够用时,可以讲View缓存起来,下次直接使用;用空间换时间。
代码Tips
1)关于缓存:DiskLruCache是关于数据硬盘缓存的。
2)避免随意使用静态变量:当某个对象被定义为static变量所引用,虚拟机通常是不会回收这个对象所占有的内存。
3)多使用局部变量。函数执行完,酒释放内存被虚拟机回收。
4)使用StringBuilding和StringBuffer进行字符串连接
5)单线程应尽量使用HashMap,ArrayList,如果不确定是单线程还是多线程,建议还是用ConcurrentHashMap…
6)尽量在finally块中释放资源,例如很多cursor。
7)慎用异常,创建一个异常时,需要收集一个栈记录,用于描述异常是在何时创建的。构建这些栈时需要为运行时栈做一份快照,这一部分开销很大。
View绘制
过度绘制:多个View重绘,复杂Layout叠加;导致GPU需要绘制多层,有些时候非常耗时。
一些复杂的View,如果每次View有局部更新都要重新绘制View的话,GPU会显得力不重新。通过canvas.clipRect()方法来让系统识别可绘制区域。这个方法可以指定一块矩形区域,只有在这个区域内才会被绘制,其他区域会被忽视。ClipRect方法节约了CPU和GPU资源,不会绘制clipRect区域外的地方,仅仅绘制内容在区域内的组件。
总结
出现卡顿的根本原因:系统绘制View超过16ms,出现掉帧才导致或不流畅。解决方法:
• Hierarchy View,Profile GPU rendering,traceview
• 抽象布局标签,使用标签include、viewstub、merge
• 多使用缓存
• 尽量避免过度绘制
• 自定义复杂View,动态更新View内容
• 正确使用wakelock,保持app用电量。
android性能优化
最新推荐文章于 2024-08-14 20:01:35 发布