MethodCanary is tool to metric method cost.
Written for AndroidGodEye.
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'
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 && instrumentationRuleIncludeClassNamePrefix
will be instrumented
You can change instrumentation rule
- Add class prefix list to
instrumentationRuleIncludeClassNamePrefix
- Put js file
AndroidGodEye-MethodCanary.js
in 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
}
- Can not change function name and desc:
function isInclude(classInfo,methodInfo)
- Functions must return boolean type, default True for
isInclude
- Param
classInfo
has fields:int access
,String name
,String superName
,String[] interfaces
- Param
methodInfo
has fields:int access
,String name
,String desc
- Write
AndroidGodEye-MethodCanary.js
by javascript language
// 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()