Android自带的检测UI渲染的工具
开发者模式 --- > GPU呈现模式分析 ---> 在屏幕上显示为条形图尽量所有的条形图都控制在绿线之下(16ms),如果每次渲染的时间都保持在16ms之内,那么我们看见的UI将是非常流畅测。
布局优化
一、布局层级优化:
Google在其API文档中建议View的高度不宜超过10层,所以建议使用RelativeLayout代替LinearLayout,提高UI的渲染效率。
二、避免嵌套过多的无用布局:
1. 使用<include>标签重用Layout:
<include
layout="@layout/include_ui_layout"
android:layout_width="150dp"
android:layout_height="150dp"/>
注意:这里的layout_width和layout_height属性是会覆盖原布局中的属性的。<include>和<merge>一起使用可以减少布局的层级,其中<merge>作为引用布局的根节点。
2. 使用ViewStub实现View的延迟加载:
<ViewStub
android:id="@+id/vs_test"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout="@layout/include_ui_layout"/>
viewStub = (ViewStub) findViewById(R.id.vs_test);
显示的两种方法?
① View myViewStub = viewStub.inflate();//只能调用一次(因为inflate之后原来的ViewStub就不存在了)
② viewStub.setVisibility(View.VISIBLE);
与View.GONE的区别?
<ViewStub>标签只会在显示的时候,才去渲染整个布局。而View.GONE在初始化布局树的时候就已经添加在布局树上了。
内存优化
一、Bitmap优化:
1. 使用适当分辨率和大小的图片
使用图片的缩放
2. 及时回收内存
一旦使用完Bitmap后,要及时的bitmap.recycle()。android3.0之后,Bitmap被放置在了堆中,其内存由GC管理,就不需要释放了。
3. 代码优化(创建一个类的实例会消耗大约15字节的内存)
对常量使用static修饰符
使用静态的方法:静态方法比普通的方法提高15%左右的访问速度
减少不必要的成员变量,这点在Android Lint工具上已经集成检测了
减少不必要的对象
尽量不要使用枚举、少用迭代器
对Cursor、Receiver、Sensor、File等对象,要非常注意它们的创建、注册和回收
使用RenderScript、OpenGL来进行非常复杂的绘图操作
使用SurfaceView来代替View进行大量、频繁的绘图操作
尽量使用视图缓存,而不是每次都执行inflate()方法解析视图
4. 不要让静态成员变量持有当前activity的对象,这样容易引发内存泄露;
对应无限循环的属性动画必须要在onDestory()里面进行取消animator.cancle(),否则会无限循环下去,而导致内存泄露;
不要在主线程做耗时操作,避免ANR
优化工具
一、Lint工具:
是as中集成的一个android代码的提示工具,它给xml布局、代码提供了强大的帮助。
二、Android Studio的Memory Monitor工具
是一个内存监视工具;
当内存持续增高时,可能发生泄漏;内存突然减少时,可能发生GC了。
如果无法显示:点击 Tools ---> Android ---> Enable adb integration 重新勾选
三、使用TraceView工具:
1. 通过代码生成精确范围的TraceView日志
开启监听:Debug.startMethodTracing()
结束监听:Debug.stopMethodTracing()
TraceView日志的存放目录默认路径是 "/sdcard/dmtrace.trace",导出文件 adb pull /sdcard/trace_log.trace/local/LOG/
记得在配置文件中加入权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2. 通过Adnroid Device Monitor生成TraceView:
点击Adnroid Device Monitor打开界面,然后选择要调试的程序。然后点击"start method profiling"开启监听,再次点击就是关闭监听。
如下图:
Incl CPU Time 某方法占用cpu的时间
Excl CPU Time 某方法本身(不包括子方法)占用cpu的时间
Incl Real Time 某方法真正的执行时间
Excl Real Time 某方法本身(不包括子方法)真正的执行时间
Calls + RecurCalls 调用次数+递归回调的次数