Skip to content

yuminfeng/framemonitor

 
 

Repository files navigation

FrameMonitor

目录

简述

FrameMonitor 相当于SDK版的Systrace,可以监控App的帧绘制时间,接入后可以通过小圆球看到App的实时帧绘制时间,当发生严重掉帧,小圆球颜色变红,并且会保存日志到本地,以供分析

小圆球上的数字代表当前帧耗费的时间,单位是ms

小圆球的颜色:绿色-流畅;黄色-可以接收的掉帧;红色-严重掉帧,默认:绿色 -(<=16ms),黄色-(16-32ms),红色(>32ms),与Systrace的绿黄红定义保持一致;实际测试中由于机器性能差异同一份代码在不同机器上跑出来的帧绘制时间可能最高相差16ms,所以提供IConfig接口来定义掉帧的严重程度,使帧绘制时间可以反映主观上的卡顿

日志的保存目录:优先SD卡目录(/mnt/sdcard/Android/data/【packagename】/cache/framemonitor/log), 再是手机内存(/data/data/【packagename】/cache/framemonitor/log)

日志文件:文件名格式为"yyyy-MM-dd-HH-mm-ss",内容格式如下:


    --------MainThread Message--------
    <发生卡顿时主线程Looper里的所有消息>
	
--------MainThread Stack Before JANK--------
    
	<发生卡顿时主线程的调用堆栈>
	
--------Thread Stack--------

    <发生卡顿瞬间线程的调用堆栈>

接入说明

在工程中先引入jcenter仓库


buildscript {
    repositories {
        jcenter()
    }
}
allprojects {
    repositories {
        jcenter()
    }
}

在build.gradle文件中


dependencies {
     debugImplementation 'com.github.vip001:framemonitor-android:1.0.0'
     releaseImplementation 'com.github.vip001:framemonitor-android-no-op:1.0.0'
}

在Application类中:


public class ExApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        FrameMonitorManager.getInstance().init(this).start();
    }
}

如果需要小圆球,在BaseActivity类中:


public class BaseActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameMonitorManager.getInstance().show(this);
    }
}

版本历史

1.0

  1. 帧绘制时间检测
  2. 小圆球悬浮窗显示(无需悬浮窗权限)
  3. 日志信息:发生卡顿时MainLooper的Message信息,线程调用的堆栈信息
  4. 帧绘制时间检测开关控制和小圆球显示开关控制

问题

Android每帧的绘制时间为什么是16ms?


Android屏幕设备的刷新频率为60Hz,通过做一道小学计算题 1÷60≈16.67 (ms)得到16ms

framemonitor与blockcanary对比


https://www.jianshu.com/p/1b0e4d79f511

framemonitor原理分析


https://www.jianshu.com/p/9f200016d309

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%