在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

先记载这些,有相关问题的小伙伴可以留言讨论一下

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