Skip to content
一个可以在编译期通过 ASM 在字节码中对函数调用进行插桩的 Gradle 插件,可以通过注解在指定方法调用前后执行对应逻辑
Java
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.idea
elapse-asm
elapse-demo
elapse
gradle/wrapper
.gitignore
LICENSE
README.md
build.gradle
gradle.properties
gradlew
gradlew.bat
settings.gradle

README.md

基本介绍

一个基于 ASM 实现的 Gradle Plugin,可以在编译期对注解所指定的方法进行插桩,在方法调用前后执行指定逻辑。

具体实现思路文章可以见此篇文章: 跟我一起用 ASM 实现编译期字节码插桩,由于只是 Demo,不建议用于正式项目

使用方式

引入

首先需要将 elapseelapse-asm 导入到项目中。

在项目的 build.gradle 中将其添加到 classpath 中:

repositories {
    //...
    maven {
        url uri("repo")
    }
}
 
dependencies {
    // ...
    classpath 'com.n0texpecterr0r.build:elapse-asm:1.0.0'
}

在 App module 中将插件 apply:

apply plugin: 'com.n0texpecterr0r.elapse-asm'

使用

在需要进行插桩的方法上加入注解:

@TrackMethod(tag = TAG_LOG)
public void test() {
    try {
        Thread.sleep(1200);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

在 Application 中注册 MethodObserver,并实现对应方法:

MethodEventManager.getInstance()
        .registerMethodObserver(TAG_LOG, new MethodObserver() {
            @Override
            public void onMethodEnter(String tag, String methodName) {
                Log.d("MethodEvent", "method "+methodName+" entered at "+System.currentTimeMillis());
            }
            @Override
            public void onMethodExit(String tag, String methodName) {
                Log.d("MethodEvent", "method "+methodName+" exited at "+System.currentTimeMillis());
            }
        });

程序运行时,在调用对应方法前后会执行 MethodObserver 中的对应方法,从而实现在方法调用前后执行指定逻辑。

You can’t perform that action at this time.