首先我项目的结构如下:
我的项目依赖的顺序为buildSrc--->lib_common-->lib_flight_sdk-->lib_uav-->app
其中buildSrc中主要是对依赖的声明;
lib_common中是在dependency中添加依赖
步骤:
1.首先在buildSrc中声明依赖:
const val aspect_version="1.9.6"
//切面编程
const val aspect="org.aspectj:aspectjrt:${V.aspect_version}"
2.在lib_common的build.gradle中添加依赖:
//切面编程
implementation Deps.aspect
注意:不要在这个build.gradle中plugin中添加插件:android-aspectjx
plugins {
id 'com.android.application'
id "kotlin-android"
id 'kotlin-kapt'
id 'kotlin-android-extensions'
id 'android-aspectjx'
}
3.在lib_uav的build.gradle中添加依赖:
dependencies {
implementation Deps.aspect
}
4.在根目录的build.gradle中增加适配kotlin的插件gradle-android-plugin-aspectjx,并需要在repositories中增加jcenter:
repositories {
google()
mavenCentral()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.1'
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31'
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
}
5.gradle-wrapper.properties中设置:
//需要与gradle插件一致
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-rc-1-bin.zip
6.根目录gradle.properties中增加:
android.enableBuildCache=false
7.根目录的setting.gradle中需要更改:
将
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
更改为:
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
不然会报project的repository跟根目录的repository的冲突
8.在app的build.gradle中添加插件:android-aspectjx
//这里因为要使用kotlin,所以将插件添加在kotlin插件的下面
plugins {
id 'com.android.application'
id "kotlin-android"
id 'kotlin-kapt'
id 'kotlin-android-extensions'
id 'android-aspectjx'
}
//在android{}同层的目录下增加:
android{}
Aspectjx{
include 'XX' //这里最好是只包含你自己要用到注解和切面代码的包名,防止引起第三方依赖问题
}
dependencies{
implementation Deps.aspect
}
9.编写自定义注解和切片拦截,并添加注解在对应需要拦截的方法上
//1.注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
annotation class VerifySN {
}
//2.切片实现类
open class VerifySnAspect {
/**
* 找到处理的切点
* * *(..) 可以处理所有的方法
*/
@Pointcut("execution(@com.loyo.lib_uav.aspect.VerifySN * *(..))")
private fun verifySnBehavior(){}
/**
* 处理切面
*/
@Around("verifySnBehavior()")
@Throws(Throwable::class)
open fun verifySn(joinPoint: ProceedingJoinPoint){
//TODO 实现拦截功能
}
}
//3.在对应方法上增加注解
@VerifySN
open fun clickStartBtn(){
}
遇到的坑:
问题一:java.lang.NoSuchMethodError: No static method aspectOf()
解决方法:将插件android-aspectjx和aspectjx {}只能在app的build.gradle中,其他module中不能设置
问题二:zip file is empty
解决方法:按照上述的解决方法可以解决这个问题
问题三:设置的注解,但是没有进入切面拦截功能
解决方法:严格按照我上述的步骤,可以完美解决