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