MethodCanary is tool to metric method cost.
Written for AndroidGodEye.
Quick Start
Step0 Download
Root build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'cn.hikyson.methodcanary:plugin:VERSION'
}
}Module com.android.application
apply plugin: 'cn.hikyson.methodcanary.plugin' implementation 'cn.hikyson.methodcanary:lib:VERSION'
Step1 Custom plugin
cn.hikyson.methodcanary.plugin has some configurations.
AndroidGodEye { enableLifecycleTracer = true // Need lifecycle methods instrumentation, default true enableMethodTracer = true // Need common methods instrumentation, default true instrumentationRuleFilePath = "app/AndroidGodEye-MethodCanary2.js" // Default AndroidGodEye-MethodCanary.js instrumentationRuleIncludeClassNamePrefix = ["cn/hikyson/methodcanary/sample"] // Default null }
Methods Meet this condition
instrumentationRuleFilePath && instrumentationRuleIncludeClassNamePrefixwill be instrumented
You can change instrumentation rule
- Add class prefix list to
instrumentationRuleIncludeClassNamePrefix - Put js file
AndroidGodEye-MethodCanary.jsin project root, content sample:
function isInclude(classInfo,methodInfo){
if(classInfo.name.startsWith('cn/hikyson/methodcanary/samplelib/R$')
|| classInfo.name === 'cn/hikyson/methodcanary/samplelib/BuildConfig'
|| classInfo.name === 'cn/hikyson/methodcanary/samplelib/R'
|| classInfo.name.startsWith('cn/hikyson/methodcanary/sample/R$')
|| classInfo.name === 'cn/hikyson/methodcanary/sample/BuildConfig'
|| classInfo.name === 'cn/hikyson/methodcanary/sample/R'){
return false
}
return true
}
Note
- Can not change function name and desc:
function isInclude(classInfo,methodInfo) - Functions must return boolean type, default True for
isInclude - Param
classInfohas fields:int access,String name,String superName,String[] interfaces - Param
methodInfohas fields:int access,String name,String desc - Write
AndroidGodEye-MethodCanary.jsby javascript language
Step2
// start recording MethodCanary.get().startMethodTracing("sessionName0") // stop recording MethodCanary.get().stopMethodTracing( "sessionName0", MethodCanaryConfig(5) ) { sessionTag, startMillis, stopMillis, methodEventMap -> Logger.d("finish!!!") } // Observe page lifecycle method cost MethodCanary.get().addOnPageLifecycleEventCallback { lifecycleExitMethodEvent, page -> Logger.d(page.javaClass.simpleName + lifecycleExitMethodEvent) } MethodCanary.get().removeOnPageLifecycleEventCallback()