首先我项目的结构如下:

我的项目依赖的顺序为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
- 解决方法:按照上述的解决方法可以解决这个问题
-
- 问题三:设置的注解,但是没有进入切面拦截功能
- 解决方法:严格按照我上述的步骤,可以完美解决