天天看点

AspectJ-gradle-plugin-for-android:轻松让Android项目快速具备面向切面编程(Aspect Oriented Programming)的能力

想在Android中使用AspectJ进行面向切面的编程,集成步骤还是比较繁琐的。那能不能有个方便、简单、快捷方式呢?答案是可定的。

AspectJ-gradle-plugin-for-android是一个Gradle插件,它可以快速将AspectJ集成到Android应用程序中。只要你使用这个插件,你的项目将立即具备AOP(面向方面编程)的能力。

项目地址:https://github.com/averyzhong/AspectJ-gradle-plugin-for-android

该插件使用起来草鸡简单,只需两行gradle代码

1、项目根目录下的build.gradle文件中加入classpath 'com.avery.android.aspectj:aspectj-plugin:1.0.0‘

,如下所示

buildscript {
    repositories {
         google()
         jcenter()
               
    }    
    dependencies {
        ......
        classpath 'com.avery.android.aspectj:aspectj-plugin:1.0.0'
        ......  
    }
    ......
}
           

2、在app目录下的build.gradle文件中加入apply plugin: 'com.avery.android.aop,如下所示

apply plugin: 'com.avery.android.aspectj'
    
    android {
        ......
    }
    dependencies {
        ......
    }
           

就这么两行gradle代码,让后项目就具备面向切面编程能力了。不信吗?我们举个例子:通过AOP在MainActivity的生命周期方法中打印一段日志,MainActivity(com.avery.android.aspectj.example.MainActivity)代码如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

}
           

日志切面类如下:

@Aspect
public class ActivityLifecycleLogAspect {
    private static final String TAG = ActivityLifecycleLogAspect.class.getSimpleName();

    @Pointcut("execution(* com.avery.android.aspectj.example.MainActivity.on*(..))")
    public void logActivityLifecycle() {}

    @Before("logActivityLifecycle()")
    public void log(final JoinPoint joinPoint) {
        Log.v(TAG, "log: " + joinPoint.toLongString());
    }

}
           

OK,运行项目后放下在MainActivity的每个生命周期方法中被植入了日志切面,Logcat输出如下

V/ActivityLifecycleLogAspect: log: execution(protected void com.avery.android.aspectj.example.MainActivity.onCreate(android.os.Bundle))
V/ActivityLifecycleLogAspect: log: execution(protected void com.avery.android.aspectj.example.MainActivity.onStart())
V/ActivityLifecycleLogAspect: log: execution(protected void com.avery.android.aspectj.example.MainActivity.onResume())