/Mamba

监听方法的开始和结束的 gradle 插件

Primary LanguageGroovy

Mamba

Mamba

mamba-plugin: Download mamba-api: Download 监听方法的开始和结束

依赖

项目目录下的build.gradle

dependencies {
     classpath 'com.codelang:mamba-plugin:1.0.2'
}

app module 下的 build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.codelang.mamba'

dependencies {
    implementation "com.codelang:mamba-api:1.0.2"
}
mamba {
    include = ["com.kiwi.mamba", "com.codelang.library"]
    exclude = [
            "com.kiwi.mamba.base.MyApplication",
            "com.kiwi.mamba.loader"
    ]
    methodEnable = true
    trackEnable = true
}

使用

初始化:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Mamba.init(new CostTimeLoader());
    }
}


Demo 提供了两个 Loader:

  • CostTimeLoader : 统计方法耗时
  • TrackLoader : 捕捉方法信息

CostTimeLoader

用于统计方法耗时,需要在 app build.gradle 中配置:

mamba {
    include = ["com.kiwi.mamba", "com.codelang.library"]
    exclude = [
            "com.kiwi.mamba.base.MyApplication",
            "com.kiwi.mamba.loader"
    ]
    methodEnable = true
}
  • include : 配置需要进行插桩的包路径、类
  • exclude : 对包路径、类不进行插桩
  • methodEnable : 方法插桩开启,默认为 true

打印信息:

com.kiwi.mamba E/time: class=com.kiwi.mamba.MainActivity methodName=<init> costTime=0ms
com.kiwi.mamba E/time: class=com.kiwi.mamba.MainActivity methodName=onCreate costTime=208ms
com.kiwi.mamba E/time: class=com.kiwi.mamba.MainActivity methodName=goPage costTime=14ms
com.kiwi.mamba E/time: class=com.codelang.library.TrackActivity methodName=<init> costTime=0ms
com.kiwi.mamba E/time: class=com.codelang.library.TrackActivity methodName=onCreate costTime=36ms


注:Mamba 的初始化,或是实现的 Loader 类,都必须配置 exclude,不然会发生插桩导致循环调用的情况

TrackLoader

用于捕捉方法信息,需要在 app build.gradle 中配置

mamba {
    include = ["com.kiwi.mamba", "com.codelang.library"]
    exclude = [
            "com.kiwi.mamba.base.MyApplication",
            "com.kiwi.mamba.loader"
    ]
    methodEnbale = false
    trackEnable = true
}

一般来说,如果想捕捉方法信息的话,可以暂时性关闭 methodEnbale,仅对 @Track 注解的方法进行采集。

如果想捕捉 open 函数的话,可以采用如下方式:

    @Track
    private void open(String t, float a, double b, long c) {
        Toast.makeText(this, "What can I say?Mamba out", Toast.LENGTH_SHORT).show();
    }

对应插桩的结果为:

 private void open(String str, float f, double d, long j) {
        Class<TrackActivity> cls = TrackActivity.class;
        Mamba.i(cls, "open", str, Float.valueOf(f), Double.valueOf(d), Long.valueOf(j));
        Toast.makeText(this, "What can I say?Mamba out", 0).show();
 }

我们可以通过 Mamba 的 loader 拿到信息,具体可以查看 TrackLoader

  override fun methodEnter(clazz: Class<*>?, methodName: String?, args: Array<out Any>?) {
        when (clazz) {
            TrackActivity::class.java -> {
                trackPage(methodName, args)
            }
        }
   }

    private fun trackPage(methodName: String?, args: Array<out Any>?) {
        when (methodName) {
            "open" -> {
                "触发 $methodName 方法".loge()
                args?.forEach {
                    "捕捉到参数值:$it ".loge()
                }
            }
        }
    }

我们可以通过对应的类名和方法名,取出方法的参数值,然后实现无痕业务的埋点方案,我们只需要在业务代码中实现需要捕捉的方法,和需要记录的参数值即可,当然,具体的比较,会出一篇文章来进行详细的讲解 Mamba-Api Download Mamba-plugin Download