Lancet

作者: 雷根儿 | 来源:发表于2022-02-17 15:07 被阅读0次

官方文章:https://github.com/eleme/lancet/blob/develop/README_zh.md
Lancet 是一个轻量级Android AOP框架。

  • 编译速度快, 并且支持增量编译.
  • 简洁的 API, 几行 Java 代码完成注入需求.
  • 没有任何多余代码插入 apk.
  • 支持用于 SDK, 可以在SDK编写注入代码来修改依赖SDK的App.

开始使用

安装

工程的build.gradle中加入:(注意使用最新版本)
dependencies {
    classpath 'me.ele:lancet-plugin:1.0.6'
}

主module的build.gradle中加入:
apply plugin: 'me.ele.lancet'

使用到Lancet的module的build.gradle中加入:
provided 'me.ele:lancet-base:1.0.6'

示例1

@Proxy("i")
@TargetClass("android.util.Log")
public static int anyName(String tag, String msg){
    msg = msg + "lancet";
    return (int) Origin.call();
}

关键点

  • @TargetClass指定了将要被织入代码目标类 android.util.Log.
  • @Proxy指定了将要被织入代码目标方法 i.
  • @Proxy意思就是代理,会代理Log.i到我们这个方法中来
  • Origin.call()代表了 Log.i()这个目标方法.

所以这个示例Hook方法的作用就是 将代码里出现的所有 Log.i(tag,msg)代码替换为Log.i(tag,msg + "lancet")

示例2

public static void evilCode() {
    int a = 1 / 0;
}
//我们把里面的这个代码给去掉,让它变成空方法
public class ToolsLancet {
    @TargetClass("com.zhou.blogdemo.blog04.Tools")
    @Insert("evilCode")
    public static void evilCode() {

    }
}

关键点

  • TargetClass 注解:标识你要修改的类名;
  • Insert注解:表示你要往 evilCode 这个方法里面注入下面的代码
  • 下面的方法声明需要和原方法保持一致,如果有参数,参数也要保持一致(方法名、参数名不需要一致)

还可以加个try-cash提示

public class ToolsLancet {
    @TargetClass("com.zhou.blogdemo.blog04.Tools")
    @Insert("evilCode")
    public static void evilCode() {
        try {
            Origin.callVoid();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

更多参考:https://blog.csdn.net/qq_37658380/article/details/117002958

相关文章

网友评论

      本文标题:Lancet

      本文链接:https://www.haomeiwen.com/subject/kikslrtx.html