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中插入了几行代码。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
上一篇: Nginx
推荐阅读
-
详解Android中的NestedScrolling机制带你玩转嵌套滑动
-
Android中的Selector的用法详解及实例
-
Android AsyncTask详解及使用方法
-
Android中ToggleButton开关状态按钮控件使用方法详解
-
Android中ToggleButton开关状态按钮控件使用方法详解
-
Android中CheckBox复选框控件使用方法详解
-
Android中SeekBar拖动条控件使用方法详解
-
Android开发笔记之:一分钟学会使用Logcat调试程序的详解
-
Android中ImageView使用网络图片资源的方法
-
Android插件化-RePlugin项目集成与使用详解