一、内存占用分析方法:
1、单步注释法(适用于后台服务,逻辑较少,可以知道某个方法占用了多少内存,但是针对逻辑复杂的前台activity不适用)
2、Java Heap 静态分析法,内存占用按类型进行分类,分析难度大,适用于MainActivity等永久页面
3、Alloc Tracking 动态分析法,内存占用也按类型进行分类,但是数据较少,分析难度小,使用DetailActivity等临时页面
总的来说,service用单步注释法,临时页用动态分析法,永久页除了动态分析法,还需要辅助于静态分析法。
二、减少重绘,提高界面渲染性能:
1、减少标签嵌套
2、减少不必要的背景色
三、总体原则
1、减少布局层级(开发者选项),避免过度重绘。
2、优化耗时高的方法(Android Studio CPU monitor)。
3、优化内存占用(Android Studio Memory monitor)。
四、性能优化日志
1、按需进行变量初始化。 {@link BaseActivity#ensureProgressDialog()}
2、耗时及实时性低的初始化须在异步中完成。{@link BaseApplication#onCreate()}
3、精简后台服务初始化逻辑。{@link #start()}
4、当有TimerTask时,销毁阶段不能只调用TimerTask的cancel方法
而应该调用Timer的cancle方法 {@link JSBridgeWebView#dropResource()}
5、特别小心回调对象生命周期,经常因长期保持引用从而造成页面泄露
{@link com.netease.mail.oneduobaohydrid.model.token.Manager#mListener}
{@link BaseActivityWithPopupMenu#onDestroy()}
6、列表必须使用ViewHolder
{@link com.netease.mail.oneduobaohydrid.adapter.ChargeRecordAdapter}
{@link com.netease.mail.oneduobaohydrid.adapter.MyShareAdapter}
{@link com.netease.mail.oneduobaohydrid.adapter.OrderAdapter}
7、首次不需要使用的节点设置为GONE或使用viewstub、merge
尽量使用RelativeLayout代替LinearLayout
8、减少布局层级(开启GPU过度绘制)
9、避免在for循环里面分配对象占用内存
{@link com.netease.mail.oneduobaohydrid.util.manager.timer.TimerManager#doCountDown(int)}
10、尽量避免在在静态变量或者静态内部类引用非静态成员,即使要用请及时释放或者改成虚引用。
11、及时关闭资源,如File、Cursor、Bitmap等。
12、有用到Context变量的方法,注意Activity泄露。
13、Handler对Activity的引用,必须使用虚引用。
14、“我的代码有问题吗?”时刻提醒自己,运行是否流畅很大程度上决定用户愿不愿意留在你的App上。