天天看點

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