内容简介: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 压缩解决方案(一)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Practical JavaScript, DOM Scripting and Ajax Projects
Frank Zammetti / Apress / April 16, 2007 / $44.99
http://www.amazon.com/exec/obidos/tg/detail/-/1590598164/ Book Description Practical JavaScript, DOM, and Ajax Projects is ideal for web developers already experienced in JavaScript who want to ......一起来看看 《Practical JavaScript, DOM Scripting and Ajax Projects》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
CSS 压缩/解压工具
在线压缩/解压 CSS 代码