这是一份巨简单的安卓使用AspectJ项目;

Jet AOP

License

Download

Github file size

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文件和依赖的第三方库去查找符合织入条件的切点,为了提升编译效率,可以加入过滤条件指定遍历某些库或者不遍历某些库。

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'
}

参考

  • 用aspectjx实现的简单、方便、省事的Android M动态权限配置框架

  • AspectJ官网

  • AspectJ Programming Guide

  • AspectJ Development Environment Guide

  • AspectJ NoteBook

  • AOP 研究

  • AspectJ插件

  • SAF-AOP DEMO

你可能感兴趣的:(这是一份巨简单的安卓使用AspectJ项目;)