前言
在Android上做AOP编程,目前广泛使用且兼容性最好的方案是aspectjx,原因是:AspectJX
是一个基于AspectJ并在此基础上扩展出来可应用于Android开发平台的AOP框架,可作用于java
源码,class
文件及jar
、aar
包,同时支持kotlin
的应用。
冲突问题
在使用aspectjx
这个开源库的过程,你会遇到很多问题,比如网上很多人说的和第三方库冲突的问题,我看很多人因为这个原因就放弃了使用aspectj,实际上是有解决方案的,只是很多人不知道其中的原理罢了。
举个例子,比如同时在项目中引入支付宝sdk
和aspectjx
,就会出现冲突。
当你在调用如下支付宝API的时候就会出现Error
:
//创建支付对象
PayTask alipay = new PayTask(this);
//...省略支付调用
具体异常如下:
错误提示:找不到PayTask
这个类,完整路径是com/alipay/sdk/app/PayTask
支付宝sdk是一个aar
文件,它的包内容可以在project
的External Libraries
目录下查看,如下:
解决办法
aspectjx默认会扫描/处理项目中所有的class文件和三方库,所以会和一些第三方库存在兼容性问题,我们可以通过排除第三方库的方式来解决这个问题
这一点在官方文档中也有提及
于是上面案例中的冲突就很好解决了,我们在app的build.gradle
中做如下配置:
aspectjx {
//排除所有package路径中包含`com.alipay`的class文件及库(jar文件)
exclude 'com.alipay'
}
注意:
1、上面的配置可以写在android {}
里面,也可以写在外面;
2、只能通过package
路径匹配class文件及jar文件、第三方库文件;
3、为了提升编译效率以及其他不必要的麻烦,建议把不需要扫描的三方库都加到exclude