Lancet
Lancet 是一个专为 Android 平台设计的轻量级 AOP(面向切面编程)框架。它旨在提供高效的代码织入能力,同时保持极低的侵入性和编译开销。
核心特性
- 高性能编译:支持增量编译,大幅缩短构建时间,适应快速迭代的开发流程。
- 简洁 API:通过注解驱动,仅需少量 Java 代码即可完成复杂的逻辑注入需求。
- 零冗余代码:不会在 APK 中插入任何多余的无用代码,保持包体积最小化。
- SDK 支持:支持在 SDK 编写注入代码,允许修改依赖该 SDK 的 App 行为,便于库开发者进行功能增强或监控。
开始使用
安装配置
首先,在项目根目录的 build.gradle 文件中添加 Lancet 插件依赖。请注意,Lancet 1.0.5 及以上版本仅支持 Gradle 3.3.2 及以上版本,请确保环境兼容。
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
classpath 'me.ele:lancet-plugin:1.0.6'
}
}
接着,在应用模块(app 目录)的 build.gradle 中应用插件并添加基础依赖。
apply plugin: 'me.ele.lancet'
dependencies {
provided 'me.ele:lancet-base:1.0.6'
}
注意:SDK 开发者不需要 apply 插件,只需在依赖中添加 provided me.ele:lancet-base:x.y.z 即可。
基础示例
Lancet 使用注解来指定代码织入的规则与位置。以下是一个基础 API 使用示例,展示了如何拦截系统日志方法。
@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"),从而实现日志内容的统一处理。
代码织入方式
Lancet 提供了两种主要的织入模式:Proxy 和 。


