Android性能优化点
性能优化
ANR
主线程耗时5s
前台service 20s,后台service 200s,IntentService除外
前台广播10s,后台广播60s
SharedPreferences anr
使用sp读写配置文件,都是采用了官方的推荐做法,调用apply提交,调用这个方法时,会首先写入内存中,然后将落盘的任务加入队列中,会在异步线程中做落盘的操作,这个操作一般来说是没有问题的,也是google官方推荐的做法。但是另一方面android的系统会在Activity的onStop,onPause等生命周期中,调用QueuedWork.waitToFinish,等待落盘的任务队列执行完成,如果任务队列中的任务很多,或者待写入的数据量很大时(sp文件是全量读写的),在一些io性能差的中低端机型上就会很容易出现anr.
检测ANR原理,如启动
内存溢出
图片采用三级缓存存储,内存,本地,网络
fresco 采用四级缓存,解码后内存,解码前内存,本地,网络
缩略图,对应尺寸
内存抖动
频繁GC导致内存抖动,造成卡顿,严重时导致OOM
常见场景:
循环创建大量临时对象,
onDraw方法中创建Paint或者bitmap对象
瞬间产生的大量对象占用新生代内存区域,导致内存空间不够,触发GC,系统花费在GC上的时间越多,进行界面绘制的时间就越短,
内存泄露
单例中持有activity的context;
非静态内部类持有引用
handler
cursor未关闭
解决方式
applicationContext
改为静态内部类,不持有当前类的引用
静态内部类,weakReference引用,onDestory移除
UI卡顿
merge,减少节点,viewStub按需加载,include重用布局
减少层级,层级相同用LinearLayout,RelativeLayout减少层级,weight measure两次,相对布局measure两次,减少过渡绘制
能用padding,少用margin
内存优化
使用完后尽快释放掉,广播,service,用完尽快释放
减少bitmap滥用,
内存紧张时释放掉不必要资源
减少依赖注入框架使用
启动优化
冷启动优化
可放在线程池中,懒加载放在线程池中执行
线程池中区分IO和cpu性能,开启多线程加载
可靠后的,放在启动后初始化,减少不必要初始化
减少布局层级深度
可采用idleHandle方式执行
inflate布局可放在onResume之后执行