這是一份巨簡(jiǎn)單的安卓使用AspectJ項(xiàng)目过咬;

Jet AOP


Download
Download

Github file size
Github file size

AOP是OOP的延續(xù)大渤,是軟件開發(fā)中的一個(gè)熱點(diǎn),也是spring框架中的一個(gè)重要內(nèi)容掸绞,是函數(shù)式編程的一種衍生范型泵三。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低衔掸,提高程序的可重用性切黔,同時(shí)提高了開發(fā)的效率。

Jet-AOP框架具篇;雖然xposed纬霞,dexposed非常強(qiáng)大,但由于Android的碎片化比較嚴(yán)重驱显,兼容問題永遠(yuǎn)是一座無法逾越的大山. 因此考慮用AspectJ來實(shí)現(xiàn)诗芜;

參考的主要項(xiàng)目代碼為JakeWharton大神的Hugo。Hugo是一個(gè)非常容易使用埃疫、易擴(kuò)展的Aop例子

更重要的是你可以 實(shí)現(xiàn) 任何AOP(面向切面)的代碼伏恐。具體的實(shí)現(xiàn)參考 AspectJ 功能;

http://www.eclipse.org/aspectj/

  • 可以配合Jet 一起使用栓霜,功能更加強(qiáng)大翠桦,開發(fā)速度杠杠的
    Jet
  • :smile: 如果喜歡,請(qǐng)給個(gè)Star:smile:

Fetures

  • 重復(fù)的功能胳蛮,可以通過切面的方法來實(shí)現(xiàn)销凑;

部分已實(shí)現(xiàn)的功能 Use

注解名稱 作用 備注
@JThread 借助rxjava,異步執(zhí)行app中的方法
@JLogMethod 將方法的入?yún)⒑统鰠⒍即蛴〕鰜?可以用于調(diào)試
@JTryCatch 可以安全地執(zhí)行方法,而無需考慮是否會(huì)拋出運(yùn)行時(shí)異常
@JLogTime 用于追蹤某個(gè)方法花費(fèi)的時(shí)間,可以用于性能調(diào)優(yōu)的評(píng)判

@JThread的使用方法:

    @JThread
    private void useAsync() {
        Log.e(TAG, " thread=" + Thread.currentThread().getId());
        Log.e(TAG, "ui thread=" + Looper.getMainLooper().getThread().getId());
    }

@JLogMethod 等;

@JTryCatch
@JLogTime
@JLogMethod
public int testLog(int k) {
    int i = k + 100;
    int j = i++;
    j=j/0;
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return j;
}

LogCat 打咏龃丁:

 MainActivity.testLog(..) 方法參數(shù) : [10]
 MainActivity.testLog(..) 方法 返回值 : 0
 MainActivity.testLog 執(zhí)行時(shí)間: [3ms]

AspectJ 實(shí)現(xiàn) 無侵入方法監(jiān)控例子(View.onClick方法攔截)

無侵入方法監(jiān)控例子

Download

在根目錄下的build.gradle中添加

buildscript {
     repositories {
         jcenter()
     }
     dependencies {
         classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.8'
     }
 }

在app 模塊目錄下的build.gradle中添加

apply plugin: 'com.hujiang.android-aspectjx'

...

dependencies {
    compile 'com.meiyou.framework:jet-aop:0.0.1'
    ...
}

基于aspectj的AOP斗幼,無需使用耗費(fèi)性能的反射.不過,需要在build.gradle中配置一下aspectj

待實(shí)現(xiàn) TODO,

待實(shí)現(xiàn)區(qū)域抚垄,列了一些我想到的通用功能蜕窿, 但是項(xiàng)目里面肯定還存在很多通用的功能谋逻;歡迎 各位 提Issue,讓項(xiàng)目更強(qiáng)大桐经;

  • @JPermission([int[]])
    方法需要的申請(qǐng)的權(quán)限數(shù)組毁兆; 比如:
      String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
  • @JAuthorize()
    方法是否需要登錄才能調(diào)用,否則跳到登錄頁面阴挣;
    更強(qiáng)大的方式可以參考 Apache Shiro

  • 使用Kotlin 代碼 重寫气堕;

Problem

  • Android Studio的Instant Run功能有時(shí)會(huì)對(duì)你的編譯有影響,當(dāng)出現(xiàn)這種情況時(shí)屯吊,關(guān)閉Instant Run功能送巡,
  • aspectj代碼編譯時(shí)會(huì)報(bào)一些如下的錯(cuò)摹菠,找到對(duì)應(yīng)的庫盒卸,把這個(gè)庫過濾掉就可以了。

aspectjx配置

aspectjx默認(rèn)會(huì)遍歷項(xiàng)目編譯后所有的.class文件和依賴的第三方庫去查找符合織入條件的切點(diǎn)次氨,為了提升編譯效率蔽介,可以加入過濾條件指定遍歷某些庫或者不遍歷某些庫。

includeJarFilterexcludeJarFilter可以支持groupId過濾煮寡,artifactId過濾虹蓄,或者依賴路徑匹配過濾

aspectjx {
    //織入遍歷符合條件的庫
    includeJarFilter 'universal-image-loader', 'AspectJX-Demo/library'
    //排除包含‘universal-image-loader’的庫
    excludeJarFilter 'universal-image-loader'
}

. 忽略groupId為org.apache.httpcomponents的庫

aspectjx {
    excludeJarFilter 'org.apache.httpcomponents'
}

. 忽略artifactId為gson的庫

    aspectjx {
        excludeJarFilter 'gson'
    }

. 忽略jar alisdk-tlog-1.jar

    aspectjx {
        excludeJarFilter 'alisdk-tlog-1'
    }
  • 忽略所有依賴的庫
aspectjx {
    excludeJarFilter '.jar'
}

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薇组,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坐儿,更是在濱河造成了極大的恐慌律胀,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件貌矿,死亡現(xiàn)場(chǎng)離奇詭異炭菌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逛漫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門黑低,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酌毡,你說我怎么就攤上這事克握。” “怎么了枷踏?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵玛荞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我呕寝,道長(zhǎng)勋眯,這世上最難降的妖魔是什么婴梧? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮客蹋,結(jié)果婚禮上塞蹭,老公的妹妹穿的比我還像新娘。我一直安慰自己讶坯,他們只是感情好番电,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辆琅,像睡著了一般漱办。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婉烟,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天娩井,我揣著相機(jī)與錄音,去河邊找鬼似袁。 笑死洞辣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昙衅。 我是一名探鬼主播扬霜,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼而涉!你這毒婦竟也來了著瓶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤啼县,失蹤者是張志新(化名)和其女友劉穎材原,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谭羔,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡华糖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘟裸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片客叉。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖话告,靈堂內(nèi)的尸體忽然破棺而出兼搏,到底是詐尸還是另有隱情,我是刑警寧澤沙郭,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布佛呻,位于F島的核電站,受9級(jí)特大地震影響病线,放射性物質(zhì)發(fā)生泄漏吓著。R本人自食惡果不足惜鲤嫡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绑莺。 院中可真熱鬧暖眼,春花似錦、人聲如沸纺裁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欺缘。三九已至栋豫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谚殊,已是汗流浹背丧鸯。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留络凿,地道東北人骡送。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓昂羡,卻偏偏與公主長(zhǎng)得像絮记,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虐先,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容