Android中使用AspectJ详解

 更新时间:2017年04月07日 09:15:14   作者:vonnie  
本文主要介绍了Android中使用AspectJ的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧

什么是AOP

AOP是Aspect Oriented Programming的缩写,即『面向切面编程』。它和我们平时接触到的OOP都是编程的不同思想,OOP,即『面向对象编程』,它提倡的是将功能模块化,对象化,而AOP的思想,则不太一样,它提倡的是针对同一类问题的统一处理,当然,我们在实际编程过程中,不可能单纯的安装AOP或者OOP的思想来编程,很多时候,可能会混合多种编程思想,大家也不必要纠结该使用哪种思想,取百家之长,才是正道。

那么AOP这种编程思想有什么用呢,一般来说,主要用于不想侵入原有代码的场景中,例如SDK需要无侵入的在宿主中插入一些代码,做日志埋点、性能监控、动态权限控制、甚至是代码调试等等。

AspectJ

AspectJ实际上是对AOP编程思想的一个实践,当然,除了AspectJ以外,还有很多其它的AOP实现,例如ASMDex,但目前最好、最方便的,依然是AspectJ。

在Android项目中使用AspectJ

在android中配置aspectj是特别麻烦的,尝试在android studio中直接配置aspectj,折腾了半天没有成功,就放弃了,还好github上有个开源的sdkhttps://github.com/HujiangTechnology/gradle_plugin_android_aspectjx,可以直接拿来用,很方便。

接入说明

在项目的根目录的build.gradle文件中添加依赖,修改后文件如下

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

  // NOTE: Do not place your application dependencies here; they belong
  // in the individual module build.gradle files
}

然后在项目或者库的build.gradle文件中添加AspectJ的依赖

compile 'org.aspectj:aspectjrt:1.8.9'

同时在该文件中加入AspectJX模块

apply plugin: 'android-aspectjx'

aspectjx默认会遍历项目编译后所有的.class文件和依赖的第三方库去查找符合织入条件的切点,为了提升编译效率,可以加入过滤条件指定遍历某些库或者不遍历某些库。

includeJarFilter和excludeJarFilter可以支持groupId过滤,artifactId过滤,或者依赖路径匹配过滤

aspectjx {
  //织入遍历符合条件的库
  includeJarFilter 'universal-image-loader', 'AspectJX-Demo/library'
  //排除包含‘universal-image-loader'的库
  excludeJarFilter 'universal-image-loader'
}

使用

创建一个AspectTest的类,

@Aspect
public class AspectTest {
  final String TAG = AspectTest.class.getSimpleName();

  @Before("execution(* *..MainActivity+.on**(..))")
  public void method(JoinPoint joinPoint) throws Throwable {
    MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
    String className = joinPoint.getThis().getClass().getSimpleName();

    Log.e(TAG, "class:" + className);
    Log.e(TAG, "method:" + methodSignature.getName());
  }
}

MainActivty的代码如下

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }
}

log如下

log

通过build之后会生成一个aspected.jar的文件

截图

反编译这个jar,会发现它在MainActivity的onCreate中插入了几行代码。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • Android入门教程之创建样式与主题

    Android入门教程之创建样式与主题

    通过这篇文章你将学到如何创建自定义的样式和主题,并且你还能学到如何使用Android Studio的工具和快捷方式来加快样式的创建。下面来一起看看吧。
    2016-08-08
  • Kotlin Navigation可视化开发详解

    Kotlin Navigation可视化开发详解

    Navigation 是 JetPack 中的一个组件,用于方便的实现页面的导航,所以抽象出了一个 destination 的概念,大部分情况一个 destination 就表示一个 Fragment,但是它同样可以指代 Activity、其它的导航图
    2023-02-02
  • 基于android中的各种颜色在drawable.xml中的值详解

    基于android中的各种颜色在drawable.xml中的值详解

    本篇文章是对在android中的各种颜色在drawable.xml中的值进行了详细的介绍。需要的朋友参考下
    2013-05-05
  • Android Wear计时器开发

    Android Wear计时器开发

    这篇文章主要介绍了Android Wear计时器开发,需要的朋友可以参考下
    2014-11-11
  • Android中ListActivity用法实例分析

    Android中ListActivity用法实例分析

    这篇文章主要介绍了Android中ListActivity用法,结合实例形式较为详细的分析了ListActivity功能,注意事项与相关使用技巧,需要的朋友可以参考下
    2016-02-02
  • Android设置Padding和Margin(动态/静态)的方法实例

    Android设置Padding和Margin(动态/静态)的方法实例

    如何在java代码中设置margin,也就是组件与组件之间的间距,下面这篇文章主要给大家介绍了关于Android设置Padding和Margin(动态/静态)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Android短信验证码自动填充功能

    Android短信验证码自动填充功能

    点击获取验证码按钮,收到短信,当前应用不需要退出程序就可以获取到短信中的验证码,并自动填充,这篇文章主要介绍了Android短信验证码自动填充功能,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android实现ListView左右滑动删除和编辑

    Android实现ListView左右滑动删除和编辑

    这篇文章主要为大家详细介绍了Android实现ListView左右滑动删除和编辑的相关资料,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 详解Android之图片加载框架Fresco基本使用(二)

    详解Android之图片加载框架Fresco基本使用(二)

    本篇文章主要介绍了Android之图片加载框架Fresco基本使用,可以实现进度条和图片缩放等内容,有兴趣的可以了解一下。
    2016-12-12
  • Android百度地图定位后获取周边位置的实现代码

    Android百度地图定位后获取周边位置的实现代码

    这篇文章主要为大家详细介绍了Android百度地图定位后获取周边位置的实现代码,准确获取周边地理位置,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-01-01

最新评论