内容简介:Android AOP 实践笔记
最近博客更新越来越慢了,有两方面原因:
1.没啥好写的。
2.应该沉下心好好沉淀自己,积累一些东西,博客写的太频繁有”刷博客“之嫌,还容易浮躁。
浮躁是大忌 ,所以还是沉下心好好学吧。
网上已经有了很多类似的文章,这里再写一次是为了自己当做笔记,主要是对APT,AspectJ、Javassist的简单实用进行记录,方便以后翻阅。
AOP是什么这里不多作解释了,个人理解总结下来就是相对于各个垂直深入的业务逻辑,每个业务逻辑深度的某个层面他们有需要共同的特征,此时对这种特征进行统一的处理,也就是所谓的AOP(欢迎拍砖哈,技术在讨论中提升)
主要应用场景:
- 权限检查
- 日志记录
- 性能监控
- 埋点操作
Android 下一些可以进行AOP的工具
APT
在编译时生成 .java 文件。
代表作品 ButterKnife 、 DataBinding、 EventBus3、Dagger2 等。
AspectJ
在.java编译为.class的时候,进行代码注入。
代表作品: Hugo
Javassist
对已经编译好的class文件进行操作。
代表作品: 各类热修复框架(为了解决类校验问题)。
各个 工具 操作时机图
这里盗一张图。原图地址: http://www.jianshu.com/p/dca3e2c8608a
具体用法
APT
APT是编译时生成代码的技术, 主要用到了注解 以及处理注解的Process
这里我写一个简单的小例子,来展示如何使用APT,这个例子类似于 MVPHelper 的功能,但其实是没有什么乱用的,只是展示而已。
- 建立一个module 用于声明注解。
这里Contract注解,是为了标注一个Activity需要使用MVP模式。并且需要自动生成MVP代码。
- 再建立另一个module 用于处理这些注解。
注意这里必须是 java 库,也就是说gradle要apply java 插件,否则将引用不到javax包下的内容。
这个时候,我们只需要让ConrtactProcessor 继承 AbstractProcess,并且实现process函数去处理这个注解即可。
这里生成代码使用了Javapoet, 我们的目标是在Activity上面使用@Contract注解自动生成MVP代码,并且@Inject自动注入presenter,如下图:
这些红掉的代码,就是我们想要利用APT生成的代码,@Inject 用于表示注入mPresenter,这样就不用我们自己new了,当然这里是最简单的注入展示。 我们反过来想想,想让这些代码可以工作,生成的代码应该是怎样的。生成的代码路径如下所示:
MVP部分的代码不多说,来说一说presenter是如何注入的,其实很简单:
结合上面红色的代码看,应该会一目了然吧。
关于如何生成代码,只需要在process方法中使用javapoet即可,代码比较简单繁琐,这里就不贴了,有需要的可以到文章尾部的链接查看代码。
AspetJ
AspetJ的引入比较简单,主要是沪江公司对AspetJ进行了一些Android方面的适配。
在gradle添加
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.10'
以及
apply plugin: 'android-aspectjx'
使用的时候,只需要新建一个类,并且使用@Aspect注解,即可对需要hook的类生效,并且无需直接使用。
因为在看这个之前有在用Xposed,所以感觉两个很像,上手很快。
我们将要使用这个工具实现Activity 启动时间的监控,以及登录权限管理的注入,以往判断用户登录往往需要每个函数都判断一下最后执行逻辑,其实这完全可以注入进去,就像”切面“所说,需要登录的地方,一刀切。
实现Activity启动时间监控,这里写简单一点,单纯的从onCreate开始到onResume结束进行计时操作。
另外一个是登录检验操作,我们理想的事情是给一个函数添加一个注解,并且这个注解来判断是否登录执行相应的转跳提示操作。
示意如下,比如onResume需要判断是否登录,只需要一个注解
我们把需要的逻辑判断写在@AspetJ 注解的类里即可。
这样不管是埋点还是性能监控还是登录权限检验,都可以异常方便的执行。再也不像原先那样麻烦了。
Javassist
这个需要结合自定义gradle plugin一起操作,大家都知道apk编译的时候,先把java编译为class文件,接下来会变为dex文件,gradle提供了transform api,可以让我们class变为dex之前做任何想做的事情。
首先建立一个buildSrc的module,这里面创建的类都是groovy的类,所以扩展名要写groovy。至于内容嘛。。因为兼容java 随便你咯-。-
创建一个Plugin,叫做Regsiter, 只需要让他implement Plugin 插件即可, 此时重写apply方法,就可以在主工程中apply这个插件。
另外我们需要结合transform, 所以要给android插件注册一下transform
在transform里,我们就可以对所有文件进行操作了
ClassInjector 主要是使用Javassist进行对class文件的改变操作。
值得注意的是,如果操作的过程中需要使用android sdk内容,需要手动将 android.jar添加到 ClassPool里面。否则会提示找不到类的情况。
本文涉及Demo代码地址
https://github.com/githubwing/AopDemo欢迎加入Android地方酒馆(425983695)一起研究Android技术。
参考文章
1.http://www.jianshu.com/p/dca3e2c8608a
2.http://blog.csdn.net/eclipsexys/article/details/54425414
3.http://blog.csdn.net/u010386612/article/details/51131642
以上所述就是小编给大家介绍的《Android AOP 实践笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。