Android AOP 实践笔记

栏目: 编程工具 · 发布时间: 7年前

内容简介: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 用于声明注解。

Android AOP 实践笔记 这里Contract注解,是为了标注一个Activity需要使用MVP模式。并且需要自动生成MVP代码。

Android AOP 实践笔记

  • 再建立另一个module 用于处理这些注解。

Android AOP 实践笔记

注意这里必须是 java 库,也就是说gradle要apply java 插件,否则将引用不到javax包下的内容。

这个时候,我们只需要让ConrtactProcessor 继承 AbstractProcess,并且实现process函数去处理这个注解即可。

这里生成代码使用了Javapoet, 我们的目标是在Activity上面使用@Contract注解自动生成MVP代码,并且@Inject自动注入presenter,如下图:

Android AOP 实践笔记 这些红掉的代码,就是我们想要利用APT生成的代码,@Inject 用于表示注入mPresenter,这样就不用我们自己new了,当然这里是最简单的注入展示。 我们反过来想想,想让这些代码可以工作,生成的代码应该是怎样的。生成的代码路径如下所示:

Android AOP 实践笔记

MVP部分的代码不多说,来说一说presenter是如何注入的,其实很简单:

Android AOP 实践笔记 结合上面红色的代码看,应该会一目了然吧。

关于如何生成代码,只需要在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结束进行计时操作。

Android AOP 实践笔记

另外一个是登录检验操作,我们理想的事情是给一个函数添加一个注解,并且这个注解来判断是否登录执行相应的转跳提示操作。

示意如下,比如onResume需要判断是否登录,只需要一个注解

Android AOP 实践笔记

我们把需要的逻辑判断写在@AspetJ 注解的类里即可。

Android AOP 实践笔记

这样不管是埋点还是性能监控还是登录权限检验,都可以异常方便的执行。再也不像原先那样麻烦了。

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

Android AOP 实践笔记

在transform里,我们就可以对所有文件进行操作了

Android AOP 实践笔记

ClassInjector 主要是使用Javassist进行对class文件的改变操作。

Android AOP 实践笔记

值得注意的是,如果操作的过程中需要使用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 实践笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

慕课革命

慕课革命

汤敏 / 中信出版社 / 2015-1-1 / 39.00元

《慕课革命》,国内唯一一本关于全方面了解慕课的权威著作,全面阐述慕课理念与中国实践。 林毅夫、俞敏洪、徐小平、王强作序推。 大规模在线教育的慕课革命大幕已经拉开,这是一场基于互联网及移动互联网的教育大变革。根据网易教育联合有道发起的《2013中国在线教育新趋势调查报告》揭示,中国在线教育正呈现出六大趋势,包括互联网成为人们获取知识的最常见渠道;移动端学习方式已经开始成为人们接受的学习方......一起来看看 《慕课革命》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具