Lancet
2022-02-17 本文已影响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