Skip to content
/ EasyAOP Public

EasyAOP是基于ASM实现切面通用能力的工具。EasyAOP提供的通用切面能力,可以使用配置文件方式来配置使用。(EasyAOP is a tool based on ASM to realize the general capability of AOP. General faceting capabilities provided by EasyAOP,You can use the yaml file format to configure the use of EasyAOP.)

License

Notifications You must be signed in to change notification settings

wuba/EasyAOP

Repository files navigation

EasyAOP

English

EasyAOP是什么

  • EasyAOP是基于ASM实现切面通用能力的工具。EasyAOP提供的通用切面能力,可以使用配置文件(yaml)方式来配置使用。
  • EasyAOP使用不需要开发者了解或理解学习底层的晦涩难懂的切面专业知识,也不需要用相关的切面开发经验。仅根据自己的需求,进行简单配置就能完成相关的切面功能或者能力。
  • EasyAOP提供Android gradle Plugin方式,方便Android开发者进行接入使用。

为什么要做EasyAOP

  1. 我们发现切面需求开发中,使用到的切面通用功能或者能力是有限的,也满足二八原则,既80%的需求只使用到了20%的切面通用功能(能力)
  2. 底层的切面知识晦涩难懂,因相关的库更贴近字节码,所以开发者掌握起来难度较大。且切面类的需求较少,投入产出比很差。
  3. 开源的切面工具,没有一款既简单好用又稳定可靠的。

EasyAOP支持的能力

能力 说明 用途 备注
方法调用切面代理(替换) 代理替换指定方法调用为自己的方法 1. 控制指定代码的调用逻辑
2. 通过代理方式修复SDK或者系统级方法的bug
3. 其他
✅ 1.0版本已实现
方法体置空 将指定的方法体内容置空,若该方法有返回值,按照返回值类型,返回默认值 1. 屏蔽指定方法逻辑
2. 其他
✅ 1.0版本已实现
指定方法体,进入、退出插入指定代码 对指定方法体,进入或退出插入自己指定的代码 1. 可使用在方法插桩、例如自动化埋点、方法耗时统计等
2. 其他
✅ 1.0版本已实现
添加try catch异常捕获代码段 给指定的方法或者代码添加try catch异常捕获代码段。保证后续代码的正常运行 1. 屏蔽某些方法或者代码段的异常,避免异常造成APP崩溃,或者后续代码无法继续执行
2. 其他
🗒TODO
对象替换 对指定的对象A,使用继承A的B对象进行代码的调用替换 1. 全局替换基类的能力,利用java的继承关系,可以植入一层中间层。
2. 其他
🗒TODO
类中添加新方法,或者复写父类方法 1. 类中添加新方法
2. 复写父类方法。
1. 复写父类方法。在一些切面处理中,子类方法中插入或修改逻辑时,需要子类有父类该方法的复现才可以
2. 其他
🗒TODO
方法调用删除 删除指定的方法调用 1. 删除方法调用,例如日志清除等 🗒TODO
其他 ... ... ...

EasyAOP应用示例

说明:下文中在切面示例中提到的“原代码”,是指切面修改之前的代码,在项目中可能是多种形式存在,如AAR、JAR包中的二进制class文件,源码中的java文件等。

方法调用切面代理(替换)能力

例如原代码如下:
原代理

我们要对com.tea.Waiter.class 中的 drinktea方法调用做代理,替换成我们自己com.test.WaiterProxy.class 中的drinkBeerspecialTea
代理方法类

Android上接入EasyAOPgradle plugin后仅需要在配置文件中添加如下配置即可:
方法代理配置示例

编译完成,所有关于com.tea.Waiter.class 中的 drinktea方法调用都会替换成com.test.WaiterProxy.class 中的drinkBeerspecialTea的调用。

说明:以上大家注意到,我们方法切面代理能力是支持对象方法和静态方法的代理的。

对于静态方法代理来说,提供代理方法和原方法的方法入参是一样的(顺序、类型一样),无需做任何调整。

而对于对象方法代理来说,需要注意的是代理方法第一个参数必须是该被代理方法的对象,其他参数依次对照即可,这样做的原因是:很多情况下,代理方法是需要拿到原方法的对象的,需要能够提供进行调用原始方法的能力。

方法体置空能力

还是以“服务员煮茶”为例,假如在煮茶流程中有一道错误的流程导致冲泡出来的茶品质很差,要把错误流程去掉。

例如,原代码中:
原代码

要把com.tea.Water.class 中 这个waitingErrorTime 错误流程方法干掉,接入EasyAOP plugin后配置文件写法如下:
方法体置空配置

这样就会把com.tea.Water.classwaitingErrorTime方法体内容置空,对于有返回值的方法,方法体置空后默认会返回,返回值类型的默认值,当然返回值也允许用户通过配置设置。

指定方法体,进入、退出插入指定代码

例如原方法 makeTea 如下:
原代码

如果需要在此方法体开始前插入代码,例如插入方法如下:
要插入的代码类方法

配置为:
插入配置
当然方法体尾部插入部分的配置示例也在上面中有提到,使用上也是一样的。

其他能力部分

其他能力部分,后续版本陆续支持了,会在对应的使用文档中再做更新。这里就不做介绍了。

常见切面工具与EasyAOP的对比

切面工具框架,现在常用的是ASMAspectJ,这些框架都是学习、接入使用难度较大,偏全面、底层的框架。EasyAOP底层调用和封装的是ASM的能力,它提供了面向业务需求的通用能力,仅通过简单配置就能调用。下面是EasyAOP和常见切面工具在7个纬度方面的对比:
插入配置

从对比上,明显可以看出EasyAOP继承了ASM好的方面,优化改进了接入使用复杂度,让使用方简单接入,无需了解切面知识就能够快速的进行切面功能需求开发。

在上面“为什么要做EasyAOP”中也提到了,80%的切面类需求仅仅使用到20%的切面能力,所以我们EasyAOP框架 的切面方向是提供面向业务的通用切面能力,而不是全面的、底层的切面能力。

EasyAOP 相关问题

使用EasyAOP之前,请先根据需要阅读相关文档:

  1. 接入指南
  2. 示例Sample 参考 EasyAOP/sample
  3. 常见问题
  4. 日志说明
  5. 也可在Issues上寻找和提问问题。
  6. show me the code 最直接的方式就是看源码了

开发者

欢迎共建

欢迎同志共建EasyAOP. EasyAOP Contributing Guide.

致谢

许可协议

EasyAOP 项目基于BSD协议开源.

About

EasyAOP是基于ASM实现切面通用能力的工具。EasyAOP提供的通用切面能力,可以使用配置文件方式来配置使用。(EasyAOP is a tool based on ASM to realize the general capability of AOP. General faceting capabilities provided by EasyAOP,You can use the yaml file format to configure the use of EasyAOP.)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published