Skip to content

0x03a MethodCanary_zh

hui.zhao edited this page Feb 29, 2020 · 6 revisions

MethodCanary

额外依赖

MethodCanary需要先给项目插桩,所以需要依赖gradle plugin

在项目根目录的build.gradle中

buildscript {
    dependencies {
        classpath "cn.hikyson.methodcanary:plugin:PLUGIN_VERSION_NAME"
    }
}

PLUGIN_VERSION_NAME参考 MethodCanary github release

在项目入口的主模块(apply plugin: 'com.android.application'的模块)的build.gradle中添加

apply plugin: 'cn.hikyson.methodcanary.plugin'

安装

使用如下配置进行安装

GodEye.instance().install(GodEyeConfig.defaultConfigBuilder().withMethodCanaryConfig(new GodEyeConfig.MethodCanaryConfig(int maxMethodCountSingleThreadByCost, long lowCostMethodThresholdMillis)).build());

或者

<methodCanary maxMethodCountSingleThreadByCost="300" lowCostMethodThresholdMillis="10"/>
  • maxMethodCountSingleThreadByCost:单个线程最多显示的方法数,按照方法耗时排序,默认300个
  • lowCostMethodThresholdMillis:方法耗时最低阈值,低于阈值的方法不显示,默认10ms

数据的生产与消费

可以使用如下两种方式生产数据

  1. DebugMonitor Dashboard上点击开始按钮开始记录,点击结束按钮结束记录(实际上也是调用了第二种方式的API)
  2. 代码中调用GodEyeHelper中的API
try {
    // method canary  start recording
            GodEyeHelper.startMethodCanaryRecording("tag");
        } catch (UninstallException e) {
            e.printStackTrace();
        }

try {
    // method canary stop recording
            GodEyeHelper.stopMethodCanaryRecording("tag");
        } catch (UninstallException e) {
            e.printStackTrace();
        }

使用如下方式监听输出内容:

 try {
                GodEye.instance().observeModule(GodEye.ModuleName.METHOD_CANARY, new Consumer<MethodsRecordInfo>() {
                    @Override
                    public void accept(MethodsRecordInfo methodsRecordInfo) throws Exception {
                    }
                });
            } catch (UninstallException e) {
                e.printStackTrace();
            }

methodsRecordInfo记录了从开始记录到结束记录的时间和所有线程上执行方法的耗时记录

Debug监控面板

dashboard上点击开始,操作app,点击结束,查看方法耗时情况

android_god_eye_method_canary_dashboard

android_god_eye_method_canary

和Android studio CPU profiler相比的优势

  • MethodCanary只会记录你关心的方法耗时(通过配置AndroidGodEye-MethodCanary.js),而Android Studio cpu profiler记录了所有方法
  • MethodCanary速度很快,点击开始和结束查看几乎没有延时,而Android Studio cpu profiler通常需要有较长的分析时间
  • MethodCanary支持展示方法的耗时方法树,包含了耗时时间和耗时所占用的比重

AndroidGodEye-MethodCanary.js文件的说明

AndroidGodEye-MethodCanary.js放置在项目的根目录下,文件内容的样例如下:

/**
    classInfo
        {int access
         String name
         String superName
         String[] interfaces}

     methodInfo
         {int access
         String name
         String desc}
**/
function isInclude(classInfo,methodInfo){
    if(!classInfo.name.startsWith('cn/hikyson/methodcanary')){
        return false;
    }
    if(classInfo.name.startsWith('cn/hikyson/methodcanary/samplelib/R$')
            || classInfo.name === 'cn/hikyson/methodcanary/samplelib/BuildConfig'){
            return false
    }
    return true
}

上述样例的含义是:所有类名是cn/hikyson/methodcanary开头的方法,排除cn/hikyson/methodcanary/samplelib/R$cn/hikyson/methodcanary/samplelib/BuildConfig需要插桩。

特别注意

  1. 不能修改文件中方法的名称和参数:function isInclude(classInfo,methodInfo)
  2. 方法的返回值必须是bool类型,isInclude默认返回true
  3. 参数classInfo有如下字段可以使用: int access,String name,String superName,String[] interfaces
  4. 参数methodInfo有如下字段可以使用: int access,String name,String desc
  5. 使用javascript语言编写AndroidGodEye-MethodCanary.js文件
Clone this wiki locally