Android Aspectj在Library中的使用說明

前言

首先,Aspectj目前在Android中的使用已經非常廣泛了,比如說很多第三方統計的SDK都是利用它來做切點進行統計的,樓主還是在今年纔開始接觸它,感覺到它的強大之後就無法自拔了,經過多次試驗之後來記錄下它的使用方式。

名詞解釋

1.AOP

AOP是Aspect Oriented Programming的縮寫,也就是面相切面編程。它通過預編譯或者運行期動態代理實現程序功能的統一維護。它是函數式編程的一種衍生泛型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯之間的耦合度降低,提高程序的可重用性。

2.AspectJ

AspectJ 是使用最爲廣泛的 AOP 實現方案,適用於 Java 平臺,官網地址:http://www.eclipse.org/aspectj/ 。AspectJ 是在靜態織入代碼,即在編譯期注入代碼的。

AspectJ在Android中的使用

一、插件化使用

查看地址:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
根據說明來進行配置:
1、在根目錄的build.gradle中配置

dependencies {
        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.8'
        }

2、然後再在app項目的build.gradle裏應用插件

apply plugin: 'android-aspectjx'
//或者這樣也可以
apply plugin: 'com.hujiang.android-aspectjx'

3、然後還需要根據自己項目的特點有一些配置aspectjx 的一些東西。
根據說明來看的話配置以上幾點就可以了,但我這樣操作之後一直都沒有解決問題,會報一個 "zip file is empty"的錯誤,查了issues後還是沒有解決問題,所以這邊我主要講第二個。

二、直接使用aspectJ

1.在根目錄的build.gradle中配置

dependencies {
        classpath 'org.aspectj:aspectjtools:1.9.4'
        }

2.在app項目的build.gradle中添加

dependencies {
        implementation 'org.aspectj:aspectjrt:1.9.4'
        }

並且在build.gradle文件最後添加一下代碼

import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main

final def log = project.logger

//在構建工程時,執行編輯
android.libraryVariants.all{ variant ->
    if (!variant.buildType.isDebuggable()) {
        log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
        return;
    }

    JavaCompile javaCompile = variant.javaCompile
    javaCompile.doLast {
        String[] args = ["-showWeaveInfo",
                         "-1.9",
                         "-inpath", javaCompile.destinationDir.toString(),
                         "-aspectpath", javaCompile.classpath.asPath,
                         "-d", javaCompile.destinationDir.toString(),
                         "-classpath", javaCompile.classpath.asPath,
                         "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
        log.debug "ajc args: " + Arrays.toString(args)

        MessageHandler handler = new MessageHandler(true);
        new Main().run(args, handler);
        for (IMessage message : handler.getMessages(null, true)) {
            switch (message.getKind()) {
                case IMessage.ABORT:
                case IMessage.ERROR:
                case IMessage.FAIL:
                    log.error message.message, message.thrown
                    break;
                case IMessage.WARNING:
                    log.warn message.message, message.thrown
                    break;
                case IMessage.INFO:
                    log.info message.message, message.thrown
                    break;
                case IMessage.DEBUG:
                    log.debug message.message, message.thrown
                    break;
            }
        }
    }
}

3.添加切片代碼即可,注意@Pointcut的使用。ps:這裏主講配置,不講代碼

注意

最後講下標題的內容,當AspectJ在libray中使用時,需要注意你的切片代碼註解是在哪個module下的話,就需要在哪個module的buidl.gradle中添加第二點說的配置。

最後,如果有任何問題可以評論或者聯繫我,謝謝!Demo地址:https://download.csdn.net/download/ling9400/12060639

發佈了27 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章