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