想在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())