Jet AOP
AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
Jet-AOP框架;虽然xposed,dexposed非常强大,但由于Android的碎片化比较严重,兼容问题永远是一座无法逾越的大山. 因此考虑用AspectJ来实现;
参考的主要项目代码为JakeWharton大神的Hugo。Hugo是一个非常容易使用、易扩展的Aop例子
更重要的是你可以 实现 任何AOP(面向切面)的代码。具体的实现参考 AspectJ 功能;
http://www.eclipse.org/aspectj/
- 可以配合Jet 一起使用,功能更加强大,开发速度杠杠的
Jet - :smile: 如果喜欢,请给个Star:smile:
Fetures
- 重复的功能,可以通过切面的方法来实现;
部分已实现的功能 Use
注解名称 | 作用 | 备注 |
---|---|---|
@JThread | 借助rxjava,异步执行app中的方法 | |
@JLogMethod | 将方法的入参和出参都打印出来,可以用于调试 | |
@JTryCatch | 可以安全地执行方法,而无需考虑是否会抛出运行时异常 | |
@JLogTime | 用于追踪某个方法花费的时间,可以用于性能调优的评判 |
@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(..) 方法参数 : [10]
MainActivity.testLog(..) 方法 返回值 : 0
MainActivity.testLog 执行时间: [3ms]
AspectJ 实现 无侵入方法监控例子(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
待实现 TODO,
待实现区域,列了一些我想到的通用功能, 但是项目里面肯定还存在很多通用的功能;欢迎 各位 提Issue,让项目更强大;
- @JPermission([int[]])
方法需要的申请的权限数组; 比如:
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
@JAuthorize()
方法是否需要登录才能调用,否则跳到登录页面;
更强大的方式可以参考 Apache Shiro使用Kotlin 代码 重写;
Problem
- Android Studio的
Instant Run
功能有时会对你的编译有影响,当出现这种情况时,关闭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'
}
参考
用aspectjx实现的简单、方便、省事的Android M动态权限配置框架
AspectJ官网
AspectJ Programming Guide
AspectJ Development Environment Guide
AspectJ NoteBook
AOP 研究
AspectJ插件
SAF-AOP DEMO