内容简介: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 实践笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Transcending CSS
Andy Clarke、Molly E. Holzschlag / New Riders / November 15, 2006 / $49.99
As the Web evolves to incorporate new standards and the latest browsers offer new possibilities for creative design, the art of creating Web sites is also changing. Few Web designers are experienced p......一起来看看 《Transcending CSS》 这本书的介绍吧!