XTrace是AOP在Android的簡(jiǎn)單實(shí)踐腿倚,踩了一系列坑。希望能幫助您將AOP運(yùn)用到Android蚯妇。歡迎star敷燎、fork,期待提出您的寶貴意見箩言。
以下是我的踩坑筆記
AOP概述
做過J2EE開發(fā)的同學(xué)對(duì)AOP一定非常熟悉硬贯,在J2EE中,面向切面編程的實(shí)現(xiàn)一般有AspectJ陨收、Spring Aop等饭豹,抱歉,我只用過這兩個(gè)。AOP的主要名詞有:Aspect墨状、Pointcut、Advise等菲饼。在這里肾砂,我選用AspectJ做Android平臺(tái)的AOP。
Gradle插件
AspectJ是在編譯階段對(duì)字節(jié)碼進(jìn)行操作宏悦,因此需要它獨(dú)立的編譯器ajc镐确。在Android Studio中,可以通過Gradle腳本啟用ajc編譯器饼煞。為了方便開發(fā)AOP源葫,我搞了個(gè)小插件(很簡(jiǎn)單的),在需要引入AOP的library或Application中引入就好砖瞧。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'cn.droidlover:AspectJAs:1.0.2'
}
}
在相應(yīng)的模塊中使用插件:
apply plugin: 'cn.droidlover.aspectjas'
開發(fā)Gradle插件遇到的坑
- 需要在java目錄下建立resources/META-INF/gradle-plugins目錄
- 需要在radle-plugins目錄下建立plugin_name.properties文件息堂。如上面的插件名稱為cn.droidlover.aspectjas,則該文件名應(yīng)為:cn.droidlover.aspectjas.properties
- 文件內(nèi)容為:
implementation-class=插件入口path
如上述插件則為:
implementation-class=cn.droidlover.aspectjas.AspectJAs
插件入口即 class implements Plugin<Project>的類块促,每個(gè)插件只有一個(gè)入口荣堰。
- 可以將自己寫的插件上傳到本地maven倉庫
apply plugin: 'groovy'
apply plugin: "maven"
dependencies {
compile gradleApi()
compile localGroovy()
compile 'com.android.tools.build:gradle:2.1.0'
}
repositories {
jcenter()
}
// 上傳到本地代碼庫
uploadArchives{
repositories{
mavenDeployer{
repository(url:uri('../repo'))
pom.groupId = 'cn.droidlover' // 組名
pom.artifactId = 'AspectJAs' // 插件名
pom.version = '1.0.2' // 版本號(hào)
}
}
}
使用的時(shí)候只需要加上maven地址就好:
maven{
url uri('/repo')
}
XTrace說明
XTrace的目標(biāo)是具有@Trace注解的方法,其主要功能是:將執(zhí)行方法標(biāo)識(shí)竭翠、執(zhí)行方法名稱振坚、執(zhí)行參數(shù)傳值、執(zhí)行時(shí)間斋扰、返回值等進(jìn)行Log日志輸出渡八。
運(yùn)行結(jié)果為:
使用方法:
@Trace("聊天")
public void onChat(View view) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Trace("求和")
private int sum(int a, int b) {
return a + b;
}
您可以根據(jù)這個(gè)進(jìn)行擴(kuò)展,比如進(jìn)行用戶行為的統(tǒng)計(jì)等传货。
我的其他分享: