這是一份巨簡單的安卓使用AspectJ項目;

Jet AOP


Download
Download

Github file size
Github file size

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

Jet-AOP框架;雖然xposed,dexposed非常強大,但由于Android的碎片化比較嚴重,兼容問題永遠是一座無法逾越的大山. 因此考慮用AspectJ來實現(xiàn);

參考的主要項目代碼為JakeWharton大神的Hugo。Hugo是一個非常容易使用、易擴展的Aop例子

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

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

  • 可以配合Jet 一起使用,功能更加強大,開發(fā)速度杠杠的
    Jet
  • :smile: 如果喜歡,請給個Star:smile:

Fetures

  • 重復的功能,可以通過切面的方法來實現(xiàn);

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

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

@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 打?。?/p>

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

AspectJ 實現(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,無需使用耗費性能的反射.不過,需要在build.gradle中配置一下aspectj

待實現(xiàn) TODO,

待實現(xiàn)區(qū)域,列了一些我想到的通用功能, 但是項目里面肯定還存在很多通用的功能;歡迎 各位 提Issue,讓項目更強大;

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

  • 使用Kotlin 代碼 重寫;

Problem

  • Android Studio的Instant Run功能有時會對你的編譯有影響,當出現(xiàn)這種情況時,關(guān)閉Instant Run功能,
  • aspectj代碼編譯時會報一些如下的錯,找到對應的庫,把這個庫過濾掉就可以了。

aspectjx配置

aspectjx默認會遍歷項目編譯后所有的.class文件和依賴的第三方庫去查找符合織入條件的切點,為了提升編譯效率,可以加入過濾條件指定遍歷某些庫或者不遍歷某些庫。

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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容