对普通用户而言,类如内存占用高、耗流量、耗电量等性能问题可能不会轻易发现,可是卡顿问题用户必定会立马直观的感觉到。本文就带你一览卡顿的发生、检测、及优化。git
在《Android性能优化(二)之布局优化面面观》中咱们说到:60fps VS 16ms。github
60帧每秒是目前最合适的图像显示速度,也是绝大部分Android设备设置的调试频率,若是在16ms内顺利完成界面刷新操做能够展现出流畅的画面,而因为任何缘由致使接收到VSYNC信号的时候没法完成本次刷新操做,就会产生掉帧的现象,刷新帧率天然也就跟着降低(假定刷新帧率由正常的60fps降到30fps,用户就会明显感知到卡顿)。数据库
StrictMode类是Android 2.3 (API 9)引入的一个工具类,能够用来帮助开发者发现代码中的一些不规范的问题,以达到提高应用响应能力的目的。能够设置不一样的线程检测策略、虚拟机检测策略。性能优化
public void onCreate() {
if (DEVELOPER_MODE) {
// 线程检测策略
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
// 虚拟机检测策略
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
super.onCreate();
}
复制代码
当违规操做发生时,能够根据自定义的策略记录下Log或者Crash,以便于跟踪改善。bash
与StickMode相比,TraceView简直是发现Block根源的神器,不只能看出每一个方法消耗的时间、发生次数,而且能够进行排序,直接从最耗时的方法开始处优化;微信
关于TraceView的使用及分析,请参考《Android性能优化(一)之启动加速35%》第五章节。异步
AndroidPerformanceMonitor 是一个检测卡顿的开源库,前身是BlockCanary,更前身则是LeakCanary。而其使用与LeakCanary也比较类似,能够自主设置卡顿检测时间,检测到的卡顿一样是以Notification展现,在使用体验上也至关相似,与LeakCanary能够说是孪生兄弟。ide
原理 利用了Looper.loop()中每一个Message被分发先后的Log打印,而咱们设置本身的Printer就能够根据Log的不一样的处理:工具
// This must be in a local variable, in case a UI event sets the logger
Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
复制代码
ANR-WatchDog一样是一个检测卡顿的检测库,与AndroidPerformanceMonitor不同的是它的原理相对简单:oop
咱们知道Android系统每隔16ms都会发出VSYNC信号,触发UI的绘制,而咱们能够拿到回调的监听。若是16ms没有回调的话咱们就知道发生了卡顿。
Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
@Override
public void doFrame(long l) {
}
});
复制代码
备注:这种方式的原理也比较简单,可是可用性不高,只能测出界面绘制的卡顿
在第三节咱们分析了产生卡顿的缘由,那么避免卡顿的方法就很简单了:反其向行知便可。
1. 开发中使用AndroidPerformanceMonitor检测卡顿进行处理; 2. 任何耗时操做正确的移到异步里; 3. 合理优化布局,避免OverDraw; 4. 优化内存分配,减小GC频率,这通常不是某个界面的事情,是一项长期工做;
系统对Block有检测吗?那必须有!大名鼎鼎的ANR就来于此。
ANR的前因后果:触发场景、分析方法,你真的都清楚吗?欢迎关注下一篇文章,带你细究ANR鲜为人知的那些事。
欢迎关注微信公众号:按期分享Java、Android干货!