Skip to content

Java-AOP框架-lancet

Lancet 是一个轻量级Android AOP框架。

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

开始使用

安装

这个项目有点老了,笔者测试通过的如下配置

在根目录的 build.gradle 添加:
buildscript需要添加在plugins之前

groovy
buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        classpath 'com.bytedance.tools.lancet:lancet-plugin-asm6:1.0.0'
    }
}

注意: Lancet 1.0.5 及以上版本只支持 gradle 3.3.2 及以上版本。

在 app 目录的'build.gradle' 添加:

groovy
plugins {
    alias(libs.plugins.android.application)
    id "me.ele.lancet" apply false
}
dependencies {
    compileOnly 'me.ele:lancet-base:1.0.6'
}

在根目录/build.gradle 代码最上方添加 (buildscript需要添加在plugins之前)

gradle

示例

Lancet 使用注解来指定代码织入的规则与位置。

首先看看基础API使用:

java
@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(将在后面介绍).
  • Origin.call() 代表了 Log.i() 这个目标方法.

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