前言
在Android上做AOP編程,目前廣泛使用且兼容性最好的方案是aspectjx,原因是:AspectJX
是一個基于AspectJ并在此基礎上擴展出來可應用于Android開發平臺的AOP框架,可作用于java
源碼,class
文件及jar
、aar
包,同時支持kotlin
的應用。
沖突問題
在使用aspectjx
這個開源庫的過程,你會遇到很多問題,比如網上很多人說的和第三方庫沖突的問題,我看很多人因為這個原因就放棄了使用aspectj,實際上是有解決方案的,只是很多人不知道其中的原理罷了。
舉個例子,比如同時在項目中引入支付寶sdk
和aspectjx
,就會出現沖突。
當你在調用如下支付寶API的時候就會出現Error
:
//創建支付對象
PayTask alipay = new PayTask(this);
//...省略支付調用
具體異常如下:
支付寶異常.png
錯誤提示:找不到PayTask
這個類,完整路徑是com/alipay/sdk/app/PayTask
支付寶sdk是一個aar
文件,它的包內容可以在project
的External Libraries
目錄下查看,如下:
External.png
解決辦法
aspectjx默認會掃描/處理項目中所有的class文件和三方庫,所以會和一些第三方庫存在兼容性問題,我們可以通過排除第三方庫的方式來解決這個問題
這一點在官方文檔中也有提及
include && exclude.png
于是上面案例中的沖突就很好解決了,我們在app的build.gradle
中做如下配置:
aspectjx {
//排除所有package路徑中包含`com.alipay`的class文件及庫(jar文件)
exclude 'com.alipay'
}
注意:
1、上面的配置可以寫在android {}
里面,也可以寫在外面;
2、只能通過package
路徑匹配class文件及jar文件、第三方庫文件;
3、為了提升編譯效率以及其他不必要的麻煩,建議把不需要掃描的三方庫都加到exclude