Jet AOP
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方法攔截)
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文件和依賴的第三方庫去查找符合織入條件的切點,為了提升編譯效率,可以加入過濾條件指定遍歷某些庫或者不遍歷某些庫。
includeJarFilter和excludeJarFilter可以支持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'
}