-
Notifications
You must be signed in to change notification settings - Fork 342
0x03a MethodCanary_zh
hui.zhao edited this page Feb 29, 2020
·
6 revisions
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
可以使用如下两种方式生产数据
- DebugMonitor Dashboard上点击开始按钮开始记录,点击结束按钮结束记录(实际上也是调用了第二种方式的API)
- 代码中调用
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
记录了从开始记录到结束记录的时间和所有线程上执行方法的耗时记录
dashboard上点击开始,操作app,点击结束,查看方法耗时情况
- MethodCanary只会记录你关心的方法耗时(通过配置AndroidGodEye-MethodCanary.js),而Android Studio cpu profiler记录了所有方法
- MethodCanary速度很快,点击开始和结束查看几乎没有延时,而Android Studio cpu profiler通常需要有较长的分析时间
- MethodCanary支持展示方法的耗时方法树,包含了耗时时间和耗时所占用的比重
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
需要插桩。
- 不能修改文件中方法的名称和参数:
function isInclude(classInfo,methodInfo)
- 方法的返回值必须是bool类型,
isInclude
默认返回true - 参数
classInfo
有如下字段可以使用:int access
,String name
,String superName
,String[] interfaces
- 参数
methodInfo
有如下字段可以使用:int access
,String name
,String desc
- 使用javascript语言编写
AndroidGodEye-MethodCanary.js
文件