Android中使用AspectJ詳解
什么是AOP
AOP是Aspect Oriented Programming的縮寫(xiě),即『面向切面編程』。它和我們平時(shí)接觸到的OOP都是編程的不同思想,OOP,即『面向?qū)ο缶幊獭唬岢氖菍⒐δ苣K化,對(duì)象化,而AOP的思想,則不太一樣,它提倡的是針對(duì)同一類問(wèn)題的統(tǒng)一處理,當(dāng)然,我們?cè)趯?shí)際編程過(guò)程中,不可能單純的安裝AOP或者OOP的思想來(lái)編程,很多時(shí)候,可能會(huì)混合多種編程思想,大家也不必要糾結(jié)該使用哪種思想,取百家之長(zhǎng),才是正道。
那么AOP這種編程思想有什么用呢,一般來(lái)說(shuō),主要用于不想侵入原有代碼的場(chǎng)景中,例如SDK需要無(wú)侵入的在宿主中插入一些代碼,做日志埋點(diǎn)、性能監(jiān)控、動(dòng)態(tài)權(quán)限控制、甚至是代碼調(diào)試等等。
AspectJ
AspectJ實(shí)際上是對(duì)AOP編程思想的一個(gè)實(shí)踐,當(dāng)然,除了AspectJ以外,還有很多其它的AOP實(shí)現(xiàn),例如ASMDex,但目前最好、最方便的,依然是AspectJ。
在Android項(xiàng)目中使用AspectJ
在android中配置aspectj是特別麻煩的,嘗試在android studio中直接配置aspectj,折騰了半天沒(méi)有成功,就放棄了,還好github上有個(gè)開(kāi)源的sdkhttps://github.com/HujiangTechnology/gradle_plugin_android_aspectjx,可以直接拿來(lái)用,很方便。
接入說(shuō)明
在項(xiàng)目的根目錄的build.gradle文件中添加依賴,修改后文件如下
repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.0' classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.8' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }
然后在項(xiàng)目或者庫(kù)的build.gradle文件中添加AspectJ的依賴
compile 'org.aspectj:aspectjrt:1.8.9'
同時(shí)在該文件中加入AspectJX模塊
apply plugin: 'android-aspectjx'
aspectjx默認(rèn)會(huì)遍歷項(xiàng)目編譯后所有的.class文件和依賴的第三方庫(kù)去查找符合織入條件的切點(diǎn),為了提升編譯效率,可以加入過(guò)濾條件指定遍歷某些庫(kù)或者不遍歷某些庫(kù)。
includeJarFilter和excludeJarFilter可以支持groupId過(guò)濾,artifactId過(guò)濾,或者依賴路徑匹配過(guò)濾
aspectjx { //織入遍歷符合條件的庫(kù) includeJarFilter 'universal-image-loader', 'AspectJX-Demo/library' //排除包含‘universal-image-loader'的庫(kù) excludeJarFilter 'universal-image-loader' }
使用
創(chuàng)建一個(gè)AspectTest的類,
@Aspect public class AspectTest { final String TAG = AspectTest.class.getSimpleName(); @Before("execution(* *..MainActivity+.on**(..))") public void method(JoinPoint joinPoint) throws Throwable { MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); String className = joinPoint.getThis().getClass().getSimpleName(); Log.e(TAG, "class:" + className); Log.e(TAG, "method:" + methodSignature.getName()); } }
MainActivty的代碼如下
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
log如下
log
通過(guò)build之后會(huì)生成一個(gè)aspected.jar的文件
截圖
反編譯這個(gè)jar,會(huì)發(fā)現(xiàn)它在MainActivity的onCreate中插入了幾行代碼。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
詳解Android 手機(jī)衛(wèi)士設(shè)置向?qū)ы?yè)面
這篇文章主要介紹了詳解Android 手機(jī)衛(wèi)士設(shè)置向?qū)ы?yè)面的相關(guān)資料,需要的朋友可以參考下2016-04-04TabLayout關(guān)聯(lián)ViewPager后不顯示文字的解決方法
這篇文章主要為大家詳細(xì)介紹了TabLayout關(guān)聯(lián)ViewPager后不顯示文字的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Android編程實(shí)現(xiàn)設(shè)置TabHost當(dāng)中字體的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)設(shè)置TabHost當(dāng)中字體的方法,涉及Android針對(duì)TabHost屬性操作的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-12-12Android開(kāi)發(fā)之MediaPlayer多媒體(音頻,視頻)播放工具類
這篇文章主要介紹了Android開(kāi)發(fā)之MediaPlayer多媒體(音頻,視頻)播放工具類,涉及Android針對(duì)音頻文件的讀取、播放、暫停、繼續(xù)等操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12你值得擁有的Android Studio開(kāi)發(fā)小技巧
這篇文章主要為大家分享了值得擁有的Android Studio開(kāi)發(fā)小技巧,介紹幾個(gè)比較好用的技巧和快捷鍵,提升我們的編碼效率,感興趣的小伙伴們可以參考一下2016-06-06Android實(shí)現(xiàn)基于ZXing快速集成二維碼掃描功能
這篇文章主要為大家詳細(xì)介紹了Android二維碼掃描ZXing快速項(xiàng)目集成的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android checkbox的listView具體操作方法
這篇文章主要介紹了Android checkbox的listView具體操作方法,重點(diǎn)就是存儲(chǔ)每個(gè)checkbox的狀態(tài)值,感興趣的小伙伴們可以參考一下2015-12-12Android自定義控件實(shí)現(xiàn)圓形進(jìn)度CircleProgressBar
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)圓形進(jìn)度CircleProgressBar,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05