内容简介:AOP 是 Aspect Oriented Programming 的缩写,即“面向切面编程”。使用 AOP,可以在编译期间对代码进行动态管理, 以达到统一维护的目的。AOP 是 OOP 编程的一种延续,也是 Spring 框架中的一个重要模块。利用 AOP 可以对业务逻辑 的各个模块进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高开发的效率。利用 AOP,我们可以在无浸入的在宿主中插入一些代码逻辑,从而可以实现一些特殊的功能,比如日志埋点、性能监控、动态 权限控制、代码调
AOP
AOP 是 Aspect Oriented Programming 的缩写,即“面向切面编程”。使用 AOP,可以在编译期间对代码进行动态管理, 以达到统一维护的目的。AOP 是 OOP 编程的一种延续,也是 Spring 框架中的一个重要模块。利用 AOP 可以对业务逻辑 的各个模块进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高开发的效率。利用 AOP,我们可以在无浸入的在宿主中插入一些代码逻辑,从而可以实现一些特殊的功能,比如日志埋点、性能监控、动态 权限控制、代码调试等。
AOP 术语
以上概念,如果之前没有接触过,确实挺晦涩的。 我们下面有一段“白话”总结一下:
第一步:
我们通过定义一个表达式(PointCut)来告诉程序,我们需要对哪些地方增加额外的操作。通过这个表达式(PointCut), 我们得到那些需要通知的方法(JoinPoint)。
第二步:
我们还需要告诉程序,这些方法(JoinPoint)需要做怎样的增强(Advice): 1) 什么时候进行额外的操作(执行前 / 执行后 / 返回之前)? 2) 额外操作具体要做什么? 我们把以上两个步骤定义到一个地方(Aspect)。 上面两个步骤涉及到的被修改的对象,我们称之为目前对象(Target)。 完成上面的所有操作的动作,我们总称为织入(Weaving)。
AspectJ
AOP 是一个概念,一个规范,本身并没有设定具体语言的实现。AspectJ 实际上是对 AOP 编程思想的一个实现,它能够和 Java 配合起来使用。
AspectJ 的核心就是它的编译器 (ajc),它就做了一件事,将 AspectJ 的代码在编译期插入到目标程序当中,运行时跟在其 它地方没什么两样。因此想要使用它最关键的就是使用它的编译器去编译代码。ajc 会构建目标程序与 AspectJ 代码的联系, 在编译期将 AspectJ 代码插入被切出的 PointCut 中,达到 AOP 的目的。
关于 AspectJ 更详细的介绍,可以参考其官网: http://www.eclipse.org/aspectj/
原理概述
对于 Android 系统中的 View,它的点击处理逻辑,都是通过设置相应的 OnClickListener,然后重写相应的方法实现的。 比如对于 Button、ImageView 等控件,它设置的 listener 均是 android.view.View.OnClickListener,然后重写 onClick (android.view.View) 方法。我们只要在其 onClick(android.view.View) 方法中插入埋点代码,即可做到自动埋点。 我们可以把 AspectJ 的处理脚本放到自定义的插件里,之后编写相应的切面类,然后我们再定义合适的 PointCut 用来匹 配我们的织入目标方法,比如 android.view.View.OnClickListener.onClick(android.view.View),最后在编译期间插入埋 点代码,从而就可达到自动埋点的效果。
实现步骤
完整的项目源码后续会 release 给大家。
缺点
• 无法织入第三方的库
• 由于定义的切点依赖编程语言,该方案无法兼容 Lambda 语法
• 会有一些兼容性方面的问题,比如:D8、Gradle 4.x 等
知识点
• AOP
• AspectJ
• Gradle
• Gradle Plugin
• 注解
参考资料
[1] https://www.cnblogs.com/yangyquin/p/5462488.html
[2] http://www.360doc.com/content/11/0414/16/3639038_109610987.shtml
[3] https://www.jianshu.com/p/873eaee38cc1
[4] https://www.jianshu.com/p/aa1112dbebc7
[5] https://deemons.cn/2017/10/16/ 自定义 %20Gradle%20 插件 /
[6] https://blog.csdn.net/Deemons/article/details/78473874
[7] https://github.com/uPhyca/gradle-android-aspectj-plugin
[8] https://github.com/JakeWharton/hugo
[9] https://github.com/HujiangTechnology/gradle plugin android_aspectjx [10] https://www.eclipse.org/aspectj/
注:该内容来自神策数据用户行为洞察研究院出品的《Android 全埋点解决方案》白皮书,查看完整白皮书可点击 《Android 全埋点解决方案》
更多白皮书、报告、干货和案例,可以关注“神策数据”和“用户行为洞察研究院”公众号了解~
以上所述就是小编给大家介绍的《Android 全埋点解决方案之 AspectJ》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Hadoop小文件解决方案-基于文件整合的解决方案
- Hadoop小文件解决方案-基于NameNode内存和MapReduce性能解决方案
- 跨域解决方案
- 异步解决方案---promise
- 前端一键打印解决方案
- MySQL 压缩解决方案(一)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UNIX网络编程 卷1:套接字联网API(第3版)
W.Richard Stevens、Bill Fenner、Andrew M. Rudoff / 杨继张 / 人民邮电出版社 / 2010-6 / 129.00元
这是一部传世之作!顶级网络编程专家Bill Fenner和Andrew M. Rudoff应邀执笔,对W. Richard Stevens的经典作品进行修订。书中吸纳了近几年网络技术的发展,增添了IPv6、SCTP协议和密钥管理套接字等内容,深入讨论了最新的关键标准、实现和技术。 书中的所有示例都是在UNIX系统上测试通过的真实的、可运行的代码,继承了Stevens一直强调的理念:“学习网络......一起来看看 《UNIX网络编程 卷1:套接字联网API(第3版)》 这本书的介绍吧!
HTML 压缩/解压工具
在线压缩/解压 HTML 代码
URL 编码/解码
URL 编码/解码