前言
首先,Aspectj目前在Android中的使用已經(jīng)非常廣泛了词裤,比如說很多第三方統(tǒng)計的SDK都是利用它來做切點進行統(tǒng)計的,樓主還是在今年才開始接觸它,感覺到它的強大之后就無法自拔了掠归,經(jīng)過多次試驗之后來記錄下它的使用方式。
名詞解釋
1.AOP
AOP是Aspect Oriented Programming的縮寫悄泥,也就是面相切面編程虏冻。它通過預編譯或者運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護。它是函數(shù)式編程的一種衍生泛型弹囚。利用AOP可以對業(yè)務(wù)邏輯的各個部分進行隔離厨相,從而使得業(yè)務(wù)邏輯之間的耦合度降低,提高程序的可重用性鸥鹉。
2.AspectJ
AspectJ 是使用最為廣泛的 AOP 實現(xiàn)方案蛮穿,適用于 Java 平臺,官網(wǎng)地址:http://www.eclipse.org/aspectj/ 毁渗。AspectJ 是在靜態(tài)織入代碼践磅,即在編譯期注入代碼的。
AspectJ在Android中的使用
一灸异、插件化使用
查看地址:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
根據(jù)說明來進行配置:
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肺樟、然后還需要根據(jù)自己項目的特點有一些配置aspectjx 的一些東西檐春。
根據(jù)說明來看的話配置以上幾點就可以了,但我這樣操作之后一直都沒有解決問題么伯,會報一個 "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
//在構(gòu)建工程時,執(zhí)行編輯
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:這里主講配置,不講代碼
注意
最后講下標題的內(nèi)容摆屯,當AspectJ在libray中使用時邻遏,需要注意你的切片代碼注解是在哪個module下的話糠亩,就需要在哪個module的buidl.gradle中添加第二點說的配置。
最后准验,如果有任何問題可以評論或者聯(lián)系我赎线,謝謝!Demo地址:https://download.csdn.net/download/ling9400/12060639