在Android中使用AspectJX框架遇到的配置問題

一個基於AspectJ並在此基礎上擴展出來可應用於Android開發平臺的AOP框架,可作用於java源碼,class文件及jar包,同時支持kotlin的應用。
AspectJX Github鏈接

首先,交代一下我的項目結構和遇到問題的三方包:

1.使用了Arouter,是一個組件化的項目
2.使用了友盟的sdk

按照AspectJX文檔上配置:
1.在項目根目錄的build.gradle裏依賴AspectJX

dependencies {
classpath ‘com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10’
}

這裏配置的一定是最新版本,可以查看"最近更新"欄目裏的版本號,截至我寫文章的時候,最新版本是2.0.10
在這裏插入圖片描述
2.在app的build.gradle中配置

apply plugin: ‘android-aspectjx’
//或者這樣也可以
apply plugin: ‘com.hujiang.android-aspectjx’

implementation ‘org.aspectj:aspectjrt:1.8.+’

3.本以爲經過以上配置就能正常使用了,
結果報錯Cause: zip file is empty在這裏插入圖片描述
進一步操作一下
在這裏插入圖片描述
發現報錯
在這裏插入圖片描述

AspectJX默認會處理所有的二進制代碼文件和庫,爲了提升編譯效率及規避部分第三方庫出現的編譯兼容性問題,AspectJX提供include,exclude命令來過濾需要處理的文件及排除某些文件(包括class文件及jar文件)。

所以在app的build.gradle添加

aspectjx{
    exclude 'androidx','com.google'
}

這時可以正常編譯通過,但是應用打開時崩潰
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/taobao/accs/common/ThreadPoolExecutorFactory;
在這裏插入圖片描述
這個類是在友盟的sdk中
在這裏插入圖片描述
我們添加一下報錯的包名,然後Sync

aspectjx{
    exclude 'androidx','com.google','com.taobao'
}

再運行,發現又報錯
ut not exist
java.lang.ClassNotFoundException: com.ut.mini.UTAnalytics
在這裏插入圖片描述
我們再次添加包名

aspectjx{
    exclude 'androidx','com.google','com.taobao','com.ut'
}

Sync後,成功運行

另外
1.我的項目使用的組件化的架構,我將使用@Aspect註解的代碼放到了app的module下,apply plugin: 'android-aspectjx’和implementation 'org.aspectj:aspectjrt:1.8.+'也在app的module下,其它情況(比如將配置放到common-lib庫中或者其它module)我都試了試,我這邊都有報錯;
2.最好把不需要掃描的三方庫都加到exclude,可以提升編譯效率及規避部分第三方庫出現的編譯兼容性問題。
3.當我們同步項目的時候或者debug運行項目的時候
在這裏插入圖片描述
提示Download maven-metadata.xml…
我有時會遇到time out 的情況,報錯
Unable to load Maven meta-data from …
我們將implementation ‘org.aspectj:aspectjrt:1.8.+’ 修改爲具體版本號,因爲每次build時會請求倉庫,我公司的網比較慢加上國內訪問倉庫就比較慢。
我們可以把鼠標放到org.aspectj:aspectjrt:1.8.+這一行上,自動會提示新版本。
在這裏插入圖片描述
我們引入具體版本後,問題可以得以解決;除此之外我們還可以在gradle.properties中配置一些可以提升構建速度的代碼

org.gradle.parallel=true
org.gradle.daemon=true
android.enableBuildCache=true

先記載這些,有相關問題的小夥伴可以留言討論一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章