在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
先记载这些,有相关问题的小伙伴可以留言讨论一下
更多推荐
所有评论(0)