Lancet

官方文章: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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容